MySQL 进阶:分组查询全解析与实用逻辑函数
MySQL 进阶:分组查询全解析与实用逻辑函数
在日常数据处理中,光会单表增删改查还不够,分组统计和条件判断才是数据洞察的利器。本文聚焦分组查询的完整语法与执行顺序,并介绍IF、CASE WHEN、IFNULL 等逻辑函数,以及RAND() 随机数和 DATE_FORMAT 日期格式化等实用技巧。
一、分组查询的完整语法
聚合函数(COUNT、SUM、AVG、MAX、MIN)强大之处在于与分组结合。完整的分组查询结构如下:
SELECT分组字段,聚合函数FROM表名WHERE条件GROUPBY分组字段HAVING分组后的筛选条件ORDERBY排序字段ASC|DESCLIMIT起始索引,条数;各子句作用:
WHERE:分组前对原始行数据进行过滤GROUP BY:按指定字段分组,每个分组返回一行HAVING:对分组后的结果进行筛选(与 WHERE 的区别就在这里)ORDER BY:排序,ASC(升序,默认)或 DESC(降序)LIMIT:限制返回条数。起始索引从 0 开始,LIMIT 5等同于LIMIT 0,5
示例:查找每个部门中在职员工的平均薪资,只显示平均薪资大于 8000 的部门,按平均薪资降序取前 3 名
SELECTdepartment_id,AVG(salary)ASavg_salaryFROMemployeesWHEREstatus='在职'GROUPBYdepartment_idHAVINGavg_salary>8000ORDERBYavg_salaryDESCLIMIT3;书写顺序 ≠ 执行顺序,真实执行流程如下:
- 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。适合简单二分判断。
SELECTname,score,IF(score>=60,'及格','不及格')ASresultFROMstudents;2. CASE WHEN 结构
支持多分支判断,语法更像编程语言中的 switch 或 if-else:
CASEWHEN条件1THEN结果1WHEN条件2THEN结果2...ELSE默认结果END示例:按分数划分等级
SELECTname,score,CASEWHENscore>=90THEN'优秀'WHENscore>=75THEN'良好'WHENscore>=60THEN'及格'ELSE'不及格'ENDASgradeFROMstudents;3. IFNULL 函数
IFNULL(表达式1,表达式2)如果表达式1为 NULL,则返回表达式2,常用于空值处理。
SELECTusername,IFNULL(phone,'未填写')AScontactFROMusers;三、伪随机数函数 RAND()
RAND()返回一个 [0,1) 之间的浮点数。可用于随机抽样、生成测试数据等场景。通过指定相同的种子值,可以复现随机序列。
SELECTRAND();-- 每次执行结果不同SELECTRAND(6);-- 同一版本中,结果固定随机抽取表中 5 条数据:
SELECT*FROMproductsORDERBYRAND()LIMIT5;四、日期格式化 DATE_FORMAT()
当需要将日期转换为特定字符串格式时,DATE_FORMAT()非常实用。
DATE_FORMAT(日期时间,'格式串')常用格式符:
| 格式符 | 含义 |
|---|---|
| %Y | 四位年 |
| %m | 月份(01-12) |
| %d | 日(01-31) |
| %H | 小时(00-23) |
| %i | 分钟 |
| %s | 秒 |
示例:
SELECTDATE_FORMAT(NOW(),'%Y年%m月%d日 %H:%i:%s')AS当前时间;-- 输出:2025年04月25日 15:30:45五、补充:大小写转换
两个简单但常用的字符处理函数:
SELECTUPPER('hello');-- 转为大写 -> 'HELLO'SELECTLOWER('WORLD');-- 转为小写 -> 'world'小结
本文聚焦 MySQL 中几个进阶但高频使用的知识点:
- 分组查询的完整语法及HAVING的用法,理解真实执行顺序
- 逻辑函数
IF、CASE WHEN、IFNULL完成多条件判断和空值处理 RAND()生成随机数DATE_FORMAT()灵活格式化日期输出UPPER()、LOWER()快速进行大小写转换
掌握这些技巧能让你的 SQL 查询更加灵活高效,是数据分析与后端开发中不可或缺的基础工具。
