MySQL窗口函数详解(概念+练习+实战)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL窗口函数详解(概念+练习+实战)

MySQL窗口函数详解(概念+练习+实战)

 

窗口函数是MySQL 8.0版本引入的一项强大功能。它允许在查询中对结果集中的某些行执行计算,并返回这些行,同时保留其各自的行。窗口函数能够实现诸如排名、累计和移动平均等操作,非常适合数据分析任务。

 

一、窗口函数概念

 

窗口函数的语法格式如下:

 

```sql
<窗口函数> OVER ([PARTITION BY <列> ] [ORDER BY <列> ] [<窗口框架>])
```

 

其中,`<窗口函数>`可以是RANK()、DENSE_RANK()、ROW_NUMBER()等函数,`PARTITION BY`用于将结果集分区,`ORDER BY`用于指定排序列,`<窗口框架>`用于定义窗口范围。

 

常见的窗口函数

 

1. **ROW_NUMBER()**

  计算每行的序号,序号是连续的。

 

2. **RANK()**

  计算每行的排名,如果有相同值会跳过排名。

 

3. **DENSE_RANK()**

  类似RANK(),但是不跳过排名。

 

4. **NTILE(n)**

  将结果集分成n个桶,并为每行分配桶编号。

 

5. **LAG() 和 LEAD()**

  返回当前行之前或之后的值。

 

6. **SUM()、AVG()、MIN()、MAX()**

  聚合函数可以作为窗口函数使用。

 

二、窗口函数的使用

 

1. 数据准备

 

我们以一个简单的员工表为例:

 

```sql
CREATE TABLE employees (
    id INT PRIMARY KEY,
    department VARCHAR(50),
    name VARCHAR(50),
    salary DECIMAL(10, 2)
);
 
INSERT INTO employees VALUES 
(1, 'HR', 'Alice', 5000),
(2, 'HR', 'Bob', 5500),
(3, 'IT', 'Charlie', 6000),
(4, 'IT', 'David', 7000),
(5, 'IT', 'Eve', 6500);
```

 

2. 使用ROW_NUMBER()函数

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as row_num
FROM 
    employees;
```

 

此查询将对每个部门的员工按工资降序排列,并为每个员工分配一个序号。

 

3. 使用RANK()函数

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM 
    employees;
```

 

此查询将对每个部门的员工按工资降序排列,并为每个员工分配一个排名,遇到相同工资时,排名会跳过。

 

4. 使用LAG()函数

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    LAG(salary, 1) OVER (PARTITION BY department ORDER BY salary) as prev_salary
FROM 
    employees;
```

 

此查询将为每个员工返回其工资的前一个值。

 

三、窗口函数的实战

 

1. 计算每个部门的累计工资

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    SUM(salary) OVER (PARTITION BY department ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as cumulative_salary
FROM 
    employees;
```

 

此查询将计算每个部门的累计工资。

 

2. 计算移动平均

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    AVG(salary) OVER (PARTITION BY department ORDER BY salary ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as moving_avg
FROM 
    employees;
```

 

此查询将计算每个部门的移动平均工资,窗口为当前行及其前后各一行。

 

3. 获取每个部门的最高和最低工资

 

```sql
SELECT 
    id,
    department,
    name,
    salary,
    MAX(salary) OVER (PARTITION BY department) as max_salary,
    MIN(salary) OVER (PARTITION BY department) as min_salary
FROM 
    employees;
```

 

此查询将获取每个部门的最高和最低工资。

 

四、练习

 

为了巩固对窗口函数的理解,可以尝试以下练习:

 

1. 对每个部门按工资排名,找出工资第二高的员工。

2. 计算每个部门员工工资的累计百分比。

3. 计算每个部门员工工资的标准差。

 

结论

 

窗口函数是处理复杂数据分析任务的强大工具。通过本文的介绍和实战示例,希望你能掌握窗口函数的基本用法,并能够在实际项目中应用这些函数来处理数据。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
存储 关系型数据库 MySQL
MySQL索引的概念与好处
本文介绍了MySQL存储引擎及其索引类型,重点对比了MyISAM与InnoDB引擎的不同之处。文中详细解释了InnoDB引擎的自适应Hash索引及聚簇索引的特点,并阐述了索引的重要性及使用原因,包括提升数据检索速度、实现数据唯一性等。最后,文章还讨论了主键索引的选择与页分裂问题,并提供了使用自增字段作为主键的建议。
MySQL索引的概念与好处
|
1月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
31 2
zabbix agent集成percona监控MySQL的插件实战案例
|
2月前
|
SQL 关系型数据库 MySQL
干货!python与MySQL数据库的交互实战
干货!python与MySQL数据库的交互实战
|
2月前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
30 2
|
2月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
2月前
|
关系型数据库 MySQL Linux
【一键解锁神秘力量!】CentOS 7 通过编译源码方式安装 MySQL 数据库 —— 从零到英雄的数据库安装实战秘籍!
【8月更文挑战第9天】随着业务增长,对数据库的需求日益提高。在 CentOS 7 中,通过编译源码安装 MySQL 可提供更高定制性和灵活性。本文详细介绍从准备环境、下载源码、配置编译参数到安装 MySQL 的全过程,并对比 RPM 包安装方法,帮助读者根据需求选择合适方案。实践时需注意备份数据、选择合适版本、确保安全性和调优性能等要点。
147 1
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶实战:解锁性能飙升秘籍,从菜鸟到高手的华丽蜕变,让数据操作如行云流水!
【8月更文挑战第5天】MySQL是最流行的开源关系型数据库之一,在Web开发与数据分析等领域广泛应用。本文通过实战代码示例,深入探讨MySQL进阶技能:包括索引优化以提升查询性能;利用JOIN与子查询处理多表关联数据;通过事务处理确保数据一致性;使用存储过程与函数封装复杂逻辑以便重用;设置触发器自动执行特定任务以维护数据完整性。掌握这些技能能显著提高数据处理效率与系统性能。
43 5
|
2月前
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
364 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
MySQL Change Buffer 深入解析:概念、原理及使用
|
2月前
|
存储 关系型数据库 MySQL
MySQL中的DISTINCT与GROUP BY:效率之争与实战应用
【8月更文挑战第12天】在数据库查询优化中,DISTINCT和GROUP BY常常被用来去重或聚合数据,但它们在实现方式和性能表现上却各有千秋。本文将深入探讨两者在MySQL中的效率差异,结合工作学习中的实际案例,为您呈现一场技术干货分享。
239 0
下一篇
无影云桌面