先看一下員工表:
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)
這些即為員工表中不是領導的員工
