牛客网数据库SQL实战09—— 获取所有部门当前manager的当前薪水情况

牛客网数据库SQL实战09—— 获取所有部门当前manager的当前薪水情况

题目描述

获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=‘9999-01-01’

CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

输出描述:

dept_no emp_no salary
d001 10002 72527
d004 10004 74057
d003 10005 94692
d002 10006 43311
d006 10010 94409

我的解答

select d.dept_no,d.emp_no,s.salary
from dept_manager d
left join salaries s
on d.emp_no = s.emp_no
where d.to_date='9999-01-01'
and s.to_date='9999-01-01'

题目的意思是如果对应的部门经理有工资的话,就显示出来,没有的话,salary就置为空。所以我使用了左连接。

解析:
内连接是INNERJOIN简写成JOIN,是典型的联接运算,使用像 = 或 <> 之类的比较运算符。包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

外联接除了左右连接外,还有完整外部联接FULL JOIN 或 FULL OUTER JOIN,完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。

我觉得最好的答案

这一题应该用左连接或者右连接查询,其实题目的意思是如果对应的部门经理有工资的话,就显示出来,没有的话,salary就置为空。

SELECT d1.dept_no, d1.emp_no, s1.salary 
FROM dept_manager d1 
LEFT JOIN salaries s1 
ON d1.emp_no = s1.emp_no AND s1.to_date = '9999-01-01' 
WHERE d1.to_date = '9999-01-01';

这个语句的含义是:先执行ON语句筛选出所有部门经理的当前工资,其中d1.emp_no = s1.emp_no指的是在s1表里找到对应的部门经理的工资,但部门经理会有很多工资(会涨薪么),所以再添加一个s1.to_date = ‘9999-01-01’。
至于最后一个d1.to_date = '9999-01-01’是干什么的呢,小伙伴们可能还记得,left join会显示左表的所有数据,那么这个经理离职了也会显示出来(和前面的没有工资可不一样),就比如d005就是这个情况,但现在我们要把它过滤掉,因此需要这个语句;

在这里插入图片描述

发布了175 篇原创文章 · 获赞 58 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/sunbocong/article/details/105483262