一、EXISTS 谓词介绍
谓词是一种特殊的函数,返回值是真值。
谓词逻辑提供谓词是为了判断命题 (可以理解成陈述句) 的真假。例如,我们假设存在“x 是男的”这样的谓词,那么我们只要指定 x 为“小明” 或者“小红”,就能判断命题“小明是男的”“小红是男的”是真命题还是假命题。在关系数据库里,表中的一行数据可以看作是一个命题。
EXISTS 的特殊性在于输入值的阶数(输出值和其他谓词一样,都是真值)。谓词逻辑中,根据输入值的阶数对谓词进行分类。= 或者 BETWEEEN 等输入值为一行的谓词叫作“一阶谓词”, 而像 EXISTS 这样输入值为行的集合的谓词叫作“二阶谓词”。阶(order) 是用来区分集合或谓词的阶数的概念。
二、应用
2.1 查询表中不存在的数据
如下 Meetings 表记录了每次会议到场人员的情况。需要找出没有参加会议的人
方法一:谓词 EXISTS
SELECT
方法二:集合 EXCEPT (MySQL 不支持 EXCEPT 的用法)
SELECT
注意: NOT EXISTS 直接具备了差集的功能
方法三:联结 LEFT JOIN
SELECT
2.2 肯定 = 双重否定
如下 TestScores 表记录了每个学生每门课程的成绩。找出所有课程成绩都高于50分的学生。
方法一:NOT EXISTS
SELECT
方法二:子查询 (自己想的)
SELECT
接下来把条件改得复杂一些,找出数学的分数在 80 分以上且语文的分数在 50 分以上的学生
方法一:EXISTS + CASE WHEN (需要学习)
SELECT
方法二:EXISTS (自己想的)
SELECT
方法三:子查询 (自己想的)
SELECT
方法四:HAVING 子句
SELECT
2.3 集合 VS 谓词
EXISTS 和 HAVING 都是以集合而不是个体为单位来操作数据。因此,两者在很多情况下都是可以互换的。例如,下面 Projects 表中包含了每个项目的 ID, 工程编号 (step_nbr) 以及项目完成情况 (status)。找出工程编号只完成到 1 的项目编号。
方法一:HAVING 子句
SELECT
方法二:EXISTS 谓词
SELECT
方法三:ALL
SELECT
三、练习
3.1 习题1
如下 ArrayTbl2 表中包含每个变量的值,其中 ("key", "i") 是主键。key1 为 A 的行 val 全都是 NULL,key1 为 B 的行中只有 i=1 的行 val 是 3,其他的都是 NULL,key1 为 C 的行 val 全部都是 1。找出 val 全是 1 的 key。
方法一:EXISTS 谓词
SELECT
方法二:HAVING 子句
SELECT
方法三:ALL
SELECT
方法四:GROUP BY
SELECT
3.2 习题二
Numbers 表中有一列 num,num 中包含1 - 100 的整数。在 Number 表中找出全部质数。
SELECT