Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

B.3.4.3 空值问题

SQL 新手常见的混淆概念是空值的概念,它们经常认为 NULL 等同于空字符串 ''。这不是这样的事实。例如,以下语句完全不同:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

这两个语句都将值插入 phone 列,但第一个插入空值,而第二个插入空字符串。第一个的意思可以看作 电话号码未知,第二个的意思可以看作 这个人没有电话号码。

为了帮助处理空值,可以使用 IS NULLIS NOT NULL 运算符和 IFNULL() 函数。

在 SQL 中,空值从不在比较中为真,即使与空值本身比较。包含空值的表达式总是产生空值,除非在参与表达式的运算符和函数的文档中另有说明。

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

要搜索列值为空的行,不能使用 expr = NULL 测试。以下语句不返回任何行,因为 expr = NULL 永远不为真:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要查找空值,必须使用 IS NULL 测试。以下语句显示如何查找空电话号码和空电话号码:

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';

请参阅 第 5.3.4.6 节,“处理空值”,以获取更多信息和示例。

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

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

使用 DISTINCTGROUP BYORDER BY 时,所有空值都被视为相等。

使用 ORDER BY 时,空值将被排列在最前面,或者如果您指定 DESC 排序降序时排列在最后。

聚合(组)函数,如 COUNT()MIN()SUM(),忽略空值。唯一的例外是 COUNT(*),它统计行数,而不是单个列值。例如,以下语句产生两个计数。第一个是表中的行数,第二个是 age 列中非空值的计数:

mysql> SELECT COUNT(*), COUNT(age) FROM person;

对于某些数据类型,MySQL 以特殊方式处理 NULL 值。例如,如果您将 NULL 插入到具有 AUTO_INCREMENT 属性的整数或浮点数列中,将插入序列中的下一个数字。在某些条件下,如果您将 NULL 插入到 TIMESTAMP 列中,将插入当前日期和时间;这种行为部分取决于服务器 SQL 模式(见 第 7.1.11 节,“服务器 SQL 模式”)以及 explicit_defaults_for_timestamp 系统变量的值。