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

时间:2024-03-23 13:17:07

先看一下员工表:

SELECT * FROM p_emp e 

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

 

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

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

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

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

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

再看:

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

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

这里有返回值

这里的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)

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

这些即为员工表中不是领导的员工