引言
在现代开发中,窗口函数能轻松搞定复杂排名、分组统计,JSON 数据类型可灵活处理非结构化数据,这两大高级特性已成为后端开发者提升效率的利器。
一、MYSQL 高级特性:不止于简单存储
在传统认知中,MySQL 常被当作'简单的关系型数据库',仅用于存储规整的行数据。但随着业务场景的复杂化,仅靠基础的 CRUD 操作早已无法满足需求。窗口函数(Window Functions)和 JSON 数据类型支持,正是 MySQL 为适配现代开发推出的核心高级特性,既能解决复杂的数据统计问题,又能灵活应对非结构化数据存储需求。
二、窗口函数:复杂统计场景的'杀手锏'
2.1 什么是窗口函数?
窗口函数,也叫分析函数,是 MySQL 8.0 及以上版本引入的重要特性。它能在不压缩结果集的前提下,对数据进行分组、排序和聚合计算,相当于为每一行数据'开一个窗口',在窗口内进行统计分析。
与传统聚合函数(SUM、AVG、COUNT 等)相比,窗口函数最大的优势的是:计算后不会合并行数据,每一行都会保留原始信息,同时新增统计结果列。这在需要展示原始数据 + 统计信息的场景中(如:展示每个员工信息 + 所在部门平均薪资),比聚合函数更高效、更简洁。
💡 核心对比:PARTITION BY 与 GROUP BY 的本质区别
很多同学容易把窗口函数里的 PARTITION BY 和传统的 GROUP BY 混淆,记住最核心的一点:是否合并数据行。
- GROUP BY:按字段分组后,相同字段的数据会'折叠'成一行,原始的明细数据就不见了。
- PARTITION BY:虽然也是分组,但原始数据行数不变。它是在这个分组的范围内进行统计计算,并把结果附加在每一行明细数据的后面。
这也就是为什么在需要同时展示'明细数据'和'统计信息'的场景下,窗口函数比传统聚合函数更高效、更优雅!
2.2 常用窗口函数分类与语法
2.2.1 函数分类(3 大类核心)
💡 核心分类,一目了然:
- 排序类:RANK()、DENSE_RANK()、ROW_NUMBER()
- 聚合类:SUM()、AVG()、COUNT()、MAX()、MIN()
- 分析类:LAG()、LEAD()、FIRST_VALUE()、LAST_VALUE()
2.2.2 基础语法
函数名 (字段名) OVER ( PARTITION BY 分组字段 -- 可选,类似 GROUP BY ORDER BY 排序字段 [ASC/DESC] -- 可选,窗口内排序 ROWS/RANGE BETWEEN 起始位置 AND 结束位置 -- 可选,窗口范围 ) AS 别名
2.3 实战案例:窗口函数解决实际业务问题
案例 1:员工薪资排名(排序类函数)
需求:查询所有员工信息,并显示其所在部门的薪资排名(相同薪资排名相同,不占用后续名次)。
准备数据:
CREATE TABLE emp ( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(20) NOT NULL, dept_id INT NOT NULL, salary (,) ); emp (emp_name, dept_id, salary) (, , ), (, , ), (, , ), (, , ), (, , );


