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之牛客网刷题的主要内容,如果未能解决你的问题,请参考以下文章

Python牛客网刷题-Day1

牛客网刷题记录 || 第一番

牛客网刷题——JAVA

牛客网刷题(Hw题库)

牛客网刷题知识汇总3

牛客网刷题ACM模式 Objc Swift