exists用法_EXISTS 谓词

39d65cd55399ff9e493f3d3608981c01.png

一、EXISTS 谓词介绍

谓词是一种特殊的函数,返回值是真值。

谓词逻辑提供谓词是为了判断命题 (可以理解成陈述句) 的真假。例如,我们假设存在“x 是男的”这样的谓词,那么我们只要指定 x 为“小明” 或者“小红”,就能判断命题“小明是男的”“小红是男的”是真命题还是假命题。在关系数据库里,表中的一行数据可以看作是一个命题。

EXISTS 的特殊性在于输入值的阶数(输出值和其他谓词一样,都是真值)。谓词逻辑中,根据输入值的阶数对谓词进行分类。= 或者 BETWEEEN 等输入值为一行的谓词叫作“一阶谓词”, 而像 EXISTS 这样输入值为行的集合的谓词叫作“二阶谓词”。阶(order) 是用来区分集合或谓词的阶数的概念。

二、应用

2.1 查询表中不存在的数据

如下 Meetings 表记录了每次会议到场人员的情况。需要找出没有参加会议的人

e30ead3c7054c6b60e40bb7e3eff4a6d.png
表:Meetings

方法一:谓词 EXISTS

SELECT 

方法二:集合 EXCEPT (MySQL 不支持 EXCEPT 的用法)

SELECT 

注意: NOT EXISTS 直接具备了差集的功能

方法三:联结 LEFT JOIN

SELECT 

2.2 肯定 = 双重否定

如下 TestScores 表记录了每个学生每门课程的成绩。找出所有课程成绩都高于50分的学生。

68ee99c126e56b0d77c17f162206836f.png
Table: TestScores

方法一: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 的项目编号。

95291306a6985c8e7d3e6bcd52934d4c.png
Table: Projects

方法一: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。

b971fb25a7c785473c78e860dde2b96a.png
Table: ArrayTbl2

方法一:EXISTS 谓词

SELECT 

方法二:HAVING 子句

SELECT 

方法三:ALL

SELECT 

方法四:GROUP BY

SELECT 

3.2 习题二

Numbers 表中有一列 num,num 中包含1 - 100 的整数。在 Number 表中找出全部质数。

SELECT 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值