not in 和 not exists的区别

博客主要介绍了SQL中使用NOT IN和NOT EXISTS时NULL值的影响。使用NOT IN查询时,若子查询结果含NULL值,可能查不出预期数据,因为NULL值参与OR逻辑运算方式不同。还说明了NOT EXISTS的评估机制,最后提到可用左外连接避免NULL值影响。

在使用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 只能用于关联子查询

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值