SQL中的NULL

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

<span style="color: #ff0000;">1. 凡是NULL参与的算术表达式(诸如加减乘除)运算结果均为NULL。</span>

postgres=# select 10 + NULL;
 ?column? 
----------
         
(1 row)

postgres=# select 10 - NULL;
 ?column? 
----------
         
(1 row)

postgres=# select 10 * NULL;
 ?column? 
----------
         
(1 row)

postgres=# select 10 / NULL;
 ?column? 
----------
         
(1 row)

postgres=# select 10 % NULL;
 ?column? 
----------
         
(1 row)

<span style="color: #ff0000;">2. 涉及 NULL的任何比较运算的结果都是unknown(既不是is null,也不是is not null)。这创建了除true和false之外的第三个逻辑值。</span>布尔运算中遵循以下逻辑:

  • 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,那么该元组不能被加到结果集中。

<span style="color: #ff0000;">3. 我们可以用is null和is not null来测试空值。</span>

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)

postgres=# select null is not null;
 ?column? 
----------
 f
(1 row)

<span style="color: #ff0000;">4. 某些SQL实现还允许我们使用is unknown和is not unknown来测试一个表达式的结果是否为unknown,而不是true或false。</span>

postgres=# select ( 1 > null ) is unknown;
 ?column? 
----------
 t
(1 row)

postgres=# select ( 1 > null ) is not unknown;
 ?column? 
----------
 f
(1 row)

<span style="color: #ff0000;">5. 如果元组在所有属性上的取值相等,那么它们就被当做相同的元组,即使某些值为空。</span>

这个规则在诸如集合的并、交、查,distinct关键字等很多场景是非常有用的。举个例子:比如表t中有两个元组{('A', null), ('A', null)},那我们认为这两个元组是相同的,如是使用了distinct关键字,则只会保留一行。但需要注意这里对待null的方式与谓词中对待null是不同的,在谓词中“null = null”会返回unknown,而不是true。


赞赏


微信赞赏

支付宝赞赏

添加新评论

选择表情 captcha

友情提醒:不填或错填验证码会引起页面刷新,导致已填的评论内容丢失。

|