MySQL列中关于null值问题的总结


前言

公司项目的数据库中一张很久以前的表中有很多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_cdis_only_channel
SFB023null
SHF191null
SKF099null
SPM527null
SDU269null

非NULL值查询

select product_cd,is_only_channel from product where is_only_channel is not null;

结果如下(只截取了一部分)

product_cdis_only_channel
SPM1390
SPL8180
SPL0050
SPL4890
SPM1270
SMU1641

可以查询出不是NULL值的所有值

1.2 进行<>(!=)查询

进行不等查询时,无法查询NULL值

select product_cd,is_only_channel from product where is_only_channel <> 0;
product_cdis_only_channel
SMU1641

只能查询出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_channelcount(*)
NULL1452
04396
11

count(is_only_channel)查询

select is_only_channel,count(is_only_channel) from product group by is_only_channel;

查询结果为

is_only_channelcount(*)
NULL0
04396
11

可以发现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值的行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要排除在分组后存在的 NULL 数据,可以在 SQL 语句使用 IS NOT NULL 运算符。 例如: ``` SELECT column1, SUM(column2) FROM table_name WHERE column1 IS NOT NULL GROUP BY column1; ``` 这将确保在分组时不包括任何 NULL ,因为它们不满足 IS NOT NULL 的条件。 ### 回答2: 在使用MySQL进行分组操作时,遇到分组后存在null数据的情况,可以通过在查询语句添加条件来排除这些数据。 常见的方法有两种: 1. 使用HAVING子句:在查询语句的末尾添加HAVING子句,并在其指定排除null数据的条件。例如,假设有一个名为score的,我们只想统计非null的分组结果,可以使用以下语句: ``` SELECT column1, column2, COUNT(score) FROM table GROUP BY column1, column2 HAVING score IS NOT NULL; ``` 这样就能排除分组后score为null的数据。 2. 使用WHERE子句:如果想要排除null数据,也可以在WHERE子句添加条件来实现。例如,假设有一个名为score的,我们只想统计非null的分组结果,可以使用以下语句: ``` SELECT column1, column2, COUNT(score) FROM table WHERE score IS NOT NULL GROUP BY column1, column2; ``` 这样就能排除分组前score为null的数据。 无论是使用HAVING子句还是WHERE子句,都能达到排除null数据的效果,具体选择哪种方法取决于需求和语句的结构。通过添加条件来排除null数据,能够提高分组的准确性和结果的可靠性。 ### 回答3: 在MySQL,如果存在NULL数据,在进行分组操作时,可以使用GROUP BY子句结合HAVING子句来排除NULL数据。 首先,使用GROUP BY子句根据某个进行分组,将相同的数据进行分组。然后,使用HAVING子句来对分组后的数据进行筛选,排除包含NULL的分组。 具体操作如下: SELECT 1, 2, ... FROM 表名 GROUP BY 1, 2, ... HAVING 1 IS NOT NULL 上述语句1和2是指要进行分组操作的名,可以根据实际情况进行修改。 使用上述语句,将排除包含NULL的分组,只返回分组后的非NULL数据。 举个例子,假设有一个表名为students,包含两:name和score。现在要根据name进行分组,排除包含NULL的分组,可以使用以下语句: SELECT name, AVG(score) as avg_score FROM students GROUP BY name HAVING name IS NOT NULL 上述语句将根据name进行分组,计算每个分组的平均分数(使用AVG函数),并排除包含NULL的分组。最终返回每个分组的name和平均分数。 总结:通过使用GROUP BY子句和HAVING子句,可以在MySQL排除分组后存在NULL数据的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值