十细说NULL导致的神坑,让人防不胜防
Posted biao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十细说NULL导致的神坑,让人防不胜防相关的知识,希望对你有一定的参考价值。
当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免?
一、比较运算符中使用NULL
任何值和NULL使用运算符(>、<、>=、<=、!=、<>)或者(in、not in、any/some、all)比较时,返回值都为NULL,NULL作为布尔值的时候,不为1也不为0。
二、IN、NOT IN和NULL比较
IN和NULL比较: 当IN和NULL比较时,无法查询出为NULL的记录。
NOT IN 和NULL比较: 当NOT IN 后面有NULL值时,不论什么情况下,整个sql的查询结果都为空。
三、EXISTS、NOT EXISTS和NULL比较
=不能比较NULL
四、判断NULL只能用IS NULL、IS NOT NULL
判断是否为空只能用IS NULL、IS NOT NULL。
五、聚合函数中NULL的坑
count(a)返回了2行记录,a字段为NULL的没有统计出来。
count(b)返回了1行记录,为NULL的2行记录没有统计出来。
count(*)可以统计所有数据,不论字段的数据是否为NULL。
select count(a) from test1 where a is null; --返回为0,说明如下:
count(字段)无法统计字段为NULL的值,count(*)可以统计值为null的行。
六、NULL不能作为主键的值
结论:当字段为主键的时候,字段会自动设置为not null。
看了上面这些还是比较晕,NULL的情况确实比较难以处理,容易出错,最有效的方法就是避免使用NULL。所以,强烈建议创建字段的时候字段不允许为NULL,设置一个默认值。
七、总结
-
NULL作为布尔值的时候,不为1也不为0
-
任何值和NULL使用运算符(>、<、>=、<=、!=、<>)或者(in、not in、any/some、all),返回值都为NULL
-
当IN和NULL比较时,无法查询出为NULL的记录
-
当NOT IN 后面有NULL值时,不论什么情况下,整个sql的查询结果都为空
-
判断是否为空只能用IS NULL、IS NOT NULL
-
count(字段)无法统计字段为NULL的值,count(*)可以统计值为null的行
-
当字段为主键的时候,字段会自动设置为not null
-
NULL导致的坑让人防不胜防,强烈建议创建字段的时候字段不允许为NULL,给个默认值
以上是关于十细说NULL导致的神坑,让人防不胜防的主要内容,如果未能解决你的问题,请参考以下文章