题目描述
获取所有非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的含义(必须返回左边表的记录)。条件不为真的就全部过滤掉。