先看一下员工表:
SELECT * FROM p_emp e
![](https://images2017.cnblogs.com/blog/1176418/201708/1176418-20170817084524537-987173900.png)
例子:查询员工表中不是领导的员工
按正常逻辑思维:SQL语句应该为:
SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp)
![](https://images2017.cnblogs.com/blog/1176418/201708/1176418-20170817084719896-112592710.png)
但是输出结果为空,没有返回值
再看:
SELECT * FROM p_emp e WHERE e.empno IN (SELECT mgr FROM p_emp)
![](https://images2017.cnblogs.com/blog/1176418/201708/1176418-20170817100500881-886379457.png)
这里有返回值
这里的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)
![](https://images2017.cnblogs.com/blog/1176418/201708/1176418-20170817101647100-209562496.png)
这些即为员工表中不是领导的员工