对于 SQL 新手来说,NULL
值的概念常常是困惑的来源,他们往往认为 NULL
等同于空字符串 ''
。事实并非如此。例如,以下语句完全不同
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
这两条语句都将值插入到 phone
列中,但第一条语句插入的是 NULL
值,而第二条语句插入的是空字符串。第一条语句的含义可以理解为 “电话号码未知”,而第二条语句的含义可以理解为 “此人已知没有电话,因此没有电话号码。”
为了帮助处理 NULL
,您可以使用 IS NULL
和 IS NOT NULL
运算符以及 IFNULL()
函数。
在 SQL 中,NULL
值与任何其他值相比永远不为真,即使是 NULL
本身。包含 NULL
的表达式总是产生 NULL
值,除非表达式中涉及的运算符和函数的文档另有说明。以下示例中的所有列都返回 NULL
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
要搜索值为 NULL
的列,您不能使用 expr = NULL
测试。以下语句不返回任何行,因为对于任何表达式,expr = NULL
永远不为真
mysql> SELECT * FROM my_table WHERE phone = NULL;
要查找 NULL
值,您必须使用 IS NULL
测试。以下语句显示了如何查找 NULL
电话号码和空电话号码
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
有关更多信息和示例,请参见 第 5.3.4.6 节,“处理 NULL 值”。
如果使用的是 MyISAM
、InnoDB
或 MEMORY
存储引擎,则可以在可以包含 NULL
值的列上添加索引。否则,您必须将索引列声明为 NOT NULL
,并且不能将 NULL
插入到该列中。
在使用 LOAD DATA
读取数据时,空列或缺失列将使用 ''
更新。要将 NULL
值加载到列中,请在数据文件中使用 \N
。在某些情况下,也可以使用字面量 NULL
。请参见 第 15.2.9 节,“LOAD DATA 语句”。
在使用 DISTINCT
、GROUP BY
或 ORDER BY
时,所有 NULL
值都被视为相等。
在使用 ORDER BY
时,NULL
值将首先显示,或者如果指定 DESC
以降序排序,则最后显示。
聚合(分组)函数(例如 COUNT()
、MIN()
和 SUM()
)会忽略 NULL
值。COUNT(*)
是此规则的例外,它计算的是行数,而不是单个列值。例如,以下语句产生两个计数。第一个是表中行数的计数,第二个是非 NULL
值的计数 age
列
mysql> SELECT COUNT(*), COUNT(age) FROM person;
对于某些数据类型,MySQL 会以特殊方式处理 NULL
值。例如,如果您将 NULL
插入到具有 AUTO_INCREMENT
属性的整数或浮点列中,则会插入序列中的下一个数字。在某些情况下,如果您将 NULL
插入到 TIMESTAMP
列中,则会插入当前日期和时间;此行为部分取决于服务器 SQL 模式(请参见 第 7.1.11 节,“服务器 SQL 模式”)以及 explicit_defaults_for_timestamp
系统变量的值。