3.3.4.6 使用 NULL 值
NULL
值可能令人惊讶,直到您习惯了它。从概念上讲,NULL
table 示“缺少未知值”,并且与其他值的处理方式有所不同。
要测试NULL
,请使用IS 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
table 示 false,其他 table 示 true。布尔运算的默认真值是1
。
对NULL
的这种特殊处理就是为什么在上一节中必须使用death IS NOT NULL
而不是death <> NULL
来确定哪些动物不再存活的原因。
两个NULL
的值在GROUP BY
中被视为相等。
进行ORDER BY
时,如果执行ORDER BY ... ASC
,则首先显示NULL
值,如果执行ORDER BY ... DESC
,则最后显示NULL
。
使用NULL
时,一个常见的错误是假定无法在定义为NOT NULL
的列中插入零或空字符串,但事实并非如此。这些实际上是值,而NULL
table 示“没有值”。您可以使用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 |
+-----------+---------------+------------+----------------+
因此,完全有可能在NOT NULL
列中插入零或空字符串,因为它们实际上是NOT NULL
。参见第 B.4.4.3 节“具有 NULL 值的问题”。