数据库not exists 例题分析
查询选修了所有课程的学生姓名
SC表(Sno是学生号,Cno是课程号)
+-----------+-----+-------+
| Sno | Cno | Grade |
+-----------+-----+-------+
| 201215121 | 1 | 92 |
| 201215121 | 2 | 85 |
| 201215121 | 3 | 88 |
| 201215122 | 2 | 90 |
| 201215122 | 3 | 80 |
+-----------+-----+-------+
Student表
+-----------+--------+------+------+-------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----------+--------+------+------+-------+
| 201215121 | 李勇 | 男 | 20 | CS |
| 201215122 | 刘晨 | 女 | 19 | CS |
| 201215123 | 王敏 | 女 | 18 | MA |
| 201215125 | 张立 | 男 | 19 | IS |
+-----------+--------+------+------+-------+
Course表
+-----+--------------+------+---------+
| Cno | Cname | Cpno | Ccredit |
+-----+--------------+------+---------+
| 1 | 数据库 | 5 | 4 |
| 2 | 数学 | NULL | 2 |
| 3 | 信息系统 | 1 | 4 |
| 4 | 操作系统 | 6 | 3 |
| 5 | 数据结构 | 7 | 4 |
| 6 | 数据处理 | NULL | 2 |
| 7 | PASCAL语言 | 6 | 4 |
+-----+--------------+------+---------+
此时,查询涉及到
三个表
。查询方式如下:
select Sname
from Student
where not exists // (对于某个Sname) //收到true 则表明没有未选的课,记录该学生,为false则(有一门或多门未选)不记录
(
//(本质,第二层记录的就是某学生的未选课程)收到返回的false则不记录,继续进行本层循环(到最后也没有则返回true),
//收到true记录当前记录(本质也就是当前课没有选)则向上返回false,
select *
from Course
where not exists // (对于某个Cno)
(
select * //此块查询的内容是,对于上层的Sname同学,是否有选择的课程,有则向上返回false,结束本层循环,
//否则继续(到最后也没有找到则返回true)
from SC
where Sno=Student.Sno and Cno=Course.Cno
)
);
就好像三重循环一样,不妨在草纸上简单的模拟一下过程。
版权声明:本文为qq_43762247原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。