3.6 空值

3.6 空值

空值给关系运算带来了特殊的问题,包括算术运算比较运算集合运算

有null的算术表达式结果为null

如果算术表达式的任一输人为空,则该算术表达式结果为空
如果査询中有一个表达式是R.A+5,并且对于某个特定的元组,R.A为空,那么对此元组来说,该表达式R.A+5的结果也为空。

涉及空值的比较问题更多。因而SQL将涉及空值的任何比较运算的结果视为unknown(既不是谓词is not,也不是is not null,我们在本节的后面介绍这两个谓词)。这创建了除truefalse之外的第三个逻辑值。

and or not元素符与unknown运算的结果

由于在where子句的谓词中可以对比较结果使用诸如andornot的布尔运算,所以这些布尔运算的定义也被扩展到可以处理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子句谓词对一个元组计算出falseunknown,那么该元组不能被加入到结果集中。

谓词is null和is not null

SQL在谓词中使用特殊的关键词null来表示空值。
使用谓词is null可以判断一个元素的值是否为空值,反之,使用谓词is not null可以判断一个元素是否不是空值。

SQL查询 找出instructor关系中salary为空值的所有教师

1
2
3
select name
from instructor
where salary is null;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> select name
from instructor
where salary is null;
Empty set

mysql> select name
from instructor
where salary is not null;
+------------+
| name |
+------------+
| Srinivasan |
| Wu |
| Mozart |
| Einstein |
| El Said |
| Gold |
| Katz |
| Califieri |
| Singh |
| Crick |
| Brandt |
| Kim |
+------------+
12 rows in set

is unknown谓词

某些SQL实现还允许我们使用子句is unknownis not unknown来测试一个表达式的结果是否为unknown,而不是truefalse

MySQL不支持is unknown

经过我的测试MySQL好像不支持is unknownis not unknown这两个谓词。

select distinct中两个null被认为是相等的

当一个查询使用select distinct子句时,重复元组将被去除。为了达到这个目的,当比较两个元组对应的属性值时,如果这两个值都是非空并且值相等,或者都是空,那么它们是相同的
注意select distinct中对待空值的方式与谓词中对待空值的方式是不同的,在谓词中”null=null“会返回unknown,而不是true
如果元组在所有属性上的取值相等,那么它们就被当作相同元组,即使某些值为空。集合的并、交和差运算也是如此。