1. 前言
支撑SQL和关系数据库的基础理论主要有两个:一个是数学领域的集合论;另一个是作为现代逻辑学标准体系的谓词逻辑。本节将重点介绍EXISTS谓词,EXISTS不仅可以将多行数据作为整体来表达高级的条件,而是使用关联子查询时性能任然非常好,这对SQL来说是不可或缺的功能。
SQL采用的是狭义的“一阶谓词逻辑”,这是因为SQL里的EXISTS谓词最高只能接受一阶的实体作为参数。
2. 理论篇
-
什么是谓词
实际上,谓词是一种特殊的函数,返回值是真值。返回值是true,false,unknown
在关系型数据库里,表中的一行数据可以看做是一个命题 -
谓词分类
一介谓词:输入值为一行的谓词(=,between)
二阶谓词:输入值为行的集合(exists)
三阶谓词:输入值为集合的集合
… -
关系数据库中实体的阶层
0阶:行
1阶:表(行的集合)
2阶:表的集合 -
全程量化和存在量化
全称量词:所有的x都满足条件p
存在量词:至少存在一个满足条件p的x
exists谓词实现了谓词逻辑中的存在量词,不过全称量词和存在量词可以互相转换 -
德.摩根定律
所有的X都满足条件P=不存在不满足条件P的X
存在X满足条件P=并非所有的X都不满足条件P
3. 查询表中“不”存在的数据
- Meeting
第1次 | |
---|---|
第1次 | 伊藤 |
第1次 | 水岛 |
第1次 | 坂东 |
第2次 | 伊藤 |
第2次 | 宫田 |
第3次 | 坂东 |
第3次 | 水岛 |
第3次 | 宫田 |
-- 求出缺席者的SQL语句(1):存在量化的应用
SELECT DISTINCT m1.meeting,m2.person
FROM Meetings AS m1 CROSS JOIN Meetings AS m2
WHERE NOT EXISTS (SELECT * FROM Meetings AS m3 WHERE m1.meeting = m3.meeting AND m2.person = m3.person);