SQL全称量词使用存在量词替代

SQL全称量词使用存在量词替代

SQL中没有全称量词(for all),但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词。

【例3.62】查询选修了全部课程的学生姓名

SELECT Sname
FROM Student
WHERE NOT EXISTS
  ( SELECT *
    FROM Course
    WHERE NOT EXISTS
      ( SELECT *
        FROM SC
        WHERE Sno = Student.Sno AND Cno = Course.Cno
      )
  );

EXISTS谓词:带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值或逻辑假值。

  • 使用存在量词EXISTS后,若内层查询结果为非空,则外层的WHERE 子句返回真值,否则返回假值。
  • 使用存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE 子句返回真值,否则返回假值。

相关子查询的处理过程:首先取外层查询中表的一个元组,根据它与内层查询相关的属性值,处理内层查询,若WHERE子句返回值为真,则取外层查询中该元组的相应属性值放入结果表;然后再取外层查询表中的下一个元组,重复这一个过程,直至外层表全部检查完为止。

对于本例的理解:首先本例中子查询的查询条件依赖于外层父查询的某个属性值,因此本例也是相关子查询。查询过程应是:

  1. 先从外层Student表中取一个元组,取该学生的Sno,然后进入内一层查询
  2. 取Course中一个元组,取该课程的Cno,再进入最内层查询,
  3. 在SC表中查询,如果该学生的选课表中包含该课程,则外一层WHERE子句返回假值,然后回到步骤2,继续下一个课程的查询,如果该学生的全部课程的WHERE子句都返回假值,则该学生Student表中查询的WHERE子句返回真值,并将该学生的Sname放入结果表中,回到步骤1,继续下一个学生的查询;如果该学生有一个课程的WHERE子句返回真值,则该学生Student表中查询的WHERE子句返回假值,该学生不能放入结果表。
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值