SQL 空值的处理

本文最后更新于:2024年3月18日 凌晨

SQL 空值的处理

  • 前面已经多处提到空值(NULL)的概念和空值的处理,这里再系统介绍一下这个问题,所谓空值就是"不知道"或"不存在"或"无意义"的值,SQL语言中允许某些元组的某些属性再一定情况取空值,一般有以下几种情况:
    • 该属性应该有一个值,但目前不知道它的具体值,例如,某学生的年龄属性,因为学生登记表漏填了,不知道该学生年龄,因此取空值。
    • 该属性不应该有值,例如,缺考学生的成绩为空,因为他没有参加考试。
    • 由于某种原因不便于填写,例如,一个人的电话号码不想让大家知道,则取空值。
  • 因此,空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊处理。

空值的产生

[例3.79]:向SC表中插入一个元组,学生号是"201215126",课程号是"1",成绩为空。

1
2
INSERT INTO SC(Sno,Cno,Grade)
VALUES('201215126','1',NULL);/*在插入时该学生还没有考试成绩,取空值*/

或。

1
2
INSERT INTO SC(Sno,Cno)
VALUES('201215126','1');/*在插入语句中没有赋值的属性,其值为空值*/

[例3.80]:将Student表中学生号为"201215200"的学生所属的系改为空值。

1
2
3
UPDATE Student
SET Sdept = NULL
WHERE Sno = '201215200';

另外,外连接也会产生空值,空值的关系运算也会产生空值。

空值的判断

判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。

[例3.81]:从Student表中找出漏填了数据的学生信息。

1
2
3
SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;

空值的约束条件

属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值。

空值的算术运算,比较运算和逻辑运算

空值与另一个值(包括另一个空值)的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN,有了UNKNOWN后,传统的逻辑运算中二值(TRUE,FALSE)逻辑就扩展成了三值逻辑,AND,OR,NOT的真值表如下所示,其中T表示TRUE,F表示FALSE,U表示UNKNOWN

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号课程的不及格的学生。

1
2
3
SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno = '1';

选出的学生是那些参加了考试(Grade属性为非空值)而不及格的学生,不包括缺考的学生,因为前者使条件Grade<60的值为TRUE,后者使条件的值为UNKNOWN

[例3.83]:选出选修1号课程的不及格的学生以及缺考的学生。

1
2
3
4
5
6
7
8
9
10
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);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!