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

针对牛客网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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值