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 不是值,他只是一个缺失的标记。

原文地址:https://www.cnblogs.com/liuguangshou123/p/14373867.html