谓词是一种特殊的函数,返回值是真值(true 、false或者unknown)
例如,“= 、< 、> ”等比较谓词,以及between、like 、in 、is null等
在exists的子查询里, select子句的列表可以有下面这三种写法
- 通配符:SELECT *
- 常量:SELECT ‘这里的内容任意’
- 列名:SELECT col
全称量词∀(for All x):所有的x都满足条件P
存在量词∃(there Exists x that):存在满足条件P的x
∀xPx = ¬∃x¬Px(所有的x都满足条件P=不存在不满足条件P的x)
∃xPx = ¬∀x¬Px(存在x满足条件P=并非所有的x都不满足条件P)
因此在SQL中,为了表达全称量化,需要将“所有的行都满足条件P”这样的命题转换成“不存在不满足条件P的行”
查询表中“不”存在的数据
求"没有参加某次会议的人"
思路:先假设所有人都参加了全部会议,并以此生成一个集合,然后从中减去实际参加会议的人
-- 求出缺席者的SQL语句(1):存在量化的应用
select distinct M1.meeting,M2.person
from Meetings M1
cross join Meetings M2
where not exists(
select * from Meetings M3
where M1.meeting=M3.meeting
and M2.person=M3.person
);
-- 求出缺席者的SQL语句(2):使用差集运算
select M1.meeting,M2.person
from Meetings M1,Meetings M2
except
select meeting,person
from Meetings;
全称量化