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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 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. 计算每个部门员工工资的标准差。

 

结论

 

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
568 66
|
10月前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
415 0
|
8月前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
297 22
 MySQL秘籍之索引与查询优化实战指南
|
9月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
423 11
|
10月前
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
392 1
MySQL8 窗口函数
|
10月前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
10月前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
10月前
|
移动开发 关系型数据库 MySQL
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。ROW_NUMBER在分页、去重、分组内排序等场景中非常有用。
477 4
|
11月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
456 5
Mysql(3)—数据库相关概念及工作原理

推荐镜像

更多