在低于Mysql8.0之前的版本中,要对序列进行排序的话需要用到自定义参数@,但是8.0+版本中加入了oracle中的窗口函数,rank()、row_num()、dense_rank()等函数。

下面简单举几个例子介绍下这几个函数的应用。测试用的表主要有两个,一个是学生信息表student,二是学生分数表sc,具体的测试数据的mysql插入语句在另一篇博客:Mysql经典练习题与知识点总结中,大家可以在Mysql中试着插入并测试。但Mysql的版本要高于8.0,具体安装过程可以在其他博客中找一下。

row_number()

它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

row_num() over (order by字段1)以字段1排序,生成行号

rank()

用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。

rank() over (partition by字段1 order by 字段2)

按字段1分组并按字段2倒序排序,输出结果。partition by非必要,order by是必要的。

partition by非必要,order by必要

dense_rank()

与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

dense_rank() over (partition by字段1 order by 字段2)

关于partition by和group by的区别

partition by一般用于over字句中,group by顺序正常

partition by会保留所有的记录,并依据order by的结果依次输出,而group by则通常与聚合函数一起使用,只会返回聚合后的唯一记录。

student表

+------+-------+---------------------+------+

| Sid | Sname | Sage | Ssex |

+------+-------+---------------------+------+

| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 |

| 02 | 钱电 | 1990-12-21 00:00:00 | 男 |

| 03 | 孙风 | 1990-05-20 00:00:00 | 男 |

| 04 | 李云 | 1990-08-06 00:00:00 | 男 |

| 05 | 周梅 | 1991-12-01 00:00:00 | 女 |

| 06 | 吴兰 | 1992-03-01 00:00:00 | 女 |

| 07 | 郑竹 | 1989-07-01 00:00:00 | 女 |

| 08 | 王菊 | 1990-01-20 00:00:00 | 女 |

+------+-------+---------------------+------+

8 rows in set (0.00 sec)

sc表

+------+------+-------+

| Sid | Cid | score |

+------+------+-------+

| 01 | 01 | 80.0 |

| 01 | 02 | 90.0 |

| 01 | 03 | 99.0 |

| 02 | 01 | 70.0 |

| 02 | 02 | 60.0 |

| 02 | 03 | 80.0 |

| 03 | 01 | 80.0 |

| 03 | 02 | 80.0 |

| 03 | 03 | 80.0 |

| 04 | 01 | 50.0 |

| 04 | 02 | 30.0 |

| 04 | 03 | 20.0 |

| 05 | 01 | 76.0 |

| 05 | 02 | 87.0 |

| 06 | 01 | 31.0 |

| 06 | 03 | 34.0 |

| 07 | 02 | 89.0 |

| 07 | 03 | 98.0 |

+------+------+-------+

18 rows in set (0.00 sec)

rank()和dense_rank()

1. 对学生总成绩从大到小排序,并查询学生信息,没有成绩的也显示。

SELECT

s.*, rank () over (ORDER BY sum(sc.score) DESC) AS rank_01

FROM

student s LEFT JOIN

sc

ON

s.Sid = sc.Sid

GROUP BY

sc.Sid;

结果

+------+-------+---------------------+------+---------+

| Sid | Sname | Sage | Ssex | rank_01 |

+------+-------+---------------------+------+---------+

| 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | 1 |

| 03 | 孙风 | 1990-05-20 00:00:00 | 男 | 2 |

| 02 | 钱电 | 1990-12-21 00:00:00 | 男 | 3 |

| 07 | 郑竹 | 1989-07-01 00:00:00 | 女 | 4 |

| 05 | 周梅 | 1991-12-01 00:00:00 | 女 | 5 |

| 04 | 李云 | 1990-08-06 00:00:00 | 男 | 6 |

| 06 | 吴兰 | 1992-03-01 00:00:00 | 女 | 7 |

| 08 | 王菊 | 1990-01-20 00:00:00 | 女 | 8 |

+------+-------+---------------------+------+---------+

如果见到null的情况下要显示,则需要left join

rank() over(partition by 字段1 order by字段2 desc) 按字段1分组并按字段2倒序排序,输出结果。partition by非必要,order by是必要的。

2、查询各科成绩前三名的记录

SELECT * FROM

(SELECT *, rank () over (PARTITION BY Cid ORDER BY score DESC) AS grade

FROM sc) AS t

WHERE t.grade <= 3;

+------+------+-------+-------+

| Sid | Cid | score | grade |

+------+------+-------+-------+

| 01 | 01 | 80.0 | 1 |

| 03 | 01 | 80.0 | 1 |

| 05 | 01 | 76.0 | 3 |

| 01 | 02 | 90.0 | 1 |

| 07 | 02 | 89.0 | 2 |

| 05 | 02 | 87.0 | 3 |

