SQL关于NULL值
NULL值容易产生的问题:
NULL值违反人类逻辑,一个命题的要么是真的,要么是假的,在sql世界中,命题真值还有可能是未知的。这就出现在某一行对应的一个字段为NULL时。为了计算机能够在遇到未知命题能够解决,sql引入了unknown值
下面是unknown值的真值表
正因为sql支持的是“三值逻辑”,所以在sql的世界中,排中律并不成立。
比如有一张存有一个班级学生的姓名与年龄对照表,如果一个学生他的年龄没有在表中存储,则搜索“大于20岁的学生姓名”是有问题的。
因为一些学生你无法通过表搜索到他的年龄。
NULL与 NOT IN的对立
NOT IN 中不要有 NULL值
原因如下
WHERE 字段名 NOT IN (值1,值2,NULL);
等价于
WHERE NOT 字段名 IN (值1,值2,NULL)
等价于
WHERE NOT (字段名=值1 OR 字段名=值2 OR 字段名=NULL)
德*摩根定律:
WHERE NOT(字段名=值1) AND NOT(字段名=值2) AND NOT(字段名=NULL)
等价于
WHERE (字段名=值1) AND (字段名=值2) AND unknown
结果为false或unknown
解决方法
使用EXISTS,因为EXISTS只会返回TRUE或者FALSE
类似的结局也有ALL谓词:
因为ALL最终也被替换成了AND谓词
聚合函数、极值函数和NULL的微妙关系:
极值函数,除COUNT以外的聚合函数会在统计数据时把NULL排除掉。
但当函数的输入为空集的时候,它会返回一个NULL
最后的话:
NULL 不是值,他只是一个缺失的标记。