我的个人主页,欢迎来阅读我的其他文章
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
表示:
-- 成绩和教学班未知,用 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
比如,学生转专业后暂时未确定新专业,可将原专业清空:
UPDATE Student SET Smajor = NULL WHERE Sno = '20180006';
当查询“所有学生及其选课情况”时,没选课的学生在选课相关字段会显示空值:
-- 左外连接,没选课的学生 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。空值参与运算时,结果往往也是“不确定”的,分三类来看:
SELECT 5 + NULL; -- 结果是 NULL(不确定)
SELECT * FROM SC WHERE Grade < 60;
NULL < 60
是 UNKNOWN。引入三值逻辑: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
非常感谢您的阅读,喜欢的话记得三连哦 |