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 值”。
如果使用MyISAM
,InnoDB
或MEMORY
存储引擎,则可以在具有NULL
值的列上添加索引。否则,必须声明索引列NOT NULL
,并且不能将NULL
插入该列。
使用LOAD DATA读取数据时,使用''
更新空白列或缺失列。要将NULL
值加载到列中,请在数据文件中使用\N
。LiteralsNULL
在某些情况下也可以使用。参见第 13.2.6 节“ LOAD DATA 语句”。
使用DISTINCT
,GROUP BY
或ORDER 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
属性的整数或浮点列中,则会插入序列中的下一个数字。