SQL之牛客网刷题
Posted 阿井井w
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL之牛客网刷题相关的知识,希望对你有一定的参考价值。
Q18:请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成
-- 方法一 select s.emp_no, s.salary, e.last_name, e.first_name from salaries s join employees e on s.emp_no = e.emp_no where s.salary = -- 第三步: 将第二高工资作为查询条件 ( select max(salary) -- 第二步: 查出除了原表最高工资以外的最高工资(第二高工资) from salaries where salary < ( select max(salary) -- 第一步: 查出原表最高工资 from salaries where to_date = \'9999-01-01\' ) and to_date = \'9999-01-01\' ) and s.to_date = \'9999-01-01\' -- 方法二 select s.emp_no, s.salary, e.last_name, e.first_name from salaries s join employees e on s.emp_no = e.emp_no where s.salary = ( select s1.salary from salaries s1 join salaries s2 -- 自连接查询 on s1.salary <= s2.salary group by s1.salary -- 当s1<=s2链接并以s1.salary分组时一个s1会对应多个s2 having count(distinct s2.salary) = 2 -- (去重之后的数量就是对应的名次) and s1.to_date = \'9999-01-01\' and s2.to_date = \'9999-01-01\' ) and s.to_date = \'9999-01-01\'
方法二详解:
表自连接以后:
当s1<=s2链接并以s1.salary分组时一个s1会对应多个s2
对s2进行去重统计数量, 就是s1对应的排名
Q19:三表连接:请你查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
正确方法: select e.last_name,e.first_name,d.dept_name from (employees e left join dept_emp de on e.emp_no = de.emp_no) left join departments d on d.dept_no = de.dept_no
第一步,将员工表employees与员工-部门关系表dept_emp进行外连接left join,连接条件是员工编号对应,这样得到的连表包含所有的员工信息+对应的部门编号信息(如果员工未分配部门,则按照外连接规则,默认填写null);
第二步,将第一步中得到的连表,与部门信息表departments进行外连接,连接条件是部门编号对应,这样得到的新的连表即包含题目要求的所有记录。
(q1:请教一下 那第一步里 未分配部门的员工 ,他的 部门号 dept_no 是 null 的呀,第二步怎么会有 部门名 会去匹配呢 departments表 不允许dept_no是null 值啊 为什么第二步完了部门名会是 nulll值啊?
回答:如果是null的话,就匹配不到,返回就是直接按照匹配不到进行返回,所以是左连接,所以第二个连接也要用左连接而不是inner join)
错误方法: select e.last_name,e.first_name,d.dept_name from employees e left join dept_emp de on e.emp_no = de.emp_no left join departments d on d.dept_no = de.dept_no 必须要加括号,先把employees和dept_emp联结成一张表,再和departments连接
以上是关于SQL之牛客网刷题的主要内容,如果未能解决你的问题,请参考以下文章