记一次NULL与空字符串导致的分组后产生重复数据

一,场景说明

想实现这样一个功能,统计人员信息中不同性别的人的总工资。
实现方式:将数据group by 分组后累加。

二,实现功能

现要统计人员信息,sex为0代表女生,sex为1代表男生,为空则是未统计状态。
统计sql:

select sum(salary) as sum_salary,gender from tab_person group by gender

统计完以后应该只有三种情况,可实际情况却是如下四种:

sum_salarygender
22210
900
1569200
91871

挺奇怪的,最后去库里看了一下,发现gender除了1与0外,为空时有两种情况:Null与空字符串。怀疑group by的时候,把Null和空字符串,当成了两种不同的数据来处理。

在这里插入图片描述

三,修改原实现方法

select sum(salary) as sum_salary,IFNULL(gender,'') AS gender
from tab_person group by IFNULL(gender,'')

统计结果如下:

sum_salarygender
31210
1569200
91871

使用IFNULL函数,当字段值为NULL时,转为空字符串来参与分组。

四,说明

MySQL中Null和空字符串是如何存储的?

    1. Null:在MySQL中,NULL不是一个字符串,而是一种特殊的值,用于表示缺失或未知的值。NULL值在物理上不占用空间,因为它不存储任何数据。
  • 2.空字符串:空字符串是一个长度为0的字符串,它实际上是一个空字符串,在MySQL中它被视为长度为0的字符串。空字符串占用一个字节的存储空间(用于存储长度信息)。

具体的存储方式取决于字段的定义方式。如果字段定义为NOT NULL空字符串和NULL会被视为相同的值,存储方式也是相同的。如果字段可以存储NULL值,那么NULL和空字符串会被存储为不同的值
因此,我们在设计表时,字段最好是非空的,如果业务上可为空,那可以给其一个默认值,这样无论是建索引,还是分组,排序等,都会方便一些,不用额外考虑NULL值和空字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值