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 更短、更清晰、更高效。

相关文章
|
4月前
|
关系型数据库 MySQL Serverless
MySQL 技巧:巧用窗口函数计算累计值
MySQL 技巧:巧用窗口函数计算累计值
|
4月前
|
SQL 移动开发 关系型数据库
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
|
4月前
|
SQL 关系型数据库 MySQL
5个提升MySQL查询效率的实用技巧
5个提升MySQL查询效率的实用技巧
|
Oracle 关系型数据库
PLSQL中文显示乱码
PLSQL中文显示乱码
538 0
|
Oracle 数据挖掘 关系型数据库
浅谈数据仓库架构设计
简单的比较了一下数据中台架构与数据仓库、BI、DSS之间的关系,并对比了一下Bill Inmon和Ralph Kimball架构的差异。
2751 3
浅谈数据仓库架构设计
|
4月前
|
关系型数据库 MySQL 索引
5个让MySQL查询飞起来的实用技巧
5个让MySQL查询飞起来的实用技巧
|
前端开发 安全 JavaScript
为你的React项目接入高德地图
为你的React项目接入高德地图
1535 0
|
7月前
libicu-62.1-6.ky10.x86_64.rpm 安装步骤详解(麒麟V10系统)
本文介绍了在麒麟系统上安装libicu库的完整步骤:先通过rpm命令检查是否已安装,若未安装则下载指定版本的rpm包,使用sudo rpm命令进行安装,并通过验证命令确认安装成功。若出现依赖问题,可使用yum自动解决依赖并完成安装。
|
安全 算法 网络安全
HTTP和HTTPS的区别
本文介绍HTTP与HTTPS的区别、HTTPS链接建立过程及常见加密算法。HTTP为明文传输,易被窃听;HTTPS通过SSL/TLS协议加密,确保数据安全。HTTPS使用端口443,提供认证机制。文中还详细讲解了对称加密(如AES、DES)和非对称加密(如RSA、ECC)算法的特点及应用场景。