SQL中EXCEPT和Not in的區別
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值的行
--DELETEFROM tb1 where id isnull
B、
SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;
SELECT*FROM tb1 WHERE id NOTIN(SELECT id FROM tb2);--得不到任何值
結果:同上A
C、把表tb2的是NULL值的行也刪除
--DELETEFROM tb2 where id isnull
C、
SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;
SELECT*FROM tb1 WHERE id NOTIN(SELECT id
結果:
這是兩張表中都沒有NULL值時,得到的結果;
D、在tb1表中插入一條NULL值
D、
SELECT*FROM tb1 EXCEPTSELECT*FROM tb2;
SELECT*FROM tb1 WHERE id NOTIN(SELECT id FROM tb2);
結果:
以上例子說明:
except會去重複,notin不會(除非你在select中顯式指定)
except用於比較的列是所有列, 除非寫子查詢限制列,notin沒有這種情況
表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 ISNOTNULL);
這裡是需要注意的,如果你的欄位執行為NULL,又欲使用NOT IN那麼就需要這麼做