MySQL 进阶:分组查询全解析与实用逻辑函数
·
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;
书写顺序 ≠ 执行顺序,真实执行流程如下:
- FROM —— 锁定数据表
- WHERE —— 筛选原始数据行
- GROUP BY —— 分组
- HAVING —— 筛选分组后的数据
- SELECT —— 选取最终显示的字段及别名
- ORDER BY —— 对最终结果排序
- 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 的用法,理解真实执行顺序
- 逻辑函数
IF、CASE WHEN、IFNULL完成多条件判断和空值处理 RAND()生成随机数DATE_FORMAT()灵活格式化日期输出UPPER()、LOWER()快速进行大小写转换
掌握这些技巧能让你的 SQL 查询更加灵活高效,是数据分析与后端开发中不可或缺的基础工具。
更多推荐




所有评论(0)