1.什么是谓词
何为SQL中的谓词,我们常见的比较(=,<,>)、between、like、in、is null、exist等都是谓词;
我们可以将它看作一种特殊的函数,函数的返回值都是三值逻辑(true、false、unknow),用来判断“命题”的真假;
而这些谓词常用在where子句中,我们可以视其为多个谓词的组合,从“命题”的集合中(表),找出真命题(真值)。
2.谓词的分类
我们按照输入内容进行分类:
输入一行:
输入集合:
这里我们按照输入内容,进行划分:
“一阶谓词”:输入一行,即exists之外的谓词;
“二阶谓词”:输入集合,exists;
“三阶谓词”:输入集合的集合,SQL暂无;
以此类推,“四阶集合”:输入集合的集合的集合,SQL暂无...
这里可以参考一下java中高阶函数的定义:不以一般原子性的值为参数,而以函数为参数的函数;
3.高阶谓词exists的"量化功力"
exists作为SQL目前最高阶的谓词,那么它有什么独到之处呢?
它将多行数据作为一个整体来表达更为高级的条件,这种使用常在关联子查询中,且这种关联子查询的性能也是很好的,这也就是它的的量化功能。
4.exists的实例操作(一)找出没有满勤的人
如下表,记录了学生们上课的考勤记录,到期末开始排查缺勤的学生。
SQL实现:
首先使用笛卡尔积计算出每节课每个学生都不缺勤的记录,然后计算出真实的出勤记录,用not exists进行量化操作。
结果如下:
4.exists的实例操作(二)找出数学>80、语文>70、英语>60的所有学生
用exists必须明白,肯定 = 双重否定
如下表所示,记录了学生每门科目的分数,我们要找出数学>80并且语文>70并且英语>60的学生,评为三好学生...
SQL实现:
结果如下: