面向集合的思维编写SQL(7-量化万物的谓词-Exists)

浏览: 1310

1.什么是谓词

何为SQL中的谓词,我们常见的比较(=,<,>)、between、like、in、is null、exist等都是谓词;

我们可以将它看作一种特殊的函数,函数的返回值都是三值逻辑(true、false、unknow),用来判断“命题”的真假;

而这些谓词常用在where子句中,我们可以视其为多个谓词的组合,从“命题”的集合中(表),找出真命题(真值)。


2.谓词的分类

我们按照输入内容进行分类:

输入一行:

image.png

输入集合:

image.png

这里我们按照输入内容,进行划分:

“一阶谓词”:输入一行,即exists之外的谓词;

“二阶谓词”:输入集合,exists;

“三阶谓词”:输入集合的集合,SQL暂无;

以此类推,“四阶集合”:输入集合的集合的集合,SQL暂无...

这里可以参考一下java中高阶函数的定义:不以一般原子性的值为参数,而以函数为参数的函数;


3.高阶谓词exists的"量化功力"

exists作为SQL目前最高阶的谓词,那么它有什么独到之处呢?

它将多行数据作为一个整体来表达更为高级的条件,这种使用常在关联子查询中,且这种关联子查询的性能也是很好的,这也就是它的的量化功能。


4.exists的实例操作(一)找出没有满勤的人

如下表,记录了学生们上课的考勤记录,到期末开始排查缺勤的学生。

image.png

SQL实现:

首先使用笛卡尔积计算出每节课每个学生都不缺勤的记录,然后计算出真实的出勤记录,用not exists进行量化操作。

image.png

结果如下:

image.png


4.exists的实例操作(二)找出数学>80、语文>70、英语>60的所有学生

用exists必须明白,肯定 = 双重否定

如下表所示,记录了学生每门科目的分数,我们要找出数学>80并且语文>70并且英语>60的学生,评为三好学生...

image.png

SQL实现:

image.png

结果如下:

image.png

推荐 0
本文由 Max_Leo 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册