这里有个需求,就是将下列的学生成绩表进行排名
1.创建学生成绩表
#####创建新表######## CREATE TABLE `s_score` ( `id` int NOT NULL AUTO_INCREMENT, `score` int NOT NULL DEFAULT 0, `name` varchar(20) CHARACTER SET utf8mb4 NULL, PRIMARY KEY (`id`) );
2.插入数据
###插入数据########## INSERT INTO `s_score` (`name`, `score`) VALUES ('张三', 80), ('小明', 90), ('小红', 60), ('李四', 70), ('赵武', 80), ('梁晨', 87), ('小绿', 69), ('威廉', 69), ('大卫', 91), ('王五', 96), ('赵六', 96), ('小五', 80), ('小龙', 88);
3.查看情况:
2.给一个普通排名
select name,score, @rank:=@rank+1 rank from s_score s,(select @rank:=0) q order by score desc;
3.给一个并列排名
##并列排名### SELECT NAME, score, CASE WHEN @temp_score = score THEN @rank WHEN @temp_score := score THEN @rank :=@rank + 1 END as rank FROM s_score s, ( SELECT @rank := 0 ,@temp_score := NULL ) as r ORDER BY score DESC
4.给一个跳过排名
##并排名词跳过### SELECT NAME, score, rank FROM ( SELECT NAME, score ,@rank := IF ( @temp_score = score, @rank, @rank_incr ) `rank` ,@rank_incr := @rank_incr + 1, @temp_score := score FROM s_score s, ( SELECT@rank := 0 ,@temp_rank := NULL ,@rank_incr := 1 ) q ORDER BY score DESC ) a
######################Mysql8.0中增加了窗口函数##############
窗口函数的基本语法如下:
select 排序函数/聚合函数 over (<partition by ...> 分区字段 order by 排序字段)
说明:注意over后面有一个空格
partiton by是可选的。如果不使用partition by,那么就是将整张表作为一个集合,最后使用排序函数得到的就是每一条记录根据排序列的排序编号。
排序函数主要有rank()、dense_rank、row_number,他们主要区别
- rank(): 对同一个字段排序,出现相同时,会并列排名,并且会出现排名间隙。
- dense_rank() : 对同一个字段排序,出现相同时,会出现并列排名,排名连续的
- row_number(): 对同一个字段排序,排名是联系的,即使出现相同,不会并列排名次
操作:
SELECT NAME, score, RANK () over (ORDER BY score DESC) `rank`, ROW_NUMBER () over (ORDER BY score DESC) `row`, DENSE_RANK () over (ORDER BY score DESC) `dense` FROM s_score
转载于:https://cloud.tencent.com/developer/article/1562954
https://segmentfault.com/a/1190000023334323