B.4.4.3 NULL 值问题

对于 SQL 的新手来说,NULL值的概念是一个常见的混淆源,他们经常认为NULL与空字符串''是同一回事。不是这种情况。例如,以下语句完全不同:

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

这两个语句都在phone列中插入一个值,但是第一个语句则插入NULL值,第二个语句则插入一个空字符串。第一个的含义可以视为“未知电话 Numbers”,第二个的含义可以视为“已知该人没有电话,因此也没有电话 Numbers”。

为了帮助处理NULL,可以使用IS NULL不为空运算符以及IFNULL()函数。

在 SQL 中,与任何其他值(甚至是NULL)相比,NULL值永远不会为真。包含NULL的 table 达式始终会产生NULL值,除非文档中针对 table 达式中涉及的运算符和函数另有说明。以下示例中的所有列均返回NULL

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

要搜索NULL的列值,不能使用expr = NULL测试。以下语句不返回任何行,因为expr = NULL对于任何 table 达式都不为真:

mysql> SELECT * FROM my_table WHERE phone = NULL;

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

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

有关其他信息和示例,请参见第 3.3.4.6 节“使用 NULL 值”

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

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

使用DISTINCTGROUP BYORDER BY时,所有NULL值均视为相等。

使用ORDER BY时,将首先显示NULL值,如果指定DESC以降序排序,则最后显示NULL个值。

诸如COUNT()MIN()SUM()之类的汇总(摘要)函数会忽略NULL值。 COUNT(*)exception,它计算行而不是单个列的值。例如,以下语句产生两个计数。第一个是对 table 中行数的计数,第二个是对age列中非NULL值的计数:

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

对于某些数据类型,MySQL 专门处理NULL值。如果将NULL插入到TIMESTAMP列中,则会插入当前日期和时间。如果将NULL插入具有AUTO_INCREMENT属性的整数或浮点列中,则会插入序列中的下一个数字。