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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

本节主要介绍排序类 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)
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
3月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
11天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
19天前
|
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()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
59 11
|
1月前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
58 9
|
2月前
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
MySQL8 窗口函数
|
2月前
|
移动开发 关系型数据库 MySQL
MySQL中的ROW_NUMBER窗口函数简单了解下
ROW_NUMBER是 MySQL8引入的窗口函数之一,它为查询结果集中的每一行分配一个唯一的顺序号(行号)。ROW_NUMBER在分页、去重、分组内排序等场景中非常有用。
51 4
|
2月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
129 4
|
2月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
|
3月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。