支持SQL的基础理论有两个:一个是数学领域的集合论,另一个是作为现代逻辑学标准体系的谓词逻辑(predicate logic),准确地说是“一阶谓词逻辑”,下面将重点介绍EXISTS谓词。
EXISTS不仅可以将多行数据作为整体来表达高级的条件,而且使用关联子查询时性能仍然非常好,这对SQL来说是不可或缺的功能
引入EXISTS这个谓词的目的是为了实现谓词逻辑中“量化”(quantification)这一强大功能
谓词到底是什么?
实际上,谓词是一种特殊的函数,返回值是真值(true、false、unknown)
谓词逻辑提供谓词是为了判断命题(可以理解为陈述句)的真假
从上面的图表中我们可以知道,EXISTS的特殊性在于输入值的阶数(输出值和其他谓词一样,都是真值)。谓词逻辑中,根据输入值的阶数对谓词进行分类。=或者BETWEEN等输入值为一行的谓词叫做“一阶谓词”,而像EXISTS这样输入值为行的集合的谓词叫做”二阶谓词“。阶(order)是用来区分集合或谓词的阶数的概念
-- 求出缺席者的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, Meeings M2
EXCEPT
SELECT meeting, person
FROM meetings;
全称量化
-- 查询所有科目分数都在50分以上的学生
SELECT DISTINCT student_id
FROM TestScores TS1
WHERE NOT EXISTS (SELECT *
FROM TestScores TS2
WHERE TS2.student_id = TS1.student_id
AND TS2.score < 50);