初始化兩張表:
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那么就需要這么做