获取所有非manager的员工emp_no

题目描述
获取所有非manager的员工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));
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));

方法一:
使用NOT IN选出在employees但不在dept_manager中的emp_no记录
select emp_no from employees where emp_no not in (select emp_no from manager);

方法二:
先使用left join 连接两张表,再从此表中选出dept_no 值为null对应的emp_no记录
select emp_no from (select * from employees left join dept_manager
on employees.emp_no = dept_manager.emp_no) where dept_no is null;

说到这里其实还没完,方法二中加粗的on,当替换成where就一直报错,原因在于使用 left join时on 和 where 的用法区别如下:
1.on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2.where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)。条件不为真的就全部过滤掉。

你可能感兴趣的:(剑指offer,数据库)