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

相关推荐
sw1213892 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
ShiJiuD6668889992 小时前
mysql 基础笔记一
数据库·笔记·mysql
zzh0812 小时前
数据库初识与安装
数据库
m0_738098022 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
standovon2 小时前
【MySQL基础篇】概述及SQL指令:DDL及DML
sql·mysql·oracle
AI成长日志2 小时前
【实用工具教程】数据库基础操作实战:SQLite/MySQL连接、CRUD操作与查询优化
数据库·mysql·sqlite
l1t2 小时前
DeepSeek总结的 DuckDB 1.5 功能亮点
数据库·sql·duckdb
Bdygsl2 小时前
MySQL(4)—— 表设计
数据库·mysql
2301_819414303 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python