牛客网SQL-第九题-获取所有非manager的员工emp_no
往期SQL:
牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况
牛客网SQL-第7题-请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
牛客网SQL-第4题-请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示
牛客网SQL-第二题-请你查找employees里入职员工时间排名倒数第三的员工所有信息
牛客网-SQL题库第一题-解答
现在进入第10题:
题目描述:
有一个员工表employees简况如下:
有一个部门领导表dept_manager简况如下:
创建语句:
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
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`));
题目要求:
请你找出所有非部门领导的员工emp_no,以上例子输出:
解析与理解
献上解题源码:
select emp_no
from employees
where emp_no not in(
select emp_no
from dept_manager
)
这是我最先解题方法, 就是子查询
- 先通过领导表查出领导员工的no号
- 再通过大员工表查不包含领导no的的员工no号
但是我过了一段时间, 在做这个题目的时候, 不想用原来的方法, 所以用了多表查询的左查询
左查询的源码:
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager d
ON e.emp_no = d.emp_no
WHERE dept_no IS NULL;
左查询:
- 把大员工表作为左表(员工表肯定比领导表人员多, 因为领导也属于员工), 领导表作为右表
- 这样连接后, 因为领导少, 所以会有一些null出现
- 出现null的列就是纯粹员工表,所以只要赛选出是null的就行.
理解与解析:
1.子查询中in (not in) 后面接多个字段, 本文中领导的emp_no不止一个, 所以是用not in, 如何能够确定是一个, 也可以用"=", 但是, “=” 后面解的字段只能是一个, 不然会错误
2. 在外连接(包含有左查询与右查询等)中, 以主表为准, 副表未有字段会以null代替, 副表多出字段不会查询到的, 所有考虑好主表与左右连接