举例:
学校招生
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
这样就可以解决这个问题了