当前位置: 首页 > news >正文

记一次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值和空字符串。


http://www.mrgr.cn/news/8528.html

相关文章:

  • 2024年8月20日(playbook nginx任务 mariadb)
  • i.MX6裸机开发(8):中断
  • 微服务实战系列之玩转Docker(十二)
  • Golang | Leetcode Golang题解之第368题最大整除子集
  • GLUE数据集的预处理
  • (151)时序收敛--->(01)时序收敛一
  • 摄影曝光:曝光模式认知
  • Elasticsearch 安装 windows
  • RISC-V全志D1多媒体套件
  • Pytest学习总结
  • HarmonyOS 中的 Button 组件进阶应用与自定义样式
  • 爱吃香蕉的珂珂(LeetCode)
  • Javaweb学习之Vue实践小界面(四)
  • MySQL面试常问问题
  • JS 和 ES6 补充学习
  • 【spring boot自动配置】深入探讨 Spring Boot 自动配置:实现与机制
  • 混合动力汽车救援充电器 Midtronics XRC-3363
  • Docker 的基本管理
  • 蒙特卡洛应用:RTX 光线追踪算法 ReSTIR 原理
  • (javaweb)maven高级