文章目录
前言
公司项目的数据库中一张很久以前的表中有很多null值,导致查询sql比较繁杂。null值查询的感觉很糟糕,而且含有很多意想不到的坑,总结一下null的使用事项
一、查询
有一张prouct表,里面有一个is_only_channel字段,分别有3种值,0、1、null,个数分别是1453、1、4359
1.1 对NULL值进行查询
表中NULL值进行查询的话,必须使用专用语法is null 或者is not null
select product_cd,is_only_channel from product where is_only_channel is null;
结果如下(只截取了一部分)
product_cd | is_only_channel |
---|---|
SFB023 | null |
SHF191 | null |
SKF099 | null |
SPM527 | null |
SDU269 | null |
非NULL值查询
select product_cd,is_only_channel from product where is_only_channel is not null;
结果如下(只截取了一部分)
product_cd | is_only_channel |
---|---|
SPM139 | 0 |
SPL818 | 0 |
SPL005 | 0 |
SPL489 | 0 |
SPM127 | 0 |
SMU164 | 1 |
可以查询出不是NULL值的所有值
1.2 进行<>(!=)查询
进行不等查询时,无法查询NULL值
select product_cd,is_only_channel from product where is_only_channel <> 0;
product_cd | is_only_channel |
---|---|
SMU164 | 1 |
只能查询出is_only_channel为1的值,所以要向查出null值或者不等于null的数据,只能使用专属的is null 或者 is not null语法
1.3 进行distinct查询
distinct用来去重,null值被归为同一种类型
select distinct(is_only_channel) from product;
结果是
is_only_channel |
---|
NULL |
0 |
1 |
1.4 group by、count计算
count(*)会计算某一列同一值的个数,count(column)也是,区别是count(*)会计算null值的个数
count(*)查询
select count(*) from product group by is_only_channel;
查询结果是
is_only_channel | count(*) |
---|---|
NULL | 1452 |
0 | 4396 |
1 | 1 |
count(is_only_channel)查询
select is_only_channel,count(is_only_channel) from product group by is_only_channel;
查询结果为
is_only_channel | count(*) |
---|---|
NULL | 0 |
0 | 4396 |
1 | 1 |
可以发现NULL值的个数为0
1.5 order by
MySQL中,order by默认为升序排列,null值会排在最前面;指定降序排列的话null值会排在最后
1.6 NULL值计算
NULL值会使所有的计算失效
对is_only_channel列值为1的行加1时
select is_only_channel+1 from product where is_only_channel = 1;
结果是
is_only_channel |
---|
2 |
可以看出确实进行了加1
当对is_only_channel列为NULL值的行加1时
select is_only_channel+1 from product where is_only_channel is null;
结果是(只显示了部分)
is_only_channel |
---|
NULL |
NULL |
NULL |
NULL |
这时计算就失效了
总结
- null值会给计算、查询带来复杂性,如果可能,尽量在设计表阶段就将所有的列设置为not null,并给予默认值
- 查询null值只能使用is null, 查询非null值时只能使用is not null,使用其它方式查询会自动忽略null值
- count(*)会计算含有null值的行,count(列名)不会计算含有null值的行