NULL是SQL中一个特殊的值,表示未知,在数据库中显示为空。NULL的字段不管是什么类型一般占一个bit(PostgreSQL中是这样实现的)。SQL标准对于NULL值有以下一些规定(注:基于PostgreSQL讨论,其它数据库可能有差异):

  1. 凡是NULL参与的算术表达式(诸如加减乘除)运算结果均为NULL。

    postgres=# select 10 + NULL;
     ?column? 
    ----------
             
    (1 row)
    
    postgres=# select 10 - NULL;
     ?column? 
    ----------
             
    (1 row)
    
    postgres=# select 10 * NULL;
     ?column? 
    ----------
             
    (1 row)
  2. 涉及 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,那么该元组不能被加到结果集中。

  3. 用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)
  4. 某些SQL实现还允许我们使用is unknownis 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)
  5. 如果元组在所有属性上的取值相等,那么它们就被当做相同的元组,即使某些值为空。这个规则在诸如集合的并、交、查,distinct关键字等很多场景是非常有用的。举个例子:比如表 t 中有两个元组{('A', null), ('A', null)},那我们认为这两个元组是相同的,如是使用了distinct关键字,只会保留一行。但需要注意这里对待null的方式与谓词中对待null是不同的,在谓词中null = null会返回unknown,而不是true。