舉例:
學校招生
good_name表 爲特招名單,
stu_score表爲此次考試成績.
錄取分數大於80且不在特招名單的人.
數據如下:
SELECT * FROM good_name
SELECT * FROM stu_score
按要求用not in的話是這麼寫
SELECT name FROM stu_score
where name not in (SELECT name FROM good_name) and score > 80
結果卻不是我們想要的
單獨查子查詢看看數據
SELECT name FROM good_name
數據能正常訪問。
而問題在這個 not in 和 null上。
原sql可以解析爲
SELECT name FROM stu_score
where not (name =‘張三’ or name='李四' or name=null) and score > 80
當name 爲王五的時候 代入
SELECT name FROM stu_score
where not (false or false or null) and score > 80
即
由於 false or null = null null 取反也是null
SELECT name FROM stu_score
where null and score > 80
所以查出無記錄
所以遇到這個問題 可以用 NOT EXISTS
SELECT name FROM stu_score
WHERE NOT EXISTS (SELECT 1 FROM good_name WHERE good_name.name=stu_score.name) AND score > 80
這樣就可以解決這個問題了