问题
从一张表中检索没有出现在另一张表中的值。例如,你想找出 DEPT 表中都有哪些部门没有出现在 EMP 表中。
解决方案
计算差集的函数很有用。DB2、PostgreSQL、SQL Server 和 Oracle 都支持差集运算。注意: MySQL 解决方案为使用子查询,具有普适性。
DB2、PostgreSQL 和 SQL Server
使用集合运算 EXCEPT。
select deptno from dept
except
select deptno from emp
Oracle
使用集合运算 MINUS。
select deptno
from dept
minus
select deptno
from emp;
MySQL
使用子查询将 EMP 表中所有的 DEPTNO 都返回给外部查询,而外部查询在 DEPT 表中查找 DEPTO 没有出现在子查询返回结果中的行。
select deptno
from dept
where deptno not in (select deptno from emp)
扩展
使用 MySQL 解决方案时,必须考虑消除重复行的问题。示例中,DEPTNO 是主键,因此在 DEPT 表中不会重复。其他情况可参考下面扩展方法。
select d.deptno
from dept d
where not exists(
select deptno
from emp e
where d.deptno = e.deptno
)
在 SQL 中,TRUE or NULL 的结果为 TRUE,但 FALSE or NULL 的结果为 NULL!使用谓词 IN 或执行逻辑 OR 运算时,如果涉及 NULL 值,务必牢记这一点。
点个赞吧,这对我非常重要!