赞
踩
在刚开始学习数据库时会遇到如何理解两层嵌套 not exists 实现全称量词的查询的理解。
例如:
Student : Sno (学号) Sname(姓名) Ssex(性别) Sage(年龄) Sdept(系)
Course :Cno(课程号) Cname(课程名) Cpno(先行课) Ccredit(学分)
SC :Sno(学号) Cno(课程号) Grade(成绩)
查询选修了全部课程的学生姓名:
- Select Sname
- From Student
- Where not exists
- (select *
- From Course
- Where not exists
- (select *
- From SC
- Where Sno =Student.Sno AND Cno = Course.Cno)
- );
我们首先从Student中拿出来一个学生,进入Where的第一层 not exists 中:
作用:可以在Course中查到对应课程的课程号。将课程号循环传递给第二层 not exists 中。
进入第二层 not exists 循环
作用:先是将第一层查询的课程号 和 Student的姓名对应起来,然后看能否在SC中查询到
以上是废话:
重点来了:第一层Course中的每门课程都能在 第二层SC中查询到则
where not exists返回0,(not exists语句查询结果为空,返回真直;查询不为空,返回假值)。
第二层返回是0,则第一层由于第二层返回为空及第一层中的查询结果为0(空),所以上图中的Where not exists 返回1。意思是这位同学所有课程已修。
例如 : 拿出Student中的张三,此时查询语句运行到:
From Student
查询语句进入循环:
Where not exists
(select *
From Course
这是已经查到课程号 1 ,继续查询
Where not exists
(select *
From SC
Where Sno =Student.Sno AND Cno = Course.Cno)
这个时候张三 和 课程号 1 联系起来,在SC中查询。如果查到课程 1 返回 0 给上一层。
然后查询课程号 2 如此往复。直到所有课程都返回为 0 则第一层返回为1 。这位同学的所有课程都
修读完成。否则如果第二层循环有一个没有查询到在 not exists作用下返回 1 ,导致第一层返回
0;则这位同学有课程没有修读完成。
以上就是整个过程啦啦啦啦啦啦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。