B.3.4.3 NULL 值问题
对 NULL 值的概念是 SQL 新手常常感到困惑的,因为他们通常认为 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节,“Working with NULL Values”,了解更多信息和示例。
您可以在可以包含 NULL
值的列上添加索引,如果您使用的是 MyISAM
、InnoDB
或 MEMORY
存储引擎。否则,您必须将索引列声明为 NOT NULL
,并且不能将 NULL
值插入该列。
在使用 LOAD DATA
读取数据时,空或缺失的列将被更新为 ''
。要将 NULL
值加载到列中,请在数据文件中使用 \N
。在某些情况下,也可以使用字面值 NULL
。请参阅第15.2.9节,“LOAD DATA Statement”。
在使用 DISTINCT
、GROUP BY
或 ORDER BY
时,所有 NULL
值将被视为等同。
使用 ORDER BY
时,NULL
值将首先出现,或者在指定 DESC
时将最后出现。
聚合(组)函数,如COUNT()
、MIN()
和SUM()
,忽略 NULL
值。唯一的例外是COUNT(*)
,它将计算行数,而不是单个列值的个数。例如,以下语句将产生两个计数。第一个是表中的行数计数,第二个是 age
列中的非 NULL
值的个数:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
对于某些数据类型,MySQL 对 NULL
值进行特殊处理。例如,如果将 NULL
插入一个具有 AUTO_INCREMENT
属性的整数或浮点列,下一个序列号将被插入。某些情况下,如果将 NULL
插入一个TIMESTAMP
列,当前日期和时间将被插入;这取决于服务器 SQL 模式(见第7.1.11节,“服务器 SQL 模式”)以及 explicit_defaults_for_timestamp
系统变量的值。