牛客网数据库SQL实战91题详细剖析(1-10)

针对牛客网90道数据库SQL实战题,作出个人解题思路及题解的整理,不定时持续更新
具体题目来自于牛客网SQL实战模块:牛客题霸-SQL篇

SQL1 查找最晚入职员工的所有信息
解题思路:
将结果集按入职时间降序,用limit限制取第一条记录

SELECT * 
FROM employees 
ORDER BY hire_date DESC LIMIT 1 ;

但问题在于,若最晚入职的员工不止一条,那么此时就不能确定应取的条数,即limit n(从头取n条)、limit m,n(跳过m条,取n条)或limit n offset m(跳过m条,取n条)在此时不适用,那么换一种思路:

SELECT * 
FROM employees
WHERE hire_date=(
	SELECT MAX(hire_date)
	FROM employees
);

这时,若存在多个最晚入职的员工,即可取出多条记录。

SQL2 查找入职员工时间排名倒数第三的员工所有信息
解题思路:
同样地,如果仅仅使用limit,会出现有未知数量的同为入职时间倒数第三员工使应取条数不确定,或倒数第一、二的入职时间对应多个员工,使limit 2,1取到的仅仅是结果集第三条而非真正入职时间倒数第三员工信息的情况:

SELECT * 
FROM employees
ORDER BY hire_date DESC LIMIT 2,1 ;

那么此时的思路就很明朗——使用子查询获取真正在大小上排倒数第三的入职时间,再从employees中取出所有符合条件的所有职工信息,如下:

SELECT * 
FROM employees
WHERE hire_date=(
	SELECT DISTINCT hire_date
	FROM employees
	ORDER BY hire_date DESC LIMIT 2 OFFSET 1
);

重点在于使用了DISTICT去除重复的hire_date,使取到的hire_date为真正的倒数第三,再根据该值取到所有满足条件的员工信息。

SQL3 查找当前薪水详情以及部门编号dept_no
解题思路:需要的数据跨两个表,而且salaries表和dept_manager表都有emp_no字段

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值