#### 3.3.4.6 处理 NULL 值
在你习惯之前, `NULL` 值可能会让你感到惊讶. 从概念上讲, `NULL` 意味着“丢失的未知值”, 它的处理方法与其他值有些不同.
对 `NULL` 进行测试, 使用 [`IS NULL`](https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_is-null) 和 [`IS NOT NULL`](https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_is-not-null) 操作符, 如下所示:
```sql
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
```
不能使用算术比较运算符, 比如 [`=`](https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal), [`<`](https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_less-than), 或者 [`<>`](https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_not-equal) 来测试 `NULL`. 演示这个, 尝试以下查询:
```sql
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
```
因为任何与 `NULL` 的算术运算符比较的结果也是 `NULL`, 所以你不能从这样的比较中获得任何有意义的结果.
在 MySQL 中, `0` 或者 `NULL` 是 false 并且其他任何值都是 true. 布尔运算默认真值为 `1`.
`NULL` 的特殊处理就是为什么在前一节中, 必须使用 `death IS NOT NULL` 而不是 `death <> NULL` 来确定哪些动物已经死亡.
在 `GROUP BY` 中, 两个 `NULL` 值就被认为是相等的.
当执行 `ORDER BY` 时, 如果你执行 `ORDER BY ... ASC`, `NULL` 值将排在首位, 如果你执行 `ORDER BY ... DESC` 将排在末尾.
在处理 `NULL` 值是, 一个常见的错误是假设不可能将 0 或者空值插入到定义为 `NOT NULL` 的列中, 但事实并非如此. 它们实际上是值, 而 `NULL` 的意思是 “没有值”. 你可以使用 `IS NOT NULL` 很容易进行测试, 如下所示:
```sql
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+
```
因此完全有可能将0或者空字符串插入到 `NOT NULL` 列中, 因为这些列实际上是 `NOT NULL`. 参阅 [`Section B.4.4.3, “NULL 值得问题”`](https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html).
- 简介
- 前言和法律条款
- 安装和更新 MySQL
- 在 Linux 上安装 MySQL
- 在 Linux 上使用 APT 库安装 MySQL
- 在 Linux 上使用 Docker 部署 MySQL
- 使用 Docker 部署 MySQL 服务器的基本步骤
- 使用 Docker 部署 MySQL 服务器的更多主题
- 教程
- 连接到服务器和从服务器断开
- 输入查询
- 创建和使用数据库
- 创建和选择数据库
- 创建表
- 将数据加载到表中
- 从表中检索数据
- 选择所有数据
- 选择特定行
- 选择指定列
- 行排序
- 日期计算
- 处理 NULL 值
- 模式匹配
- 计算行数
- 使用多个表
- 获取数据库和表的信息
- 在批处理模式使用 mysql
- 常见查询示例
- 列的最大值
- 包含某一行最大值的记录
- 每组中列的最大值
- 拥有某个字段的组间最大值的行
- 使用用户自定义变量
- 使用外键
- 两个键上搜索
- 计算每日访问量
- 使用 AUTO_INCREMENT
- 在 Apache 中使用 MySQL
- MySQL 程序
- MySQL 客户端程序
- mysql — MySQL 命令行客户端
- 优化
- 优化概述
- 优化 SQL 语句
- 优化和索引
- 优化数据库结构
- 优化 InnoDB 表
- 优化 MyISAM 表
- 优化 MEMORY 表
- 理解查询执行计划
- 控制查询优化器
- 缓冲和缓存
- 优化锁操作
- 优化 MySQL 服务器
- 测量性能 (Benchmarking)
- 检查线程信息