数据库not exists 例题分析

数据库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
			)
	);




就好像三重循环一样,不妨在草纸上简单的模拟一下过程。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值