值的概念NULL
是 SQL 新手的一个常见混淆源,他们常常认为它
NULL
与空字符串是一回事
''
。不是这种情况。例如,下面的语句是完全不同的:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
这两个语句都向
phone
列中插入一个值,但第一个插入一个
NULL
值,第二个插入一个空字符串。第一个的意思可以理解为
“不知道电话号码”,第二个的意思可以理解为“已知此人没有电话,因此没有电话号码”。”
为了帮助NULL
处理,您可以使用
IS NULL
andIS
NOT NULL
运算符和
IFNULL()
函数。
在 SQLNULL
中,与任何其他值(甚至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 = '';
有关其他信息和示例, 请参阅第 3.3.4.6 节,“使用 NULL 值” 。
NULL
如果您使用 、 或 存储引擎,则可以在可以具有值
MyISAM
的InnoDB
列
MEMORY
上
添加索引
。否则,您必须声明一个索引列NOT NULL
,并且您不能插入NULL
到该列中。
使用 读取数据时LOAD
DATA
,空列或缺失列将使用 更新
''
。要将NULL
值加载到列中,\N
请在数据文件中使用。NULL
在某些情况下也可以使用字面词。请参阅第 13.2.7 节,“加载数据语句”。
使用DISTINCT
、GROUP
BY
或ORDER BY
时,所有
NULL
值都被视为相等。
使用 时ORDER BY
,
NULL
首先显示值,如果您指定DESC
按降序排序,则最后显示值。
聚合(组)函数,例如
COUNT()
、
MIN()
和
SUM()
忽略
NULL
值。例外情况是
COUNT(*)
,它计算行而不是单个列值。例如,以下语句产生两个计数。第一个是表中行数的计数,第二个是列中非NULL
值
数的计数age
:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
对于某些数据类型,MySQLNULL
以特殊方式处理值。例如,如果您插入
NULL
具有该属性的整数或浮点列,AUTO_INCREMENT
则会插入序列中的下一个数字。在特定条件下,如果插入NULL
列TIMESTAMP
,则插入当前日期和时间;此行为部分取决于服务器 SQL 模式(请参阅第 5.1.11 节,“服务器 SQL 模式”)以及
explicit_defaults_for_timestamp
系统变量的值。