| 01 | 03 | 99.0 | 1 |

| 07 | 03 | 98.0 | 2 |

| 02 | 03 | 80.0 | 3 |

| 03 | 03 | 80.0 | 3 |

+------+------+-------+-------+

10 rows in set (0.00 sec)

如果要对rank的结果进行进一步选择的话,采用结构select * from (select rank()) where 的句式

partition by 是在保留所有记录的情况下,按字段顺序排序,类似于excel的筛选功能。

mysql8 中的rank_Mysql8.0+中的rank()、row_num()、dense_rank()等窗口函数相关推荐

  1. .net 2.0 中 DataTable 小兵变大将

    我们先看一段WEB Service的代码. [WebMethod] public DataTable GetInfo() ...{ OleDbConnection nwindConn = new Ol ...

  2. ASP.NET 2.0中DataTable小兵变大将

    我们先看一段WEBService的代码. [WebMethod] publicDataTableGetInfo() ...{ OleDbConnectionnwindConn=newOleDbConn ...

  3. ASP.NET 2.0中DataTable小兵变大将(转自AspCool)

    全文转自ASPCool,地址:http://www.aspcool.com/lanmu/browse1.asp?ID=1725&bbsuser=aspnet.感谢作者蝈蝈俊!收藏以作研究. 我 ...

  4. 修改mysql8.0中数据库的名字

    前言: 今日在照着书本敲mysql命令,其中在学到数据库的更名的时候,我按照书本上的命令rename database oldname to newname:来更改数据库名就报错了.然后在网上查资料可 ...

  5. MYSQL8.0中关于load data infile命令

    MYSQL8.0中关于load data infile命令 提醒:遇到软件不同版本时,参考文档才是最佳的学习资料. 在学习mysql注入时认识了 LOAD DATA INFILE 语句.在注入时我们会 ...

  6. mysql8 rank_MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    窗口函数简介MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条 ...

  7. mysql8.0 服务移除_MySQL8.0中已移除的特性,功能

    1. 说明 本文所说的都是已经从MySQL8.0中删除的特性,如果是从低版本升级到8.0的应用,如果使用到了这些特性应该注意避免使用这些特性或找到替代的特性.如:对于MySQL5.7和8.0的主从环境 ...

  8. 如何在mysql8.0中导入导出数据库

    作为一个准备开始好好学习代码的小菜鸟,第一步就是借鉴. 借鉴别人代码的时候,会出现一个令很多男女面红耳燥的羞羞的问题,不会导入数据库文件(youaremybaby.sql),这是我在mysql8.0中 ...

  9. MySQL8.0中消失又回来的磁盘临时表

    * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1.引子 2.发现问题 3.破题 4.总结 1.引子 首先,我是一个标题党^_^,写这样的标题就是为了吸引你们来看的. ...

最新文章

  1. 学好单片机能找什么工作?单片机好学吗?
  2. laravel 模型查找数据
  3. excel中最常用的30个函数_94个Excel常用函数目录
  4. Excel弱爆了!这个工具30分钟完成了我一天的工作量!
  5. 【数据结构和算法】哈希表详解
  6. AMD Catalyst 14.4 Linux带来完整的 OpenGL 4.4 支持
  7. 管理员说:CSDN博客,一天访问量1000就很好了
  8. 快速启动工具入门——以Launchy为例(一)
  9. 一款功能强大、高颜值、官方出品的Redis可视化工具
  10. 计算机网络基础 (一) —— 概念、组成、功能、分类
  11. 芯片破壁者(十二.下):青瓦台魔咒与半导体“死亡谷”
  12. Windows提示:您的许可证即将过期
  13. wnmp的php会自动挂掉,初探wnmp php
  14. 画图软件修改图片分辨率
  15. python导入库关键词_怎么样导入RobotFramework 自定义关键字(库文件)
  16. 绝热锥形与adc psr
  17. 计算机安全原理与实践第3版PDF,windows安全原理与技术.pdf
  18. flash插件替换方案-把uploadfy替换为uploadfive
  19. 获取QQ音乐歌曲播放源地址
  20. 微信curl上传客服头像接口遇到的坑

热门文章

  1. 微信公众号开发(总结)
  2. 华清远见嵌入式开发学习的6大阶段
  3. java邮件登录系统设计_基于Java web的邮件管理系统的设计与实现(含源文件).doc
  4. 银联电子支付ChinaPay支付回调验证问题
  5. 2014阿里校园招聘软件工程师笔试题(9.22武汉站)
  6. python gui tkinter_Python GUI tkinter 学习笔记(一)
  7. 【CSS】内联样式,内部样式表,外部样式表
  8. Topsis模型小记
  9. python区间分布统计_常见概率统计分布及Python实现
  10. c语言比率分布 函数 rate(m),R语言中统计分布和模拟_R语言培训