理论篇
EXISTS谓词定义
谓词是一种特殊的函数,返回值是真值 。SQL中的真值有3种:True,False,Unknown。
谓词可以按照阶数进行划分:
- 一阶谓词:输入值为一行数据:比如 =
- 二阶谓词:输入值为行的集合:比如EXISTS
- 三阶谓词:输入值为“集合的集合”的谓词
- ……
全称量化和存在量化
- 全称量化:所有的x 都满足条件P”
- 存在量化:存在(至少一个)满足条件P 的x,也就是EXISTS谓词
我们可以用存在量化也就是EXISTS谓词去表示全称量化。
即 所有的x 都满足条件P 等价于 不存在不满足条件P 的x
实践篇
查询不存在的数据
查询没有参加会议的某人
思路如下:假设所有人每场会议都参加了,将这个集合减去现有的集合就是没有参加会议的集合。
首先生成会议和 出席者的集合
Select DISTINCT(m1.meeting,m2.persion)
FROM meeting m1,meeting m2
接着使用EXISTS谓词实现减法
SELECT DISTINCT(m1.meeting,m2.person)
FROM meeting m1,
meeting m2
WHERE NOT EXISTS(
SELECT *
FROM meeting m3
WHERE m1.meeting=m3.meeting
AND m2.person=m3.person
)
全称量化到双重否定
请查询所有科目分数都在50分以上的同学
等价于
请查询不存在科目分数小于50分的同学
SELECT DISTINCT student_id
FROM testscores t1
WHERE NOT EXISTS(
SELECT *
FROM testscores t2
WHERE t1.student_id=t2.student_id
AND t2.score<50
)
接着我们进阶一下,请求出满足下述条件的学生
- 数学的分数在80分以上
- 语文的分数在50分以上
SELECT DISTINCT student_id
FROM testscores t1
WHERE