#数据库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语句是为了迎合答案。
--------------------------------------------------
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务