MySQL讲义第49讲——select 查询之查询练习(七):使用多种方法添加排名
MySQL讲义第49讲——select 查询之查询练习(七):使用多种方法添加排名
文章目录
- MySQL讲义第49讲——select 查询之查询练习(七):使用多种方法添加排名
- 一、使用变量生成排名
- 1、不考虑重复数据
- 2、重复数据生成并列排名
- 3、重复数据生成并列排名,同时重复的数据也占用名次
- 二、使用自连接
- 1、重复数据生成并列排名
- 2、重复数据生成并列排名,同时重复的数据也占用名次
MySQL 没有提供 RANK() 函数,要生成排名,可以使用变量来完成。查询需要使用四张表,分别是:student、teacher、course 和 electives,表结构如下:
CREATE TABLE student(s_id char(5) primary key,s_name char(20),birth datetime,phone char(20),addr varchar(100)
);INSERT INTO student
VALUES('S2011','张晓刚','1999-12-3','13163735775','信阳市'),
('S2012','刘小青','1999-10-11','13603732255','新乡市'),
('S2013','曹梦德','1998-2-13','13853735522','郑州市'),
('S2014','刘艳','1998-6-24','13623735335','郑州市'),
('S2015','刘岩','1999-7-6','13813735225','信阳市'),
('S2016','刘若非','2000-8-31','13683735533','开封市'),
('S2021','董雯花','2000-7-30','13533735564','开封市'),
('S2022','周华建','1999-5-25','13243735578','郑州市'),
('S2023','特朗普','1999-6-21','13343735588','新乡市'),
('S2024','奥巴马','2000-10-17','13843735885','信阳市'),
('S2025','周健华','2000-8-22','13788736655','开封市'),
('S2026','张学有','1998-7-6','13743735566','郑州市'),
('S2031','李明博','1999-10-26','13643732222','郑州市'),
('S2032','达芬奇','1999-12-31','13043731234','郑州市');CREATE TABLE teacher(t_id char(5) primary key,t_name char(20),job_title char(20),phone char(20)
);INSERT INTO teacher
VALUES('T8001','欧阳修','教授','13703735666'),
('T8002','华罗庚','教授','13703735888'),
('T8003','钟南山','教授','13703735675'),
('T8004','钱学森','教授','13703735638'),
('T8005','李白','副教授','13703735828'),
('T8006','孔子','教授','13703735457'),
('T8007','王安石','副教授','13703735369');CREATE TABLE course(c_id char(4) primary key,c_name char(20),t_id char(5)
);INSERT INTO course
VALUES('C101','古代文学','T8001'),
('C102','高等数学','T8002'),
('C103','线性代数','T8002'),
('C104','临床医学','T8003'),
('C105','传染病学','T8003'),
('C106','大学物理','T8004'),
('C107','诗歌欣赏','T8005'),
('C108','教育学','T8006'),
('C109','刑事诉讼法','T8007'),
('C110','经济法','T8007');CREATE TABLE score(s_id char(5),c_id char(4),score int,primary key(s_id, c_id)
);INSERT INTO score
VALUES('S2011','C102',84),('S2011','C105',90),('S2011','C106',79),('S2011','C109',65),
('S2012','C101',67),('S2012','C102',52),('S2012','C103',55),('S2012','C104',86),
('S2012','C105',87),('S2012','C106',64),('S2012','C107',62),
('S2012','C108',73),('S2012','C109',78),('S2012','C110',89),
('S2013','C102',97),('S2013','C103',68),('S2013','C104',66),('S2013','C105',8),
('S2014','C102',90),('S2014','C103',85),('S2014','C104',77),('S2014','C105',96),
('S2015','C101',69),('S2015','C102',66),('S2015','C103',88),('S2015','C104',69),
('S2015','C105',66),('S2015','C106',88),('S2015','C107',69),
('S2015','C108',66),('S2015','C109',88),('S2015','C110',69),
('S2016','C101',65),('S2016','C102',84),('S2016','C107',82),('S2016','C108',56),
('S2021','C102',72),('S2021','C103',90),('S2021','C104',90),('S2021','C105',57),
('S2022','C102',97),('S2022','C103',93),('S2022','C109',47),('S2022','C110',62),
('S2023','C102',68),('S2023','C103',86),('S2023','C109',56),('S2023','C110',91),
('S2024','C102',87),('S2024','C103',97),('S2024','C109',80),('S2024','C110',81),
('S2025','C102',61),('S2025','C105',62),('S2025','C106',87),('S2025','C109',82),
('S2026','C102',84),('S2026','C105',48),('S2026','C106',90),('S2026','C109',73);
一、使用变量生成排名
1、不考虑重复数据
查询课程【高等数学】成绩,按成绩高低进行排序,并显示排名。如果不考虑排名时的重复数据,则使用以下的命令:
SET @rank = 0;
SELECTs.s_id,s.s_name,sc.score,@rank := @rank +1 AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id
WHEREsc.c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')
ORDER BYsc.score DESC
;
+-------+-----------+-------+------+
| s_id | s_name | score | rank |
+-------+-----------+-------+------+
| S2013 | 曹梦德 | 97 | 1 |
| S2022 | 周华建 | 97 | 2 |
| S2014 | 刘艳 | 90 | 3 |
| S2024 | 奥巴马 | 87 | 4 |
| S2011 | 张晓刚 | 84 | 5 |
| S2016 | 刘若非 | 84 | 6 |
| S2026 | 张学有 | 84 | 7 |
| S2021 | 董雯花 | 72 | 8 |
| S2023 | 特朗普 | 68 | 9 |
| S2015 | 刘岩 | 66 | 10 |
| S2025 | 周健华 | 61 | 11 |
| S2012 | 刘小青 | 52 | 12 |
+-------+-----------+-------+------+
12 rows in set (0.01 sec)---############# 在 FROM 子句中定义变量并赋值 ##########################
SELECTs.s_id,s.s_name,sc.score,@rank := @rank +1 AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id ,(SELECT @rank := 0) rank
WHEREsc.c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')
ORDER BYsc.score DESC
;
+-------+-----------+-------+------+
| s_id | s_name | score | rank |
+-------+-----------+-------+------+
| S2013 | 曹梦德 | 97 | 1 |
| S2022 | 周华建 | 97 | 2 |
| S2014 | 刘艳 | 90 | 3 |
| S2024 | 奥巴马 | 87 | 4 |
| S2011 | 张晓刚 | 84 | 5 |
| S2016 | 刘若非 | 84 | 6 |
| S2026 | 张学有 | 84 | 7 |
| S2021 | 董雯花 | 72 | 8 |
| S2023 | 特朗普 | 68 | 9 |
| S2015 | 刘岩 | 66 | 10 |
| S2025 | 周健华 | 61 | 11 |
| S2012 | 刘小青 | 52 | 12 |
+-------+-----------+-------+------+
12 rows in set (0.02 sec)
2、重复数据生成并列排名
查询课程【高等数学】成绩,按成绩高低进行排序,并显示排名。如果考虑排名时的重复数据,则使用以下的命令:
--说明:使用变量 @sc 保存上一条记录的成绩,如果与上一条记录相同,则名次不增加,如果不相同,
-- 则把当前记录的成绩赋给变量,同时名次加 1
SELECTs.s_id,s.s_name,sc.score,@rank := @rank + (CASE WHEN @sc = sc.score THEN 0 WHEN @sc :=sc.score THEN 1 END) AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id ,(SELECT @rank := 0) rank, (SELECT @sc := null) sc_1
WHEREsc.c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')
ORDER BYsc.score DESC
;
+-------+-----------+-------+------+
| s_id | s_name | score | rank |
+-------+-----------+-------+------+
| S2013 | 曹梦德 | 97 | 1 |
| S2022 | 周华建 | 97 | 1 |
| S2014 | 刘艳 | 90 | 2 |
| S2024 | 奥巴马 | 87 | 3 |
| S2011 | 张晓刚 | 84 | 4 |
| S2016 | 刘若非 | 84 | 4 |
| S2026 | 张学有 | 84 | 4 |
| S2021 | 董雯花 | 72 | 5 |
| S2023 | 特朗普 | 68 | 6 |
| S2015 | 刘岩 | 66 | 7 |
| S2025 | 周健华 | 61 | 8 |
| S2012 | 刘小青 | 52 | 9 |
+-------+-----------+-------+------+
12 rows in set (0.00 sec)
3、重复数据生成并列排名,同时重复的数据也占用名次
SELECT@index := @index + 1 AS idx,s.s_id,s.s_name,sc.score,@rank := (CASE WHEN @sc = sc.score THEN @rankWHEN @sc :=sc.score THEN @indexEND) AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id ,(SELECT @rank := 0) rank, (SELECT @sc := null) sc_1, (SELECT @index := 0) idx
WHEREsc.c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')
ORDER BYsc.score DESC
;
+------+-------+-----------+-------+------+
| idx | s_id | s_name | score | rank |
+------+-------+-----------+-------+------+
| 1 | S2013 | 曹梦德 | 97 | 1 |
| 2 | S2022 | 周华建 | 97 | 1 |
| 3 | S2014 | 刘艳 | 90 | 3 |
| 4 | S2024 | 奥巴马 | 87 | 4 |
| 5 | S2011 | 张晓刚 | 84 | 5 |
| 6 | S2016 | 刘若非 | 84 | 5 |
| 7 | S2026 | 张学有 | 84 | 5 |
| 8 | S2021 | 董雯花 | 72 | 8 |
| 9 | S2023 | 特朗普 | 68 | 9 |
| 10 | S2015 | 刘岩 | 66 | 10 |
| 11 | S2025 | 周健华 | 61 | 11 |
| 12 | S2012 | 刘小青 | 52 | 12 |
+------+-------+-----------+-------+------+
12 rows in set (0.00 sec)
二、使用自连接
1、重复数据生成并列排名
SELECTsc.s_id,s.s_name,sc.score,(SELECT COUNT(*) + 1FROM (SELECT DISTINCT scoreFROM scoreWHERE c_id = @c_id) sc_distinctWHERE sc_distinct.score > sc.score) AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id,(SELECT @c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')) gdsx
WHEREsc.c_id = @c_id
ORDER BYsc.score DESC
;
+-------+-----------+-------+------+
| s_id | s_name | score | rank |
+-------+-----------+-------+------+
| S2013 | 曹梦德 | 97 | 1 |
| S2022 | 周华建 | 97 | 1 |
| S2014 | 刘艳 | 90 | 2 |
| S2024 | 奥巴马 | 87 | 3 |
| S2011 | 张晓刚 | 84 | 4 |
| S2016 | 刘若非 | 84 | 4 |
| S2026 | 张学有 | 84 | 4 |
| S2021 | 董雯花 | 72 | 5 |
| S2023 | 特朗普 | 68 | 6 |
| S2015 | 刘岩 | 66 | 7 |
| S2025 | 周健华 | 61 | 8 |
| S2012 | 刘小青 | 52 | 9 |
+-------+-----------+-------+------+
12 rows in set (0.01 sec)
2、重复数据生成并列排名,同时重复的数据也占用名次
--########### rank 列统计比当前成绩大的成绩的数量,加 1 得到名次 #################
SELECTsc.s_id,s.s_name,sc.score,(SELECT COUNT(*) + 1FROM score WHERE c_id = @c_id AND score > sc.score) AS rank
FROMscore sc JOIN student sON sc.s_id = s.s_id,(SELECT @c_id = (SELECT c_idFROM courseWHERE c_name = '高等数学')) gdsx
WHEREsc.c_id = @c_id
ORDER BYsc.score DESC
;
+-------+-----------+-------+------+
| s_id | s_name | score | rank |
+-------+-----------+-------+------+
| S2013 | 曹梦德 | 97 | 1 |
| S2022 | 周华建 | 97 | 1 |
| S2014 | 刘艳 | 90 | 3 |
| S2024 | 奥巴马 | 87 | 4 |
| S2011 | 张晓刚 | 84 | 5 |
| S2016 | 刘若非 | 84 | 5 |
| S2026 | 张学有 | 84 | 5 |
| S2021 | 董雯花 | 72 | 8 |
| S2023 | 特朗普 | 68 | 9 |
| S2015 | 刘岩 | 66 | 10 |
| S2025 | 周健华 | 61 | 11 |
| S2012 | 刘小青 | 52 | 12 |
+-------+-----------+-------+------+
12 rows in set (0.01 sec)
MySQL讲义第49讲——select 查询之查询练习(七):使用多种方法添加排名相关推荐
- MySQL讲义第 39 讲——select 查询之函数(2):日期时间型函数
MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 文章目录 MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 一.数据准备 二.MySQL 日期时间型函 ...
- MySQL讲义第 41 讲——select 查询之函数(4):流程控制函数
MySQL讲义第41讲--select 查询之函数(4):流程控制函数 文章目录 MySQL讲义第41讲--select 查询之函数(4):流程控制函数 一.数据准备 二.MySQL 流程控制函数介绍 ...
- MySQL讲义第 40 讲——select 查询之函数(3):数学函数
MySQL讲义第40讲--select 查询之函数(3):数学函数 文章目录 MySQL讲义第40讲--select 查询之函数(3):数学函数 一.数据准备 二.MySQL 数学函数介绍 1.ABS ...
- MySQL讲义第 35 讲——select 查询之正则表达式
MySQL讲义第 35 讲--select 查询之正则表达式 文章目录 MySQL讲义第 35 讲--select 查询之正则表达式 一.正则表达式匹配规则 二.数据准备 三.查询包含某些字符的字段信 ...
- MySQL讲义第 33 讲——select 查询之静态交叉表查询
MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...
- MySQL讲义第27讲——select 查询之自连接查询
MySQL讲义第27讲--select 查询之自连接查询 文章目录 MySQL讲义第27讲--select 查询之自连接查询 一.数据准备 二.对自连接的理解 三.把以上的查询用自连接表示 顾名思义, ...
- MySQL讲义第 32 讲——select 查询之 select 语句的执行顺序
MySQL讲义第 32 讲--select 查询之 select 语句的执行顺序 文章目录 MySQL讲义第 32 讲--select 查询之 select 语句的执行顺序 一.SELECT 语句的语 ...
- MySQL讲义第 30 讲——select 查询之子查询
MySQL讲义第 30 讲--select 查询之子查询 文章目录 MySQL讲义第 30 讲--select 查询之子查询 一.标量子查询 1.查询高于所有员工平均工资的员工信息 2.查询工资比王涛 ...
- MySQL讲义第 36 讲——select 查询之 INTO OUTFILE参数
MySQL讲义第 36 讲--select 查询之 INTO OUTFILE参数 文章目录 MySQL讲义第 36 讲--select 查询之 INTO OUTFILE参数 一.SELECT ... ...
- MySQL讲义第 31 讲—— DML 语句与 select 查询
MySQL讲义第 31 讲-- DML 语句与 select 查询 文章目录 MySQL讲义第 31 讲-- DML 语句与 select 查询 一. INSERT ... SELECT 语句 二.D ...
最新文章
- 【编程好习惯】青睐小粒度锁
- 输入n个字符串字典序排序_FSST - 快速字符串压缩算法
- Linux 中 7 个判断文件系统类型的方法
- Web MVC Rest 处理流程分析
- 修改after样式_理解:Before和:After伪元素
- [NOI2015]软件包管理器
- 手机知识:手机的快充技术是什么,看完本文你就明白了!
- python爬虫什么结构好_python爬虫入门:爬虫基础了解一下 !! 盘它
- Query DSL(2)----Full text queries
- 小白初学Vue之 组件与实例的关系 初试篇
- ZLYZD团队第四周项目总结
- tab选项卡不同样式的效果
- 信息学奥赛一本通2061
- 机器学习算法初识—二分k均值算法
- 通过AT指令将air202 接入阿里云
- bzoj5369: [PKUSC2018]最大前缀和 (状压dp)
- 从入门到变现|全面解析视频号运营规则,看完少走3天弯路!
- nas 微型计算机,商为家用的利器 希捷BS 2- Bay NAS
- 凌晨3点不回家:因为想不到的心酸!
- oracle 00002,imp-00002错误
热门文章
- epson连接计算机后无法打印,电脑连接爱普生打印机后无法打印如何解决
- 用PyAV完成视频解码之后,如何完成视频分辨率的转换?
- 有限体积法求解二维方腔流(三)——代码以及与icoFoam结果对比
- swagger设置字段required必填
- Google assisant 2018谷歌IO大会 谷歌助理背后的系统设计
- stata01 - stata基础
- [4.2]-AutoSAR零基础学习-XCP 测量/校准 <<2>>
- 浅谈快速沃尔什变换(FWT)快速莫比乌斯变换(FMT)
- BS模型和CS模型的介绍和区别
- HTB[Tier 0]Appointment题解