《实战SQL: GROUP BY》

核心一句话先记住:

GROUP BY 不会凭空把"线上订单号"变空。

真正把它变空的,是你拿去 GROUP BY 的那个"加工后的值"。

1. 拆解核心语句

sql 复制代码
COALESCE(NULLIF(TRIM(CAST(`线上订单号` AS CHAR(255))), ''), '')

先把 线上订单号 转成文本,再去掉前后空格;如果处理完是空字符串,就当成 NULL;最后如果是 NULL,就返回空字符串 ''

1.1 CAST(\线上订单号` AS CHAR(255))`

sql 复制代码
CAST(`线上订单号` AS CHAR(255))

线上订单号 强制转换成字符类型。

为什么要转成字符

因为订单号在原表里可能不是纯文本,可能是:

  • 数字

  • bigint

  • int

  • 混合类型

但你后面想做:

  • 去空格

  • 判空

  • 拼接

  • 比较

这些操作通常对字符串更稳定,所以先统一转成文本。

什么时候用 CAST

你以后遇到这些情况就会用到:

  • 数字转字符串

  • 字符串转数字

  • 时间转日期

  • 不同字段类型不一致,先统一类型

sql 复制代码
CAST(金额 AS DECIMAL(10,2))
CAST(日期字段 AS DATE)
CAST(订单号 AS CHAR(255))
  • CAST (转换/塑形):

    • 含义: SQL 中的标准类型转换函数。就像是一个模具,把一种形态的东西压成另一种形态。
  • 金额 (目标字段):

    • 含义: 这是你表里原本的列名。在数据库里,它可能一开始被错误地存成了字符串类型(比如 '100.5'),或者你为了后续计算,需要规范它的格式。
  • AS (作为):

    • 含义: 语法连接词,告诉数据库:"把前面的东西,作为后面的类型处理"。
  • DECIMAL (精确小数类型):

    • 含义: 这是这句代码的核心 。在 SQL 中,处理带小数的数字有 FLOAT(浮点数)和 DECIMAL(定点数)。DECIMAL 是会计专用类型,它保证数字绝对精确,不会出现丢失精度的四舍五入误差
  • (10,2) (精度与标度):

    • 10 (Precision / 精度): 代表这个数字的总长度最多是 10 位。

    • 2 (Scale / 标度): 代表小数点后的位数固定是 2 位。

    • ⚠️ 核心易错点: 这意味着小数点前的整数部分最多只有 8 位(10 - 2 = 8),而不是 10 位!这个字段能存的最大数字是 99999999.99(即 9999万左右)。

1.2 TRIM(...)

sql 复制代码
TRIM(CAST(`线上订单号` AS CHAR(255)))

意思是:

去掉字符串前后两边的空格。

比如:

原值 TRIM 后
' 12345 ' '12345'
' ABC ' 'ABC'
' ' ''

为什么要去空格

因为数据库里经常会有脏数据,比如:

  • 前面多了空格

  • 后面多了空格

  • 看起来有值,其实全是空格

如果不处理,后面判断可能不准。

例如:

sql 复制代码
'   ' != ''

看起来像空,但它其实不是空字符串。

所以先 TRIM,就能把这种"假空值"清洗掉。

什么时候用 TRIM

特别适合这些场景:

  • 编码、订单号、手机号清洗

  • 判断字段是不是空

  • join 前统一格式

  • 去除脏数据空格

1.3 NULLIF(..., '')

sql 复制代码
NULLIF(TRIM(CAST(`线上订单号` AS CHAR(255))), '')

这个函数你要重点理解。

NULLIF(a, b) 的意思是:

如果 a = b,就返回 NULL;如果 a ≠ b,就返回 a。

所以这里的意思是:

如果去掉空格后的订单号是空字符串 '',那就把它变成 NULL

为什么要把空字符串变成 NULL

因为在很多 SQL 场景里:

真正的"无值"最好统一成 NULL。

这样方便:

  • 统一判空

  • COALESCE 补默认值

  • 避免空字符串和 NULL 混着用

什么时候用 NULLIF

非常适合这些场景:

  • 把空字符串转成 NULL

  • 避免除数为 0

  • 清洗脏数据

比如还有一种经典写法:

sql 复制代码
金额 / NULLIF(数量, 0)

意思是:

如果数量是 0,就返回 NULL,避免除 0 报错。

相关推荐
X56611 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717213 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本3 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi3 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai3 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw03 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209254 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
ACP广源盛139246256734 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Elastic 中国社区官方博客4 小时前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索