B.5.4.3 NULL值问题

原文: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 NULLIS 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值,实际上会插入自增序列的下一个值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值