3.3.4.6 处理 NULL 值
在你习惯之前, NULL
值可能会让你感到惊讶. 从概念上讲, NULL
意味着“丢失的未知值”, 它的处理方法与其他值有些不同.
对 NULL
进行测试, 使用 IS NULL
和 IS NOT NULL
操作符, 如下所示:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
不能使用算术比较运算符, 比如 =
, <
, 或者 <>
来测试 NULL
. 演示这个, 尝试以下查询:
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
很容易进行测试, 如下所示:
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 值得问题”
.