SQL中EXCEPT和Not in的區別?


初始化兩張表:

CREATE TABLE tb1(ID int) 
INSERT tb1          SELECT NULL
UNION  ALL          SELECT NULL
UNION  ALL          SELECT NULL
UNION  ALL          SELECT 1
UNION  ALL          SELECT 2
UNION  ALL          SELECT 2
UNION  ALL          SELECT 2
UNION  ALL          SELECT 3
UNION  ALL          SELECT 4
UNION  ALL          SELECT 4

 

CREATE TABLE tb2(ID int)

INSERT tb2        SELECT NULL

UNION  ALL          SELECT 1

UNION  ALL          SELECT 3

UNION  ALL          SELECT 4

UNION  ALL          SELECT 4

 A:

SELECT * FROM tb1

SELECT * FROM tb2

 

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);--得不到任何值

結果:

B、我先刪除表tb1的是NULL值的行

--DELETE FROM tb1 where id is null

B、

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);--得不到任何值

結果:同上A

C、把表tb2的是NULL值的行也刪除

--DELETE FROM tb2 where id is null

C、

 

 

 

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);

結果:

這是兩張表中都沒有NULL值時,得到的結果;

D、在tb1表中插入一條NULL值

D、

 

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);

結果:

以上例子說明: 

except會去重復, not in 不會(除非你在select中顯式指定)

except用於比較的列是所有列, 除非寫子查詢限制列, not in 沒有這種情況

表tb2中如果有null值的話,not in查詢得不到值(如:A、B)

表tb1中如果有null值,not in不會查詢出這個null值(如:D),而except可以查詢到

當然通過對子查詢指定不為NULL的話,NOT IN自然會得到值,如:

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2 WHERE ID IS NOT NULL);

這里是需要注意的,如果你的字段運行為NULL,又欲使用NOT IN那么就需要這么做


免責聲明!

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



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