先看一下员工表:
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)

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