MySQL 进阶:分组查询全解析与实用逻辑函数

在日常数据处理中,光会单表增删改查还不够,分组统计和条件判断才是数据洞察的利器。本文聚焦 分组查询的完整语法与执行顺序,并介绍 IF、CASE WHEN、IFNULL 等逻辑函数,以及 RAND() 随机数和 DATE_FORMAT 日期格式化 等实用技巧。


一、分组查询的完整语法

聚合函数(COUNT、SUM、AVG、MAX、MIN)强大之处在于与分组结合。完整的分组查询结构如下:

SELECT 分组字段, 聚合函数
FROM 表名
WHERE 条件
GROUP BY 分组字段
HAVING 分组后的筛选条件
ORDER BY 排序字段 ASC|DESC
LIMIT 起始索引, 条数;

各子句作用:

  • WHERE:分组前对原始行数据进行过滤
  • GROUP BY:按指定字段分组,每个分组返回一行
  • HAVING:对分组后的结果进行筛选(与 WHERE 的区别就在这里)
  • ORDER BY:排序,ASC(升序,默认)或 DESC(降序)
  • LIMIT:限制返回条数。起始索引从 0 开始,LIMIT 5 等同于 LIMIT 0,5

示例:查找每个部门中在职员工的平均薪资,只显示平均薪资大于 8000 的部门,按平均薪资降序取前 3 名

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
WHERE status = '在职'
GROUP BY department_id
HAVING avg_salary > 8000
ORDER BY avg_salary DESC
LIMIT 3;

书写顺序 ≠ 执行顺序,真实执行流程如下:

  1. FROM —— 锁定数据表
  2. WHERE —— 筛选原始数据行
  3. GROUP BY —— 分组
  4. HAVING —— 筛选分组后的数据
  5. SELECT —— 选取最终显示的字段及别名
  6. ORDER BY —— 对最终结果排序
  7. LIMIT —— 截取指定行数

记忆口诀:FROM 找表 → WHERE 筛数 → GROUP BY 分类 → HAVING 筛类 → SELECT 选字段 → ORDER BY 排序 → LIMIT 截断。

注意:别名在 SELECT 阶段才生效,因此 WHERE 中不能使用别名,但 HAVING 和 ORDER BY 中可以。


二、逻辑函数:IF、CASE WHEN、IFNULL

1. IF 函数

IF(条件表达式,1,2)

条件为真返回值1,否则返回值2。适合简单二分判断。

SELECT name, score, IF(score >= 60, '及格', '不及格') AS result
FROM students;

2. CASE WHEN 结构

支持多分支判断,语法更像编程语言中的 switch 或 if-else:

CASE
    WHEN 条件1 THEN 结果1
    WHEN 条件2 THEN 结果2
    ...
    ELSE 默认结果
END

示例:按分数划分等级

SELECT name, score,
    CASE
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 75 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS grade
FROM students;

3. IFNULL 函数

IFNULL(表达式1, 表达式2)

如果表达式1为 NULL,则返回表达式2,常用于空值处理。

SELECT username, IFNULL(phone, '未填写') AS contact
FROM users;

三、伪随机数函数 RAND()

RAND() 返回一个 [0,1) 之间的浮点数。可用于随机抽样、生成测试数据等场景。通过指定相同的种子值,可以复现随机序列。

SELECT RAND();           -- 每次执行结果不同
SELECT RAND(6);          -- 同一版本中,结果固定

随机抽取表中 5 条数据:

SELECT * FROM products ORDER BY RAND() LIMIT 5;

四、日期格式化 DATE_FORMAT()

当需要将日期转换为特定字符串格式时,DATE_FORMAT() 非常实用。

DATE_FORMAT(日期时间, '格式串')

常用格式符:

格式符 含义
%Y 四位年
%m 月份(01-12)
%d 日(01-31)
%H 小时(00-23)
%i 分钟
%s

示例:

SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s') AS 当前时间;
-- 输出:2025年04月25日 15:30:45

五、补充:大小写转换

两个简单但常用的字符处理函数:

SELECT UPPER('hello');   -- 转为大写 -> 'HELLO'
SELECT LOWER('WORLD');   -- 转为小写 -> 'world'

小结

本文聚焦 MySQL 中几个进阶但高频使用的知识点:

  • 分组查询的完整语法及 HAVING 的用法,理解真实执行顺序
  • 逻辑函数 IFCASE WHENIFNULL 完成多条件判断和空值处理
  • RAND() 生成随机数
  • DATE_FORMAT() 灵活格式化日期输出
  • UPPER()LOWER() 快速进行大小写转换

掌握这些技巧能让你的 SQL 查询更加灵活高效,是数据分析与后端开发中不可或缺的基础工具。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