在使用not in时,要注意NULL值。
当试着使用 NOT IN 子句查询检索存在于 DEPT表却不存在于NEW_DEPT表的DEPTNO ,会出现查不出数据。
select *
from dept
where deptno not in (select deptno from new_dept)
deptno 为20、30和40的数据虽然不在new_dept表中,却没有被查询到。原因是在new_dept表中存在NULL中。子查询会返回3行DEPTNO,分别为10、50和NULL值。IN和NOT IN 本质上是OR运算,由于NULL值参与OR逻辑运算的方式不同,IN和NOT IN 将会产生不同的结果。
使用not in 和使用 not exists时 null值的影响
select *
from dept
where deptno not in
(select emp.deptno from emp where emp.deptno is not null);
select *
from dept
where not exists (select null from emp where emp.deptno = dept.deptno);
上述查询语句遍历并评估dept表的每一行。针对每一行,会有:
执行子查询并检查当前的部门编号是否存在于emp表。通过 deptno将俩个表关联起来。
子查询有结果返回给外层查询,那么exists的评估结果是true,这样not exists就是false,外层子查询就会舍弃当前行。
子查询没有返回结果,那么not exists()就返回true。外查询就会返回当前行。
select列表项中的列表不重要,就看是否有记录。
总结:
当使用谓词IN以及执行OR逻辑运算的时候,一定要注意是否会涉及到NULL。
也可以使用左外连接去避免null值的影响
left join 取出的是坐标中的所有数据,其中与右表不匹配的就表示not in 右表。所以在left join 加上条件 is null 。
select dept.*
from dept
left join emp
on emp.deptno = dept.deptno
where emp.deptno is null
exists 只能用于关联子查询
最后
以上就是舒心橘子最近收集整理的关于not in 和 not exists的区别的全部内容,更多相关not内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复