使用not in 時,要注意null值


當查詢的列中有null值時,不能使用not in

替換成 not exists 和關聯子查詢

CREATE TABLE new_dept(deptno INT);

INSERT INTO new_dept VALUES(10);
INSERT INTO new_dept VALUES(50);
INSERT INTO new_dept VALUES(NULL);

SELECT * FROM new_dept

# 使用 not in 子查詢檢索存在於dept表而不存在與new_dept表的deptno
SELECT * FROM dept
WHERE deptno  NOT IN (SELECT deptno FROM new_dept)

/*
deptno為20、30和40的數據雖然不在new_dept中,卻沒有被上述查詢檢索到。
原因:new_dept中有null值;
in 和 not in 本質上是or運算,由於 null 值參與or運算的方式不同,in 和 not in將會產生不同的結果
*/

#當列表中有null值時使用in
SELECT * FROM dept
WHERE deptno  IN (SELECT deptno FROM new_dept) #結果是10

SELECT * FROM dept
WHERE (deptno=10 OR deptno=50 OR deptno=NULL)  #結果是10

#當列表中有null值時使用not in
SELECT * FROM dept
WHERE deptno  NOT IN (SELECT deptno FROM new_dept) #無結果(結果應該是20,30,40SELECT * FROM dept
WHERE NOT (deptno=10 OR deptno=50 OR deptno=NULL)  #無結果(結果應該是20,30,40)


#在sql中:true or null 的結果是true;false or null的結果是null,一旦混入了null,結果會一直保持為null
1 SELECT * FROM dept d
2  WHERE NOT EXISTS (SELECT NULL FROM new_dept nd WHERE nd.deptno=d.deptno)
3 
4 # exists/not exists 和關聯子查詢一起使用時,子查詢中select列表的項目不重要,重要的是子查詢的條件是TRUE/FALSE

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM