1. 题目
-
题目描述
找出所有非部门领导的员工emp_no -
表格
-
所需结果
2. 题解
简单、经典题目,建议深入理解,举一反三。
这题可以使用 JOIN 和 子查询的方式:
1、WHERE 子查询 + IN
# 子查询
SELECT e.emp_no
FROM employees e
WHERE e.emp_no NOT IN (SELECT emp_no FROM dept_manager)
2、JOIN
# JOIN
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager dm
ON e.emp_no = dm.emp_no
WHERE dm.emp_no IS NULL
这里使用 LEFT JOIN **,首选选取了全部了左表内容,使用dept_no
关联右表,最后筛选JOIN
之后的表,选出没有匹配到的部分。
使用 LEFT JOIN
一个错误点:
下面的错误原因是,LEFT JOIN
中 ON
只对”右表“进行限制,因此最终的结果并没有对整张表进行过滤,而是包含了左表所有的内容。
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager dm
ON e.emp_no = dm.emp_no AND dm.emp_no IS NULL
小结
LEFT JOIN
+ IS NULL
基本可以与 WHERE 子查询
+ IN
等价。