NULL是SQL中一个特殊的值,表示未知,在数据库中显示为空。NULL的字段不管是什么类型一般占一个bit(PostgreSQL中是这样实现的)。SQL标准对于NULL值有以下一些规定(注:基于PostgreSQL讨论,其它数据库可能有差异):
凡是NULL参与的算术表达式(诸如加减乘除)运算结果均为NULL。
postgres=# select 10 + NULL; ?column? ---------- (1 row) postgres=# select 10 - NULL; ?column? ---------- (1 row) postgres=# select 10 * NULL; ?column? ---------- (1 row)
涉及 NULL的任何比较运算(不包括is null和is not null)的结果都是unknown。这创建了除true和false之外的第三个逻辑值。布尔运算中遵循以下逻辑:
- and:true and unknown的结果是unknown,false and unknown的结果是false,unknown and unknown的结果是unknown。
- or:true or unknown的结果是true,false or unknown的结果是false,unknown or unknown的结果是unknown。
not:not unknown的结果是unknown。
如果where子句对一个元组计算结果为false或unknown,那么该元组不能被加到结果集中。
用is null和is not null来测试空值。
postgres=# select 5 is not null; ?column? ---------- t (1 row) postgres=# select 5 is null; ?column? ---------- f (1 row) postgres=# select null is null; ?column? ---------- t (1 row)
某些SQL实现还允许我们使用
is unknown
和is not unknown
来测试一个表达式的结果是否为unknown,而不是true或false。postgres=# select ( 1 > null ) is unknown; ?column? ---------- t (1 row) postgres=# select ( 1 > null ) is not unknown; ?column? ---------- f (1 row)
- 如果元组在所有属性上的取值相等,那么它们就被当做相同的元组,即使某些值为空。这个规则在诸如集合的并、交、查,distinct关键字等很多场景是非常有用的。举个例子:比如表 t 中有两个元组
{('A', null), ('A', null)}
,那我们认为这两个元组是相同的,如是使用了distinct关键字,只会保留一行。但需要注意这里对待null的方式与谓词中对待null是不同的,在谓词中null = null
会返回unknown,而不是true。
评论已关闭