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

在刚开始学习数据库时会遇到如何理解两层嵌套 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;则这位同学有课程没有修读完成。


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

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值