1-3 三值逻辑和NULL
SQL 布尔型-true false unknown
真值优先级
and:false > unknown > true
or : true > unknown > false
null 不是值,不能对其使用谓词(is null)
01 排中律不成立
排中律不成立: 把命题和它的否命题通过“或者”连接而成的命题全部都是真命题(古典逻辑学)
/* 添加第3个条件:年龄是20岁,或者不是20岁,或者年龄未知 */
SELECT *
FROM Students
WHERE age = 20
OR age <> 20
OR age IS NULL;
02 CASE 表达式和NULL
CASE WHEN col_1 =1 THEN 'o'
WHEN col_1 IS NULL THEN 'x'
END
03 NOT IN 和 NOT EXISTS 不等价
/* 查询与B班住在东京的学生年龄不同的A班学生的SQL语句? */
SELECT *
FROM Class_A
WHERE age NOT IN ( SELECT age
FROM Class_B
WHERE city = '东京' );
/* 正确的SQL语句:拉里和伯杰将被查询到 */
SELECT *
FROM Class_A A
WHERE NOT EXISTS ( SELECT *
FROM Class_B B
WHERE A.age = B.age
AND B.city = '东京' );
限定谓词和NULL
all 可以和比较谓词一起使用,用来表达“与所有的xx都相等”,“与所有的xx都大”的意思。
/* 查询比B班住在东京的所有学生年龄都小的A班学生 */
SELECT *
FROM Class_A
WHERE age < ALL ( SELECT age
FROM Class_B
WHERE city = '东京' );
限定谓词和极值函数不对等
/* 查询比住在东京的学生的年龄最小的学生还要小的A班学生的SQL语句? */
SELECT *
FROM Class_A
WHERE age < ( SELECT MIN(age)
FROM Class_B
WHERE city = '东京' );
使用极值函数 在统计时会吧NULL的数据排除掉。
比较对象原本不存在时,根据业务方需求需要返回空集时,需要使用all谓词,或者使用COALESCE 函数将极值函数返回的NULL处理成合适的值。
聚合函数和NULL
/* 查询比住在东京的学生的平均年龄还要小的A班学生的SQL语句? */
SELECT *
FROM Class_A
WHERE age < ( SELECT AVG(age)
FROM Class_B
WHERE city = '东京' );
没有住在东京的学生,AVG函数返回NULL。因此,外侧的where子句永远都是unknown