数据库系统概论(十四)详细讲解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 NULLIS NOT NULL

例子:查“漏填数据的学生”

SELECT * FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Smajor IS NULL;
  • 主码(如学号 Sno)不允许为空,否则会报错(实体完整性规则)。

四、空值的约束规则

  1. 非空约束(NOT NULL)
    创建表时指定字段不许为空,比如:

    CREATE TABLE Student (
      Sno CHAR(8) NOT NULL,  -- 学号不许为空
      Sname VARCHAR(20) NOT NULL,
      ...
    );
    
  2. 主码字段必须非空
    主键(如学号、课程号)是唯一标识数据的“身份证”,必须填值,否则违反 实体完整性

    • 学生表的 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

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

你可能感兴趣的:(#,数据库系统概论,数据库,sql,android)