3.6 空值的处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。SQL语言中允许某些元组的某些属性在一定情况下取空值。一般有以下几种情况:
>>该属性应该有一个值,但目前不知道它的具体值。例如,某学生的年龄属性,因为学生登记表漏填了,不知道该学生年龄,因此取空值。
>>该属性不应该有值。例如,缺考学生的成绩为空,因为他没有参加考试。
>>由于某种原因不便于填写。例如,一个人的电话号码不想让大家知道,则取空值。
因此,空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理。
01 空值的产生
例3.79 向SC表中插入一个元组,学生号是“201215126”,课程号是“1”,成绩为空。
insert into SC(Sno,Cno,Grade) values(‘201215126’,’1’,null); /*在插入时该学生还没有考试成绩,取空值*/
或:
insert into SC(Sno,Cno) values(‘201215126’,’1’); /*在插入语句中没有赋值的属性,其值为空值*/
例3.80 将Student表中学生号为“201215200”的学生所属的系改为空值。
update Student set Sdept = null where Sno = ‘201215200’;
另外,外连接也会产生空值,参见3.4.2小节。空值的关系运算也会产生空值。
02 空值的判断
判断一个属性的值是否为空值,用is null或is not null来表示。
例3.81 从Student表中找出漏填了数据的学生信息。
select * from Student where Sname is null or Ssex is null or Sage is null or Sdept is null;
03 空值的约束条件
属性定义(或者域定义)中有not null约束条件的不能取空值,加了unique限制的属性不能取空值,码属性不能取空值。04 空值的算术运算、比较运算和逻辑运算
空值与另一个值(包括另一个空值)的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较运算的结果为unknown。有了unknown后,传统的逻辑运算中二值(true,false)逻辑就扩展成了三值逻辑。and、or、not的真值表如表3.8所示,其中T表示true,F表示false,U表示unknown。
表3.8 逻辑运算符真值表
x |
y |
x and y |
x or y |
not x |
T |
T |
T |
T |
F |
T |
U |
U |
T |
F |
T |
F |
F |
T |
F |
U |
T |
U |
T |
U |
U |
U |
U |
U |
U |
U |
F |
F |
U |
U |
F |
T |
F |
T |
T |
F |
U |
F |
U |
T |
F |
F |
F |
F |
T |
在查询语句中,只有使where和having子句中的选择条件为true的元组才被选出作为输出结果。
例3.82 找出选修1号课程的不及格的学生。
select Sno from SC where Grade < 60 and Cno = ‘1’;
选出的学生是那些参加了考试(Grade属性为非空值)而不及格的学生,不包括缺考的学生。因为前者使条件Grade < 60的值为true,后者使条件的值为unknown。
例3.83 选出选修1号课程的不及格的学生以及缺考的学生。
select Sno from SC where Grade < 60 and Cno = ‘1’ union select Sno from SC where Grade is null and Cno = ‘1’;
或
select Sno from SC where Cno = ‘1’ and (Grade < 60 or Grade is null);