概述
对NULL使用比较谓词后得到的结果总是unknown,因为NULL既不是值也不是变量。NULL只是一个表示“没有值”的标记,而比较谓词只适用于值。因此,对并非值的NULL使用比较谓词本来就是没有意义的
三值逻辑的真值表
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
优先级高的真值会决定计算结果
注意:
-
比较谓词和NULL(1):排中律不成立(排中律就是指不认可中间状态,对命题真伪的判定黑白分明)
-
比较谓词和NULL(2):CASE表达式和NULL
-- 错误写法 CASE col WHEN 1 THEN 'O' WHEN NULL THEN 'x' END -- 正确写法 CASE WHEN col = 1 THEN 'O' WHEN col IS NULL THEN 'X' END -- 这种错误很常见,其原因是将NULL误解成了值,一定要牢记“NULL并不是值”
-
NOT IN 和 NOT EXISTS不是等价的
如果NOT IN子查询中用到的表里被选择的列中存在NULL,则SQL语句整体的查询结果永远是空;
EXISTS谓词永远不会返回unknown,只会返回true或false
-
限定谓词和NULL
SQL中有ALL和ANY两个限定谓词。因为ANY和IN是等价的,所以我们不常使用ANY,那么我们主要看一下更常用的ALL的一些注意事项:
ALL可以与比较谓词一起使用,用来表达"与所有的xxx都相等",或"比所有的xxx都大"的意思
-- 查询比B班住在东京的所有学生年龄都小的A班学生 SELECT * FROM Class_A WHERE age < ALL (SELECT age FROM Class_B WHERE city = '东京');
注意: ALL谓词其实是多个以AND连接的逻辑表达式的省略写法
-
限定谓词和极值函数不是等价的(回归书本理解)
-- 用极值函数改写上述代码 SELECT * FROM Class_A WHERE age < (SELECT MIN(age) FROM Class_B WHERE city = '东京') -- 即使age的数据中有NULL也没有关系,因为极值函数会在统计时把为NULL的数据排除掉
注意:极值函数在输入为空表(空集)时会返回NULL
- 聚合函数和NULL
最后
以上就是故意爆米花为你收集整理的三值逻辑和NULL的全部内容,希望文章能够帮你解决三值逻辑和NULL所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复