目录
- 一,场景说明
- 二,实现功能
- 三,修改原实现方法
- 四,说明
一,场景说明
想实现这样一个功能,统计人员信息中不同性别的人的总工资。
实现方式:将数据group by 分组后累加。
二,实现功能
现要统计人员信息,sex为0代表女生,sex为1代表男生,为空则是未统计状态。
统计sql:
select sum(salary) as sum_salary,gender from tab_person group by gender
统计完以后应该只有三种情况,可实际情况却是如下四种:
sum_salary | gender |
---|---|
22210 | |
900 | |
156920 | 0 |
9187 | 1 |
挺奇怪的,最后去库里看了一下,发现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_salary | gender |
---|---|
31210 | |
156920 | 0 |
9187 | 1 |
使用IFNULL函数,当字段值为NULL时,转为空字符串来参与分组。
四,说明
MySQL中Null和空字符串是如何存储的?
-
- Null:在MySQL中,NULL不是一个字符串,而是一种特殊的值,用于表示缺失或未知的值。NULL值在物理上不占用空间,因为它不存储任何数据。
- 2.空字符串:空字符串是一个长度为0的字符串,它实际上是一个空字符串,在MySQL中它被视为长度为0的字符串。空字符串占用一个字节的存储空间(用于存储长度信息)。
具体的存储方式取决于字段的定义方式。如果字段定义为NOT NULL,空字符串和NULL会被视为相同的值,存储方式也是相同的。如果字段可以存储NULL值,那么NULL和空字符串会被存储为不同的值。
因此,我们在设计表时,字段最好是非空的,如果业务上可为空,那可以给其一个默认值,这样无论是建索引,还是分组,排序等,都会方便一些,不用额外考虑NULL值和空字符串。