select *
from employees as e
where not EXISTS(
select d.emp_no
from dept_emp as d
where e.emp_no = d.emp_no);

总感觉以前见过EXISTS,但是,查看了自己以前的笔记,没有注意到有这个关键字。

重新学习一下吧。

EISTS关键字

1. (NOT)EXISTS语句形式

-- 查找满足子查询条件的主查询结果
select A, B from table1 
where exists(select C from table2 where table1.id=table2.id);

-- 查找不满足子查询条件的主查询结果
selectt A, B from table1
where not exists (select C from table2 where table1.id=table2.id)

2. (NOT)EXISTS语句实现逻辑

2.1. EXISTS语句逻辑

首先,执行一次外部查询,并缓存结果集,如 SELECT * FROM A

其次,遍历外部查询结果集的每一行记录R,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id

最后,如果子查询有返回结果,则EXISTS子句返回TRUE,这一行R可作为外部查询的结果行,否则不能作为结果

2.2. NOT EXIST语句逻辑

首先,执行一次外部查询,并缓存结果集,如 SELECT * FROM A

其次,遍历外部查询结果集的每一行记录R,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id

最后,如果子查询没有返回结果,则 NOT EXISTS子句返回TRUE,这一行R可作为外部查询的结果行,否则不能作为结果