《实战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 报错。

相关推荐
XDHCOM2 天前
ORA-32484重复列名错误,ORACLE数据库CYCLE子句故障修复与远程处理方案
数据库·oracle
翻斗包菜2 天前
PostgreSQL 日常维护完全指南:从基础操作到高级运维
运维·数据库·postgresql
呆瑜nuage2 天前
MySQL表约束详解:8大核心约束实战指南
数据库·mysql
liliangcsdn2 天前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索
那个失眠的夜2 天前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis
Rick19932 天前
SQL 执行流程
数据库·sql
M--Y2 天前
Redis常用数据类型
数据结构·数据库·redis
猿小喵2 天前
MySQL慢查询分析与处理-第二篇
数据库·mysql·性能优化
Y001112362 天前
MySQL-进阶
开发语言·数据库·sql·mysql
徒 花2 天前
数据库知识复习01
数据库