oracle 子查询中null的问题(in 和 not in)

先看一下员工表:

SELECT * FROM p_emp e 

 

例子:查询员工表中不是领导的员工

按正常逻辑思维:SQL语句应该为:

SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp)

但是输出结果为空,没有返回值

再看:

SELECT * FROM p_emp e WHERE e.empno IN (SELECT mgr FROM p_emp)

这里有返回值

这里的in后面的句子可以理解为or拼接,简单举例即

in (9566,9839,null)可以等价于mgr=9566 or mgr=9839 or mgr=null,

not in (9566,9839,null)可以等价于not(mgr=9566 or mgr=9839 or mgr=null)或mgr!=9566 and mgr!=9839 and mgr!=null。

为什么都是or拼接,in可以而not in不可以呢,可以把not in理解为后面的and表达式就知道了,因为mgr=null为null,也就相当于false,导致整个表达式为false,无论传何值都为false,自然无法返回数据。

当发现not in后的子查询后面有null值时,可以在子查询里用is not null或函数过滤null值。

 所以,最后的SQL语句应该为:

SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp WHERE mgr IS NOT NULL)

这些即为员工表中不是领导的员工
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值