3.3.4.6 处理 NULL 值

在你习惯之前, NULL 值可能会让你感到惊讶. 从概念上讲, NULL 意味着“丢失的未知值”, 它的处理方法与其他值有些不同.

NULL 进行测试, 使用 IS NULLIS NOT NULL 操作符, 如下所示:

  1. mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
  2. +-----------+---------------+
  3. | 1 IS NULL | 1 IS NOT NULL |
  4. +-----------+---------------+
  5. | 0 | 1 |
  6. +-----------+---------------+

不能使用算术比较运算符, 比如 =, <, 或者 <> 来测试 NULL. 演示这个, 尝试以下查询:

  1. mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
  2. +----------+-----------+----------+----------+
  3. | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
  4. +----------+-----------+----------+----------+
  5. | NULL | NULL | NULL | NULL |
  6. +----------+-----------+----------+----------+

因为任何与 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 很容易进行测试, 如下所示:

  1. mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
  2. +-----------+---------------+------------+----------------+
  3. | 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
  4. +-----------+---------------+------------+----------------+
  5. | 0 | 1 | 0 | 1 |
  6. +-----------+---------------+------------+----------------+

因此完全有可能将0或者空字符串插入到 NOT NULL 列中, 因为这些列实际上是 NOT NULL. 参阅 Section B.4.4.3, “NULL 值得问题”.