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子句返回假值,该学生不能放入结果表。
发布了75 篇原创文章 · 获赞 0 · 访问量 2066

猜你喜欢

转载自blog.csdn.net/nuts_and_bolts/article/details/104948773