MySQL 技巧:用好窗口函数,告别复杂子查询

简介: MySQL 技巧:用好窗口函数,告别复杂子查询

MySQL 技巧:用好窗口函数,告别复杂子查询

在日常开发中,我们经常遇到“分组排名”“累计求和”或“环比计算”等需求。以往靠子查询或临时变量实现,代码又长又难维护。MySQL 8.0 引入的窗口函数让这些操作变得优雅高效。

1. 分组排名:ROW_NUMBER()

假设要统计每位学生的成绩排名(按班级分组):

SELECT name, class, score,
       ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROM students;

PARTITION BY 指定分组,ORDER BY 决定排序规则。想允许并列名次?改用 RANK()DENSE_RANK() 即可。

2. 累计求和:SUM() OVER()

计算每个月的销售额累计值:

SELECT month, amount,
       SUM(amount) OVER (ORDER BY month) AS cumulative
FROM sales;

默认从第一行累加到当前行,无需自连接。

3. 环比增长率:LAG() 获取上一行

SELECT month, amount,
       (amount - LAG(amount, 1) OVER (ORDER BY month)) / LAG(amount, 1) OVER (ORDER BY month) * 100 AS growth_rate
FROM revenue;

LAG(列, 偏移量) 取前几行数据,LEAD() 取后几行,轻松计算差值或比率。

小贴士

  • 窗口函数不会合并行,保留原始明细
  • 性能优于等价的子查询或临时表方案
  • 需要 MySQL 8.0+,低版本可升级或改用模拟写法

用好窗口函数,让 SQL 更短、更清晰、更高效。

相关文章
|
21天前
|
SQL 移动开发 关系型数据库
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
|
21天前
|
SQL 关系型数据库 MySQL
5个提升MySQL查询效率的实用技巧
5个提升MySQL查询效率的实用技巧
|
29天前
|
存储 前端开发 数据库
【VO、DTO、Entity】VO、DTO、Entity三大核心数据对象全解析(附核心对比表 + 代码示例)
本文系统解析VO、DTO、Entity三大核心数据对象,涵盖其在分层架构、DDD与微服务中的定位、职责边界、设计规范及全链路流转规则,辅以对比表、代码示例与避坑指南,助你构建高内聚、低耦合、安全可维护的企业级数据模型体系。
【VO、DTO、Entity】VO、DTO、Entity三大核心数据对象全解析(附核心对比表 + 代码示例)
|
21天前
|
Python
5个提升Python效率的实用技巧
5个提升Python效率的实用技巧
93 17
|
21天前
|
开发者 Python
Python 中鲜为人知的 `else` 子句:不止用于条件判断
Python 中鲜为人知的 `else` 子句:不止用于条件判断
245 150
|
21天前
|
索引 Python
5个让你爱不释手的Python实用技巧
5个让你爱不释手的Python实用技巧
215 146
|
21天前
|
安全 PHP 索引
PHP 技巧:5个让你代码更优雅的实用函数
PHP 技巧:5个让你代码更优雅的实用函数
218 139
|
21天前
|
Python
3个让你爱不释手的Python冷门技巧
3个让你爱不释手的Python冷门技巧
300 146
|
21天前
|
PHP 索引
PHP 技巧:用 `array_map` 一键处理数组,告别 `foreach` 噩梦
PHP 技巧:用 `array_map` 一键处理数组,告别 `foreach` 噩梦
309 141
|
13天前
|
人工智能 安全 数据可视化
Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,告别复杂配置
2026年爆火开源「数字员工」OpenClaw(小龙虾AI),GitHub星标28万+!支持Windows本地运行、零代码可视化操作,自动完成文件整理、浏览器操控、办公自动化等任务,全程数据不出本地,10分钟一键部署。
232 6

热门文章

最新文章

下一篇
开通oss服务