原文:https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html
B.5.4.3 NULL值问题
对新手来说,“NULL值”一个常见的难以理解的问题,经常被认为是空字符串”,实际上这两者并不等同。比如,下面的语句是完全不同的:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
这两个语句都向phone列插入了一个值,但是第一个插入了一个NULL值,第二个插入了一个空字符串。第一个语句可以理解为“不知道手机号”,第二个可以理解为“这个人没有手机,当然也就没有手机号了”。
你可以使用IS NULL 和 IS NOT NULL 操作符, 和 IFNULL() 函数来处理NULL值.
在SQL里,NULL值和其它任何值比较都不会返回true,包括两个NULL值比较。一个含NULL的表达式产生的结果一般情况下仍是NULL值,除非在表达式中使用了其它操作符或函数。下面列子的都有列的结果都是NULL.
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
如果要查找列为NULL的数据,你不能使用 “expr = NULL”,这样不会返回任何结果,因为“expr = NULL”在任何表达式中结果都不会是true:
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 = '';
更多的信息和例子,请查看Section 3.3.4.6, “Working with NULL Values”。
如果你使用的是MyISAM, InnoDB, or MEMORY存储引擎,你可以对NULL值的列建立索引。其它引擎只能在声明非NULL的列上建立索引。
当使用LOAD DATA INFILE读取数据时,列值为空或不存在的列会更新为”;文件中列值为\N的,会插入NULL值,在有些情况下也可以直接在文本中使用NULL。具体信息请查看”LOAD DATA INFILE Syntax”
当使用DISTINCT, GROUP BY, or ORDER BY时,所有的NULL值都认为是相等的。
当使用ORDER BY,NULL值会排在最前面;当使用DESC倒序排序时,NULL值会排在最后。
像COUNT(), MIN(), and SUM()这样的聚合函数,计算时会忽略NULL值。但count(*)是个例外,它不是按列值统计,而是按表的行数统计。比如,下面的sql会产生两个统计值,第一个是表的行数,第二个是age列非NULL值的个数:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
在某些数据类型时,MySQL对NULL值会特殊处理。如果你向一个TIMESTAMP列插入NULL值,实际会插入一个当前的日期和时间的值。如果你向一个有AUTO_INCREMENT属性的整数或浮点类型的列插入NULL值,实际上会插入自增序列的下一个值。