3.5 空值的处理
空值就是“不知道”或“不存在”或“无意义”的值。SQL语言中允许某些元组的某些属性在一定的情况下取空值。
1. 空值的可能性
(1) 该属性应该有一个值,但目前不知道它的具体值。
(2) 该属性不应该有值。
(3) 由于某种原因不便于填写。
2. 空值的处理
(1) 空值的产生
[例1] 向SC表中插入一个元组,学生号是“201215126”,课程号是“1”,成绩为空。
INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215126','1',NULL);
/*在插入时该学生还没有考试成绩,取空值*/
或
INSERT INTO SC(Sno,Cno)
VALUES('201215126','1');
/*在插入语句中没有赋值的属性,其值为空值*/
[例2] 将Student表中学生号为“2012115200”的学生所属的系改为空值。
UPDATE Student
SET Sdept = NULL
WHERE Sno = ‘2012151200’;
另外,空值的运算关系也会产生空值。
(2) 空值的判断
判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。
[例3] 从Student表中找出漏填了数据的学生信息。
SELECT*
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;
(3) 空值的约束条件
属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值。
(4) 空值的算术运算,比较运算和逻辑运算
空值与另一个值(包括另一个空值)的算是运算的结果为空值,空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN。有了UNKNOWN后,传统的逻辑运算中二值(TRUE,FALSE)逻辑就扩展成了三值逻辑。
在查询语句中,只有使用WHERE和HAVING子句中的选择条件为TRUE的元组才被选出作为输出条件。
[例4] 找出选修1号课程的不及格的学生。
SELECT Sno
FROM SC
WHEREGrade<60 AND Cno='1';
选出的学生是那些参加了考试(Grade属性为非空值)而不及格的学生,不包括缺考的学生。因为前者使条件Grade<60的值为TRUE,后者使条件的值为UNKNOWN。
[例5] 选出选修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 IS NULL OR Grade<60);