1. 关于三值逻辑的理论
1.1. 两种NULL
两种NULL分别指的是“未知的”和“不适用的”,“不知道戴墨镜的人眼睛是什么颜色”,这就是未知的;“不知道冰箱的眼睛是什么颜色”,这就是“不适用”。
总结一下:“未知”指的是“虽然现在不知道,但加上某些条件后可以知道”;“不适用”指的是“无论怎么努力都无法知道”。
1.2. 为什么必须写成"IS NULL" ,而不是"= NULL"
--查询NULL时出错的SQL语句
SELECT *
FROM tbl_A
WHERE col_1=NULL;
对NULL使用比较谓词后得到的结果总是unknown。而查询结果只会包含WHERE子句里判断结果为true的行,不会包含判断结果为false和unkonwn的行。
为什么对NULL使用比较谓词后得到的结果永远不可能为真了?这是因为,NULL既不是值也不是变量,NUL只是表示一个“没有值”的状态,而比较谓词只适用于值。因此,对非值得NULL使用比较谓词本来就没有意义的。
1.3. 第三个真值,unknown
真值unknown和作为NULL的一种的UNKNOWN(未知,NULL的一种)是不同 的东西。前者是明确的布尔型的真值,后者既不是值也不是变量。为了区分,前者采用粗体的小写字母unknown,后者用普通的大写字母UNKNOWN来表示。
--这个是明确的真值的比较
unknown = unknown ——> true
--这个相当于NULL=NULL
UNKNOWN = UNKNOWN; ——>unknown
下面是SQL遵循的三只逻辑的真值表
- 三指逻辑的真值表(NOT)
X | NOT X |
---|---|
t | f |
u | u |
f | t |
- 三值逻辑的真值表(AND)
AND | t | u | f |
---|---|---|---|
t | t | u | f |
u | u | u | f |
f | f | f | f |
- 三值逻辑的真值表(OR)
OR | t | u | f |
---|---|---|---|
t | t | t | t |
u | t | u | u |
f | t | u | f |
注意:
- AND的情况:false>unknown>true
- OR的情况:true>unknown>false.
- 优先级高的真值会决定计算结果。(比如true AND unknown,因为在AND中unknown的优先级更高,所以结果是unknown)
2. 关于三值逻辑的实践
2.1. 比较谓词和NUL:排中律不成立
- Students
name(名字) | age(年龄) |
---|---|
布朗 | 22 |
拉里 | 19 |
约翰 | |
伯杰 | 21 |