文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.4.3 NULL 值问题

对于 SQL 新手来说,NULL 值的概念是一个常见的混淆来源,他们经常认为 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 节,“使用 NULL 值”

如果使用 MyISAMInnoDBMEMORY 存储引擎,可以在可以具有 NULL 值的列上添加索引。否则,必须将索引列声明为 NOT NULL,并且不能在该列中插入 NULL

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

使用 DISTINCTGROUP BYORDER 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 的值。