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

相关推荐
用户86629784800813 分钟前
抓包看 KingbaseES 内部协议?官方给了个现成工具
数据库
wefg119 分钟前
【Redis】安装与启动
数据库·redis·缓存
大圣编蚕1 小时前
常见的 Redis 面试题(高频整理)
数据库·redis·缓存
派小心.1 小时前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
龙腾AI白云2 小时前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
SelectDB技术团队2 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓
这个DBA有点耶2 小时前
从INDEX到JOIN_ORDER:MySQL 8.0 Hint语法体系与五类实战场景
数据库·mysql·架构
数字新视界2 小时前
机房动环监控助力智能管理
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
梅菲塔亚2 小时前
博客_Redis入门到实战
数据库·redis·缓存
abcyuu2 小时前
用友 U8 Cloud 生产制造模块深度解析:从 BOM 建立到成本核算的技术实现
前端·数据库·制造