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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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
目录
相关文章
|
25天前
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
MySQL8 窗口函数
|
2月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
65 5
Mysql(3)—数据库相关概念及工作原理
|
27天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
150 1
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
63 5
|
2月前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
91 1
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
123 5
|
28天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
63 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL索引的概念与好处
本文介绍了MySQL存储引擎及其索引类型,重点对比了MyISAM与InnoDB引擎的不同之处。文中详细解释了InnoDB引擎的自适应Hash索引及聚簇索引的特点,并阐述了索引的重要性及使用原因,包括提升数据检索速度、实现数据唯一性等。最后,文章还讨论了主键索引的选择与页分裂问题,并提供了使用自增字段作为主键的建议。
MySQL索引的概念与好处
|
3月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
65 2
zabbix agent集成percona监控MySQL的插件实战案例
|
4月前
|
SQL 关系型数据库 MySQL
干货!python与MySQL数据库的交互实战
干货!python与MySQL数据库的交互实战