当前位置:   article > 正文

2021-11-04数据库中关于两层套用 not exists实现全称量词查询_嵌套的两个not exists

嵌套的两个not exists

在刚开始学习数据库时会遇到如何理解两层嵌套 not exists 实现全称量词的查询的理解。

例如:

Student : Sno (学号)  Sname(姓名)  Ssex(性别) Sage(年龄) Sdept(系) 

Course :Cno(课程号) Cname(课程名) Cpno(先行课) Ccredit(学分)

SC        :Sno(学号) Cno(课程号) Grade(成绩)

 查询选修了全部课程的学生姓名:

  1. Select Sname
  2. From Student
  3. Where not exists
  4. (select *
  5. From Course
  6. Where not exists
  7. (select *
  8. From SC
  9. Where Sno =Student.Sno AND Cno = Course.Cno)
  10. );

我们首先从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;则这位同学有课程没有修读完成。


以上就是整个过程啦啦啦啦啦啦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/851887
推荐阅读
  

闽ICP备14008679号