no in(select deptno from emp)
3 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
SQL> select dname from dept
2 where exists(select * from emp where emp.deptno=dept.deptno)
3 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
而NOT IN一般可以改为NOT EXISTS:
SQL> select dname from dept
2 where deptno not in(select deptno from emp where deptno is not null)
3 /
DNAME
--------------
OPERATIONS
SQL> select dname from dept
2 where not exists(select * from emp where dept.deptno=emp.deptno)
3 /
DNAME
--------------
OPERATIONS
使用NOT EXISTS,即使子查询中包含NULL值,也会得到正确结果。原因是:
select * from emp where dept.deptno=null不会有返回值,这样,EXISTS(select * from emp where dept.deptno=null)返回的布尔值为false,而 NOT(false)显然为TRUE,其他条件与之作and后,依然得到true。
而在NOT IN子句中,是NOT(deptno=null),即NOT(unkown),结果依然为unkown,而unkown被当作false,其他条件与之作and后,最后得到false。
NOT EXISTS(select * from emp where dept.deptno=null) ===>
NOT (false) ===>TRUE
所以子查询中的null不会影响其他的查询结果。
EXISTS可以改为使用表连接语法:
SQL> select dname from dept
2 where exists(select * from emp where emp.deptno=dept.deptno)
3 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
SQL> select