1.ROW_NUMBER() 函数

依次排序,没有并列名次。如

SELECT st.ID '学号', st.`NAME` '姓名', sc.SCORE '成绩', ROW_NUMBER() OVER(ORDER BY sc.SCORE DESC) '排名'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

可以看出,尽管存在相同的成绩(98.0、91.0),但是排名并没有并列,而是按顺序依次排号。

2.RANK() 函数

有并列名次,且并列名次会占用序号,因此名次之间可能会有间隔。如

SELECT st.ID '学号', st.`NAME` '姓名', sc.SCORE '成绩', RANK() OVER(ORDER BY sc.SCORE DESC) '排名'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

可以看出,相同的成绩(98.0、91.0)的排名是相同的(并列第2名、并列第5名),且并列的名次会占用序号,因此与它下一个名次之间会有间隔。

显然这种结果是最符合实际生活中的排名的。

3.DENSE_RANK() 函数

有并列名次,但并列名次不占用序号,因此名次都是紧密相连的。如

SELECT st.ID '学号', st.`NAME` '姓名', sc.SCORE '成绩', DENSE_RANK() OVER(ORDER BY sc.SCORE DESC) '排名'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

查询结果为

可以看出,相同的成绩(98.0、91.0)的排名是相同的(并列第2名、并列第5名),但并列的名次并会占用序号,因此与它下一个名次之间没有间隔,所有名次都是紧密相连的。

4.NTILE() 函数

NTILE(n) 函数可以将返回的结果排序,如

SELECT st.ID '学号', st.`NAME` '姓名', sc.SCORE '成绩', NTILE(4) OVER(ORDER BY sc.SCORE DESC) '组号'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

表示将成绩按从大到小排序后,把结果分为4组。由于总记录数为8条,因此每组会有2条记录:

这样每组的记录数是均匀的。

但如果查询结果的总记录数不能被指定的要分的组的总数整数,则分得的每组中的记录数是不均匀的,如

SELECT st.ID '学号', st.`NAME` '姓名', sc.SCORE '成绩', NTILE(3) OVER(ORDER BY sc.SCORE DESC) '组号'
FROM Student st
LEFT JOIN Score sc ON sc.STUDNET_ID = st.ID

由于 8 不能被 3 整除,因此得到的 3 组中每组的记录数不是完全一样的,而是按照 3、3、2 分配的,即"尽量"保证了均匀。

小白养成记——MySQL中的排名函数的更多相关文章

  1. 小白养成记——Linux中的用户和权限管理

    1.用户组管理 每个用户都属于一个用户组,系统可以对一个用户组中的所有用户进行集中管理. 在创建用户时,如果未指定组,则系统会创建一个与用户名同名的组. 以下是关于用户组管理的一些基本命令: 新建用户 ...

  2. Mysql中使用find_in_set函数查找字符串

    mysql有个表的字段的存储是以逗号分隔的,如domain字段login.s01.yy.com,s01.yy.com,s02.yy.com.现在要查找s01.yy.com这个.我们用like查找好像不 ...

  3. mysql中的group_concat函数的用法

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: grou ...

  4. SQLServer 中实现类似MySQL中的group_concat函数的功能

    SQLServer中没有MySQL中的group_concat函数,可以把分组的数据连接在一起. 后在网上查找,找到了可以实现此功能的方法,特此记录下. SELECT a, stuff((SELECT ...

  5. SQL点滴20—T-SQL中的排名函数

    原文:SQL点滴20-T-SQL中的排名函数 提到排名函数我们首先可能想到的是order by,这个是排序,不是排名,排名需要在前面加个名次序号的,order by是没有这个功能的.还可能会想到ide ...

  6. mysql中的substr()函数

    mysql中的substr()函数和hibernate的substr()参数都一样,就是含义有所不同. 用法: substr(string string,num start,num length); ...

  7. Mysql中常用的函数汇总

    Mysql中常用的函数汇总: 一.数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)ceiling(x) 返回大于x的最小整数值exp(x) 返回 ...

  8. Mysql中使用聚合函数对null值的处理

    平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t ...

  9. Mysql中的常用函数:

    Mysql中的常用函数: 1.字符串函数: (1).合并字符串 concat():// concat('M','y',"SQL",'5.5');== MySQL5.5//当传入的参 ...

随机推荐

  1. cassandra权威指南读书笔记--配置cassadnra

    配置集群时,要求所有节点的集群名,分区器,snitch必须相同.种子节点最好相同. 种子节点:最好每个DC,配置2个,这样即使一个DC中一个种子节点挂了,仍然有一个中子节点可用.种子节点被认为是最先加 ...

  2. 【STM32】PWM波中的时间问题

    我们使用的TIM3定时器是挂载在APB1总线上的,APB1总线的时钟频率为72MHz. APB1总线的时钟频率通过PSC寄存器预分频,得到的频率为(72/(71+1))=1MHz. 定时器的自动重装载 ...

  3. NMAP学习笔记

    nmap(Network Mapper)是一款用于网络扫描和安全审计软件开源软件,支持Windows.Mac.Linux等多个平台.同时,很多网络管理员也用它来进行网络设备管理.服务升级和主机监控.N ...

  4. 如何获得svn的版本号信息?

    方法一  popen(可获取命令行执行后的输出结果) 转载自: C++执行命令行指令并获取命令行执行后的输出结果 1 /* 2 Execute command line commands and ge ...

  5. A. Little Elephant and Interval

    The Little Elephant very much loves sums on intervals. This time he has a pair of integers l and r ( ...

  6. AtCoder AIsing Programming Contest 2020 D - Anything Goes to Zero (二进制,模拟)

    题意:给你一个长度为\(n\)的\(01\)串,从高位到低位遍历,对该位取反,用得到的十进制数\(mod\)所有位上\(1\)的个数,不断循环直到为\(0\),输出每次遍历时循环的次数. 题解:根据题 ...

  7. 连接MongoDb数据库 -- Python

    1.安装完mongoDb数据库后,如果需要我们的Python程序和MongoDb数据库进行交互,需要安装pymongo模块: 安装方式:采用pip install pymongo的方式 Microso ...

  8. CF1463-D. Pairs

    CF1463-D. Pairs 题意: 有从\(1\)到\(2n\)一共\(2n\)个数字,让你将这\(2n\)个数字分成\(n\)组,每组有两个数字.对于这\(n\)组数字,你可以从中挑选\(x\) ...

  9. Eureka详解系列(五)--Eureka Server部分的源码和配置

    简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...

  10. k8s二进制部署 - flannel安装

    安装Flannel [root@hdss7-21 ~]# cd /opt/src/ [root@hdss7-21 src]# wget https://github.com/coreos/flanne ...