3.6 空值
空值给关系运算带来了特殊的问题,包括算术运算
、比较运算
和集合运算
。
有null的算术表达式结果为null
如果算术表达式的任一输人为空,则该算术表达式结果为空
如果査询中有一个表达式是R.A+5
,并且对于某个特定的元组,R.A
为空,那么对此元组来说,该表达式R.A+5
的结果也为空。
涉及空值的比较
问题更多。因而SQL
将涉及空值
的任何比较运算的结果视为unknown
(既不是谓词is not
,也不是is not null
,我们在本节的后面介绍这两个谓词)。这创建了除true
和false
之外的第三个逻辑值。
and or not元素符与unknown运算的结果
由于在where
子句的谓词中可以对比较结果使用诸如and
、or
和not
的布尔运算,所以这些布尔运算的定义也被扩展到可以处理unknown
值
and
运算符:true and unknown
的结果是unknown
,false and unknown
结果是false
,unknoun and unknow
的结果是unknown
.or
运算符:true or unknown
的结果是unknown
,false or unknown
结果是unknown
,unknown or unknown
结果是unknown
。not
运算符:not unknown
的结果是unknown
.
所以,如果R.A
为空,那么”1<R.A
“和”not(1 < R.A)
“结果都是unknown
。
如果where
子句谓词对一个元组计算出false
或unknown
,那么该元组不能被加入到结果集中。
谓词is null和is not null
SQL
在谓词中使用特殊的关键词null
来表示空值。
使用谓词is null
可以判断一个元素的值是否为空值,反之,使用谓词is not null
可以判断一个元素是否不是空值。
SQL查询 找出instructor
关系中salary
为空值的所有教师
1 | select name |
1 | mysql> select name |
is unknown谓词
某些SQL
实现还允许我们使用子句is unknown
和is not unknown
来测试一个表达式的结果是否为unknown
,而不是true
或false
MySQL不支持is unknown
经过我的测试MySQL
好像不支持is unknown
和is not unknown
这两个谓词。
select distinct中两个null被认为是相等的
当一个查询使用select distinct
子句时,重复元组将被去除。为了达到这个目的,当比较两个元组对应的属性值时,如果这两个值都是非空并且值相等,或者都是空,那么它们是相同的。
注意select distinct
中对待空值的方式与谓词
中对待空值的方式是不同的,在谓词中”null=null
“会返回unknown
,而不是true
。
如果元组在所有属性上的取值相等,那么它们就被当作相同元组,即使某些值为空。集合的并、交和差运算也是如此。
原文链接: 3.6 空值