Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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 NULLIS 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 值的列上添加索引,如果您使用的是 MyISAMInnoDBMEMORY 存储引擎。否则,您必须将索引列声明为 NOT NULL,并且不能将 NULL 值插入该列。

在使用 LOAD DATA 读取数据时,空或缺失的列将被更新为 ''。要将 NULL 值加载到列中,请在数据文件中使用 \N。在某些情况下,也可以使用字面值 NULL。请参阅第15.2.9节,“LOAD DATA Statement”

在使用 DISTINCTGROUP BYORDER 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 系统变量的值。