数据库系统概论(十四)详细讲解SQL中空值的处理
数据库系统概论(十四)详细讲解SQL中空值的处理
- 前言
- 一、什么是空值?
- 二、空值是怎么产生的?
- 1. 插入数据时主动留空
- 2. 更新数据时设置为空
- 3. 外连接查询时自然出现
- 三、如何判断空值?
- 例子:查“漏填数据的学生”
- 四、空值的约束规则
- 五、空值的运算规则(重点)
- 1. 算术运算(+、-、*、/)
- 2. 比较运算(>、<、=)
- 3. 逻辑运算(AND、OR、NOT)
前言
- 在前几期博客中,我们探讨了 SQL 连接查询,单表查询,嵌套查询,集合查询,基于派生表的查询,数据插入,修改与删除技术等知识点。
- 从本节开始,我们将深入讲解 SQL 中空值的处理的知识点。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
一、什么是空值?
空值(NULL)不是“0”也不是空字符串,它代表 “不知道”“不存在”或“无意义” 的值。
比如:
- 学生的“成绩”还没录入(不知道);
- 男生的“性别”字段填“女”是无意义的,但如果字段不限制,可能填NULL(无意义);
- 某些字段暂时不想填(不便于填写)。
关键提醒:空值是特殊值,不能直接用 =
判断,得用专门的方法处理!
二、空值是怎么产生的?
1. 插入数据时主动留空
比如,学生选了课但还没考试(成绩未知),插入数据时用 NULL
表示:
-- 成绩和教学班未知,用 NULL 占位
INSERT INTO SC(Sno, Cno, Grade, Semester, Teachingclass)
VALUES('20180006', '81004', NULL, '20211', NULL);-- 省略字段时,未指定的字段自动填 NULL
INSERT INTO SC(Sno, Cno, Semester)
VALUES('20180006', '81004', '20211'); -- Grade 和 Teachingclass 自动为 NULL
2. 更新数据时设置为空
比如,学生转专业后暂时未确定新专业,可将原专业清空:
UPDATE Student SET Smajor = NULL WHERE Sno = '20180006';
3. 外连接查询时自然出现
当查询“所有学生及其选课情况”时,没选课的学生在选课相关字段会显示空值:
-- 左外连接,没选课的学生 Cno 和 Grade 为 NULL
SELECT Student.Sno, Sname, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno = SC.Sno;
结果类似:
Sno | Sname | Cno | Grade |
---|---|---|---|
20180006 | 赵明 | NULL | NULL |
三、如何判断空值?
不能用 =
或 !=
,必须用 IS NULL
或 IS NOT NULL
!
例子:查“漏填数据的学生”
SELECT * FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Smajor IS NULL;
- 主码(如学号
Sno
)不允许为空,否则会报错(实体完整性规则)。
四、空值的约束规则
-
非空约束(NOT NULL)
创建表时指定字段不许为空,比如:CREATE TABLE Student (Sno CHAR(8) NOT NULL, -- 学号不许为空Sname VARCHAR(20) NOT NULL,... );
-
主码字段必须非空
主键(如学号、课程号)是唯一标识数据的“身份证”,必须填值,否则违反 实体完整性。- 学生表的
Sno
不能为 NULL; - 选课表
SC
的联合主键(Sno, Cno)
都不能为 NULL。
- 学生表的
五、空值的运算规则(重点)
空值参与运算时,结果往往也是“不确定”的,分三类来看:
1. 算术运算(+、-、*、/)
- 任何值与 NULL 运算,结果都是 NULL。
SELECT 5 + NULL; -- 结果是 NULL(不确定)
2. 比较运算(>、<、=)
- 任何值与 NULL 比较,结果都是 UNKNOWN(既不是真也不是假)。
SELECT * FROM SC WHERE Grade < 60;
- 成绩为 NULL 的学生(缺考)不会被这条语句查到,因为
NULL < 60
是 UNKNOWN。
3. 逻辑运算(AND、OR、NOT)
引入三值逻辑:TRUE
(真)、FALSE
(假)、UNKNOWN
(不确定),规则如下:
运算 | 例子 | 结果 |
---|---|---|
AND | TRUE AND UNKNOWN | UNKNOWN |
OR | FALSE OR UNKNOWN | UNKNOWN |
NOT | NOT UNKNOWN | UNKNOWN |
实际应用:查询不及格或缺考的学生
-- 方法1:用 UNION 合并两种情况
SELECT Sno FROM SC WHERE Grade < 60 AND Cno = '81001'
UNION
SELECT Sno FROM SC WHERE Grade IS NULL AND Cno = '81001';-- 方法2:用 OR 直接判断
SELECT Sno FROM SC
WHERE Cno = '81001' AND (Grade < 60 OR Grade IS NULL);
以上就是这篇博客的全部内容,下一篇我们将继续探索更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的数据库系统概论专栏
https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |