mysql8.0窗口函数:rank,dense_rank,row_number 使用上的区别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

本节主要介绍排序类 rank,dense_rank,row_number使用上的区别

*RANK:跳跃排序
DENSE_RANK:连续排序
row_number:没有重复值的排序[记录相等也是不重复的]可以进行分页使用。
*
案例:

root@my3308.sock-8.0.11>[test]>select * from window_test;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 小黄   | 数学    |   100 |
|    2 | 小黄   | 语文    |    90 |
|    3 | 小黄   | 英语    |    80 |
|    4 | 小黄   | 物理    |   100 |
|    5 | 小黄   | 化学    |    99 |
|    6 | 小红   | 数学    |    90 |
|    7 | 小红   | 语文    |   100 |
|    8 | 小红   | 英语    |    80 |
|    9 | 小红   | 物理    |    90 |
|   10 | 小红   | 化学    |    70 |
|   11 | 小绿   | 数学    |    90 |
|   12 | 小绿   | 语文    |    92 |
|   13 | 小绿   | 英语    |    93 |
|   14 | 小绿   | 物理    |    94 |
|   15 | 小绿   | 化学    |    95 |
|   16 | 小青   | 数学    |    30 |
|   17 | 小青   | 语文    |   100 |
|   17 | 小青   | 英语    |    70 |
|   17 | 小青   | 物理    |    88 |
|   17 | 小青   | 化学    |    96 |
+------+--------+---------+-------+
20 rows in set (0.00 sec)

rank :跳跃式的排序:

image

dense_rank:连续排序

image

row_number:没有重复值的排序[记录相等也是不重复的]可以进行分页使用

root@my3308.sock-8.0.11>[test]>select *,row_number()  over(partition by subject order by score desc) as 'rank' from window_test;
+------+--------+---------+-------+------+
| id   | name   | subject | score | rank |
+------+--------+---------+-------+------+
|    5 | 小黄   | 化学    |    99 |    1 |
|   17 | 小青   | 化学    |    96 |    2 |
|   15 | 小绿   | 化学    |    95 |    3 |
|   10 | 小红   | 化学    |    70 |    4 |
|    1 | 小黄   | 数学    |   100 |    1 |
|    6 | 小红   | 数学    |    90 |    2 |
|   11 | 小绿   | 数学    |    90 |    3 |
|   16 | 小青   | 数学    |    30 |    4 |
|    4 | 小黄   | 物理    |   100 |    1 |
|   14 | 小绿   | 物理    |    94 |    2 |
|    9 | 小红   | 物理    |    90 |    3 |
|   17 | 小青   | 物理    |    88 |    4 |
|   13 | 小绿   | 英语    |    93 |    1 |
|    3 | 小黄   | 英语    |    80 |    2 |
|    8 | 小红   | 英语    |    80 |    3 |
|   17 | 小青   | 英语    |    70 |    4 |
|    7 | 小红   | 语文    |   100 |    1 |
|   17 | 小青   | 语文    |   100 |    2 |
|   12 | 小绿   | 语文    |    92 |    3 |
|    2 | 小黄   | 语文    |    90 |    4 |
+------+--------+---------+-------+------+
20 rows in set (0.00 sec)

--rank:数学成绩90 排第几名:

root@my3308.sock-8.0.11>[test]>select * from window_test where subject='数学' order by score desc;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 小黄   | 数学    |   100 |
|    6 | 小红   | 数学    |    90 |
|   11 | 小绿   | 数学    |    90 |
|   16 | 小青   | 数学    |    30 |
+------+--------+---------+-------+
4 rows in set (0.00 sec)

root@my3308.sock-8.0.11>[test]>select * from (
select *,rank() over(partition by subject order by score desc
) as 'rank' from window_test) x 
where  x.subject='数学' and   x.score=90;
+------+--------+---------+-------+------+
| id   | name   | subject | score | rank |
+------+--------+---------+-------+------+
|    6 | 小红   | 数学    |    90 |    2 |
|   11 | 小绿   | 数学    |    90 |    2 |
+------+--------+---------+-------+------+
2 rows in set (0.00 sec)

--dense_rank:查询每门课的前2名:

root@my3308.sock-8.0.11>[test]>select name,subject,score from (select *,dense_rank()  over(partition by subject order by score desc) as 'rank' from window_test) x where x.rank<=2;
+--------+---------+-------+
| name   | subject | score |
+--------+---------+-------+
| 小黄   | 化学    |    99 |
| 小青   | 化学    |    96 |
| 小黄   | 数学    |   100 |
| 小红   | 数学    |    90 |
| 小绿   | 数学    |    90 |
| 小黄   | 物理    |   100 |
| 小绿   | 物理    |    94 |
| 小绿   | 英语    |    93 |
| 小黄   | 英语    |    80 |
| 小红   | 英语    |    80 |
| 小红   | 语文    |   100 |
| 小青   | 语文    |   100 |
| 小绿   | 语文    |    92 |
+--------+---------+-------+
13 rows in set (0.00 sec)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
11月前
|
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()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
510 11
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
433 1
MySQL8 窗口函数
|
12月前
|
移动开发 关系型数据库 MySQL
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。ROW_NUMBER在分页、去重、分组内排序等场景中非常有用。
558 4
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数:原理和使用
MySQL窗口函数:原理和使用
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数详解(概念+练习+实战)
MySQL窗口函数详解(概念+练习+实战)
2714 1
|
关系型数据库 MySQL
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
693 1
|
关系型数据库 MySQL Serverless
【随手记】MySQL窗口函数计算累加和
【随手记】MySQL窗口函数计算累加和
939 0
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
114 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。

推荐镜像

更多