查询至少选修了学生200215122选修的全部课程的学生号码
解体思路 如果有一门课学生200215122选了而另一个同学没选就不输出这个学生好吗
即不存在一个课程Y,同学200215122选了 而同学X没选
代码如下
SELECT DISTINCT
sno
FROM
SC AS SCX
WHERE
NOT EXISTS (
SELECT
*
FROM
SC AS SCY
WHERE
SCY.sno = '200215122'
AND NOT EXISTS ( SELECT * FROM SC AS SCZ WHERE SCY.cno = SCZ.cno AND SCX.sno = SCZ.sno )
) ;
- 分析代码
- 假设同学200215122为学生小明选了课程1和3
- 最内层的查询逻辑是如果X同学和小明选了同一门课返回非空而not exists检测到非空返回false
WHERE SCY.sno = '200215122' AND NOT EXISTS ( SELECT * FROM SC AS SCZ WHERE SCY.cno = SCZ.cno AND SCX.sno = SCZ.sno )
这条语句就是false 不会查询到值- 而如果有一门课小明选了 X没选 最内层的查询就会返回空 NOT EXISTS检测结果集为空返回true
SELECT * FROM SC AS SCY WHERE SCY.sno = '200215122' AND NOT EXISTS ( SELECT * FROM SC AS SCZ WHERE SCY.cno = SCZ.cno AND SCX.sno = SCZ.sno ) ) ;
因此中间的查询语句就会查询到这个课程Y 是 小明选了 但是X没选到 把他返回
第一层的NOT EXISTS 检测到结果集为非空返回 false 把X同学就排除掉了
所以 这全部的逻辑就是 找出一个小明同学选的课而X同学没选到 找得出就说明X同学不是我们要找到 找不出就打印X同学的好吗