NULL值问题
NULL
对于SQL的新手来说,值的概念是一个常见的混淆源,他们经常认为这NULL
与空字符串是同一回事''
。不是这种情况。例如,以下语句完全不同:
mysql>INSERT INTO my_table (phone)VALUES (NULL); mysql>INSERT INTO my_table (phone)VALUES ('');
这两个语句都会在该phone
列中插入一个值,但是第一个语句将插入一个NULL
值,第二个语句将插入一个空字符串。第一个的含义可以视为“未知电话号码”,第二个的含义可以视为“已知该人没有电话,因此也没有电话号码”。”
为了帮助NULL
处理,可以使用IS NULL
和IS 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_tableWHERE phone = NULL;
要查找NULL
值,必须使用IS NULL
测试。以下语句显示如何查找NULL
电话号码和空电话号码:
mysql>SELECT *FROM my_tableWHERE phone IS NULL; mysql>SELECT *FROM my_tableWHERE phone = '';
有关更多信息和示例,请参见“使用NULL值”。
您可以在可以有一列中添加索引NULL
,如果您使用的值MyISAM
,InnoDB
或MEMORY
存储引擎。否则,必须声明一个索引列NOT NULL
,并且不能插入NULL
该列。
使用读取数据时LOAD DATA
,空白列或缺失列将使用更新''
。要将NULL
值加载到列中,请\N
在数据文件中使用。NULL
在某些情况下,也可以使用原义词。请参见“ LOAD DATA语句”。
使用DISTINCT
,GROUP BY
或时ORDER BY
,所有NULL
值均视为相等。
使用时ORDER BY
,NULL
值首先显示,如果您指定DESC
按降序排序,则最后显示。
集合体(摘要)功能,例如COUNT()
,MIN()
,和SUM()
忽略NULL
的值。例外是COUNT(*)
,它计算行而不是单个列的值。例如,以下语句产生两个计数。第一个是对表中行数的计数,第二个是NULL
对age
列中非值数的计数:
mysql>SELECT COUNT(*), COUNT(age)FROM person;
对于某些数据类型,MySQL NULL
专门处理值。如果插入NULL
到一个TIMESTAMP
列,当前日期和时间插入。如果您插入NULL
具有AUTO_INCREMENT
属性的整数或浮点列,则将插入序列中的下一个数字。