针对牛客网90道数据库SQL实战题,作出个人解题思路及题解的整理,不定时持续更新
具体题目来自于牛客网SQL实战模块:牛客题霸-SQL篇
SQL11 获取所有员工当前的manager
解题思路:
理解一下题目的意思,等同于要查询当前员工所在部门的当前领导,并且去除领导为自己的人。又要显示dept_emp中的emp_no,又要显示dept_manager中的emp_no,显而易见最好使用连接查询,再加上WHERE查询条件:
SELECT de.emp_no,dm.emp_no AS manager
FROM dept_emp de JOIN dept_manager dm
ON de.dept_no=dm.dept_no
WHERE a.to_date='9999-01-01' AND b.to_date='9999-01-01' AND de.emp_no<>dm.emp_no
SQL12 获取每个部门中当前员工薪水最高的相关信息
解题思路:
获取的是每个部门中薪水最高的员工信息,涉及到的知识点有分组,和聚合函数,那么自然而然会想到GROUP BY。再看题目,要求的输出内容不仅包含聚合键dept_no、聚合函数max(salary),还包含了非聚合键emp_no。已知使用了GROUP BY的SELECT只能有聚合键、聚合函数以及常数,这是因为往往一个聚合键对应的非聚合键有多个(本题为一个部门号dept_no对应多个员工emp_no),在最后的结果中会随机显示一个非聚合键(emp_no),会导致emp_no对应的并非最大工资的那个员工这样的不匹配问题。同时,也无法得到多个同为最高薪水的员工信息。因此,我们要想办法将非聚合键字emp_no正确显示。
方法一:使用GROUP BY得到部门号和该部门最大salary的对应数据后,利用它和salaries表以及dept_emp表匹配,查询出相应的emp_no。
(同时筛去非当前薪水信息和非当前职员部门信息)
group by后得到:
dept_no | maxSalary |
---|---|
… | … |
… | … |
再和二表匹配:
SELECT d_ms.dept_no,s.emp_no,s.salary
FROM(
SELECT d.dept_no AS dept_no,MAX(salary) AS maxSalary
FROM dept_emp d JOIN salaries s
ON d.emp_no=s.emp_no
WHERE d.to_date='9999-01-01' AND s.to_date='9999-01-01'
GROUP BY d.dept_no
)AS d_ms
JOIN dept_emp d ON d_ms.dept_no=d.dept_no
JOIN salaries s ON d.emp_no=s.emp_no AND d_ms.maxSalary=s.salary
ORDER BY d_ms.dept_no
也可以用select连接:
SELECT d_ms.dept_no,s.emp_no,s