MySQL 的窗口函数,真的是型查询里的神器。像ROW_NUMBER()
、RANK()
、OVER()
这些,分组内排序、累计求和、环比这些需求,顺手。写起来不像子查询那么绕,性能还挺不错,响应也快,逻辑一目了然。
窗口函数的用法,说白了就是:你能按某个字段分组,但又保留原表结构,还能在组内做排序或聚合。比如,想看每个部门里薪水最高的前 3 名员工?以前得嵌套子查询,现在一句ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC)
就搞定,代码简洁,维护起来也轻松。
别看名字叫“窗口”,其实跟前端窗口没关系,更多是“看某个范围内的数据”。像财务报表里常见的“本月 vs 上月”的对比,用LAG()
函数就合适,不用自己手动写 JOIN 啰嗦代码了。
对比着用,你也可以看看其他数据库的实现:
- ORACLE 的窗口函数,功能更全,写法略复杂。
- SQL Server 2012 的语法几乎和 MySQL 一致,迁移成本低。
- PostgreSQL 的窗口优化,性能调优方面做得不错。
,如果你经常写复杂报表、分组统计、排名类查询,MySQL 窗口函数可以省掉一堆子查询和临时表的麻烦。如果你还没上手,可以从这个入门教程开始,讲得还挺清楚的。
哦对了,和分组函数别混淆,前者是逐行,后者是整组聚合,两者配合用才叫爽。如果你对分组还有点懵,也可以顺手看看MySQL 分组查询详解,顺便打个基础。
建议你平时多动手敲几次,像RANK()
和DENSE_RANK()
的区别,多练几遍就清楚了。业务里一旦用起来,你就知道这东西到底有多香了。