我是靠谱客的博主 舒心橘子,这篇文章主要介绍not in 和 not exists的区别,现在分享给大家,希望可以做个参考。

在使用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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部