当前位置: 首页 > news >正文

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

结果类似:

SnoSnameCnoGrade
20180006赵明NULLNULL

三、如何判断空值?

不能用 =!=,必须用 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(不确定),规则如下:

运算例子结果
ANDTRUE AND UNKNOWNUNKNOWN
ORFALSE OR UNKNOWNUNKNOWN
NOTNOT UNKNOWNUNKNOWN

实际应用:查询不及格或缺考的学生

-- 方法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

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

在这里插入图片描述

http://www.xdnf.cn/news/767107.html

相关文章:

  • Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数
  • 数据结构之堆:解析与应用
  • 高阶数据结构——并查集
  • vscode 插件 eslint, 检查 js 语法
  • mysql分布式教程
  • 构建高性能风控指标系统
  • AIGC工具平台-GPT-SoVITS-v4-TTS音频推理克隆
  • Arbitrum Stylus 合约实战 :Rust 实现 ERC721
  • Windows 账号管理与安全指南
  • Java后端优化:对象池模式解决高频ObjectMapper实例化问题及性能影响
  • SCAU8639--折半插入排序
  • JS手写代码篇---手写类型判断函数
  • Linux 基础指令入门指南:解锁命令行的实用密码
  • 无他相机:专业摄影,触手可及
  • 【C++高级主题】转换与多个基类
  • 电力系统时间同步系统
  • 玩客云 OEC/OECT 笔记(2) 运行RKNN程序
  • 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——4. 配置服务器终端环境 zsh , oh my zsh, vim
  • 数智管理学(十六)
  • 需求调研文档——日志文件error监控报警脚本
  • CSS强制div单行显示不换行
  • Qt/C++编写GB28181服务端工具/绿色版开箱即用/对标wvp-gb28181/实时画面预览/录像回放下载
  • 百度golang研发一面面经
  • github 提交失败,连接不上
  • 19-剑侠情缘2-2021端魔改版+虚拟单机搭建+高清大屏+视频教程
  • 高效使用Map的“新”方法
  • 用Python开启游戏开发之旅
  • 修改vscode切换上一个/下一个标签页快捷键
  • SpringBoot高校宿舍信息管理系统小程序
  • Java转义字符