对SQL 子查询 NOT EXISTS 的一点理解
首先,了解一下NOT EXISTS在子查询中的用法
SELECT … --1号SELECT
FROM table
WHERE NOT EXISTS (
SELECT … --2号SELECT
FROM table
WHERE …
)
要使1号SELECT查询中的WHERE为真,则需要2号SELECT查询结果为空。
接下来看一个例子。
学生表
学生选课表
- 以以下查询语句为例
要求:查询至少选修了学号为“g0940201”的学生所选修的所有课程的学生的学号和姓名。
SELECT S.学号, S.学生姓名 --1号SELECT
FROM [学生] S
WHERE NOT EXISTS (
SELECT * --2号SELECT
FROM [学生选课] A
WHERE A.学号='g0940201'
AND NOT EXISTS (
SELECT * --3号SELECT
FROM [学生选课] B
WHERE S.学号 = B.学号
AND B.课程号 = A.课程号
)
);
在3号SELECT中,查询指定学生A每一个所选课B学生是否也选了,如果选了,3号SELECT有结果,2号SELECT中的WHERE值为假,2号SELECT无查询结果。如果所有课程检测完毕,2号SELECT一直无查询结果,那么1号SELECT中的WHERE值为真,对下一位同学进行检测。如果出现一门课学生A选了,学生B没选,此时3号SELECT无结果,2号SELECT中的WHERE值为真,2号SELECT有查询结果,1号SELECT中的WHERE值将一直为假,直到所有课程检测完毕,对下一位同学进行检测。
状态机
输入队列为A同学所选所有课程,条件为B同学是否选择这门课程。如果以状态2结束,存入查询结果,检测下一位同学,如果以状态3结束,不存入查询结果,直接检测下一位同学。