SQL中的NULL


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

<span style="color: #ff0000;">1. 凡是NULL参与的算术表达式(诸如加减乘除)运算结果均为NULL。</span>
<pre class="lang:pgsql decode:true">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)
</pre>
<span style="color: #ff0000;">2. 涉及 NULL的任何比较运算的结果都是unknown(既不是is null,也不是is not null)。这创建了除true和false之外的第三个逻辑值。</span>布尔运算中遵循以下逻辑:
<ul>

<li><strong>and</strong>:true and unknown的结果是unknown,false and unknown的结果是false,unknown and unknown的结果是unknown。</li>
<li><strong>or</strong>:true or unknown的结果是true,false or unknown的结果是false,unknown or unknown的结果是unknown。</li>
<li><strong>not</strong>:not unknown的结果是unknown。</li>

</ul>
如果where子句对一个元组计算除false或unknown,那么该元组不能被加到结果集中。

<span style="color: #ff0000;">3. 我们可以用is null和is not null来测试空值。</span>
<pre class="lang:c decode:true ">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)
</pre>
<span style="color: #ff0000;">4. 某些SQL实现还允许我们使用is unknown和is not unknown来测试一个表达式的结果是否为unknown,而不是true或false。</span>
<pre class="lang:c decode:true ">postgres=# select ( 1 > null ) is unknown;

?column?

t
(1 row)

postgres=# select ( 1 > null ) is not unknown;

?column?

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

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


添加新评论

选择表情 captcha

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

|