#数据库SQL实战#【Day3】

--------------------------------------------------
学习用,欢迎讨论。
--------------------------------------------------
查看详细题目的方法:
复制以下题目内容;
Ctrl+F查找刚刚复制的题目即可。
--------------------------------------------------
题目9:获取所有部门当前manager的当前薪水情况
select dm.dept_no, dm.emp_no, s.salary
from dept_manager as dm inner join salaries as s
on dm.emp_no = s.emp_no
where dm.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
按照题意连接两个表,“当前”manager和“当前”薪水分别通过“dm.to_date = '9999-01-01'”和“s.to_date = '9999-01-01'”进行限制。
--------------------------------------------------
题目10:获取所有非manager的员工emp_no
select emp_no from employees
where emp_no not in (
select emp_no from dept_manager)
这是最直接的做法,选择表employees的emp_no,其中这些emp_no没有出现在表dept_manager的emp_no字段。
另有做法如下:
select e.emp_no 
from employees as e left join dept_manager as dm
on e.emp_no = dm.emp_no
where dm.emp_no is null
使用left join连接两张表,此时左表的记录都会被选取,那么非manager员工就是dm.emp_no字段为空的记录,manager员工的dm.emp_no字段就是自己的emp_no。
还看到有同学使用集合运算的思想:except——集合差、union——集合并、intersect——集合交。如下代码通过了测试:
select e.emp_no from employees as e
except
select dm.emp_no from dept_manager as dm
--------------------------------------------------
题目11:获取所有员工当前的manager
select e.emp_no, m.emp_no as manager_no
from dept_emp e left join dept_manager m
on e.dept_no = m.dept_no
where e.emp_no != m.emp_no
and e.to_date = '9999-01-01'
and m.to_date = '9999-01-01'
由于要获取所有员工的情况,使用left join通过dept_no字段连接两张表,通过条件“e.emp_no != m.emp_no”排除manager就是自己的情况,同时考虑“当前”的要求。
--------------------------------------------------
题目12:获取所有部门中当前员工薪水最高的相关信息
我一开始写了如下代码,通过了测试:
select d.dept_no, d.emp_no, max(s.salary) as salary
from dept_emp as d inner join salaries as 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
另有如下两段代码均通过测试。
代码一:
select d.dept_no, d.emp_no, s.salary
from dept_emp as d inner join salaries as 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
having max(s.salary)
代码二:
select d.dept_no, d.emp_no, s.salary
from dept_emp as d inner join salaries as s
on d.emp_no = s.emp_no
where d.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
and s.salary = (select max(s2.salary)
    from dept_emp as d2 inner join salaries as s2
    on d2.emp_no = s2.emp_no
    where d2.to_date = '9999-01-01'
    and s2.to_date = '9999-01-01'
    and d2.dept_no = d.dept_no)
order by d.dept_no
关于前两个,大家讨论的焦点在于“聚合函数的对应问题”,我之前一直没有注意。至于结论我也要再探索探索。【Mark】(同时考虑题目7)
第三个通过子查询肯定不会出现是否对应的问题,同时在有多个最高工资的时候都能查找出来。至于order by语句是为了迎合答案。
--------------------------------------------------
全部评论

相关推荐

不愿透露姓名的神秘牛友
10-12 10:48
已编辑
秋招之苟:邻居家老哥19届双2硕大厂开发offer拿遍了,前几天向他请教秋招,他给我看他当年的简历,0实习实验室项目技术栈跟开发基本不沾边😂,我跟他说这个放在现在中厂简历都过不了
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务