一、对查询结果进行排序(ORDER BY)
1.ORDED BY 子句
使用SELECT抽取数据时,数据的显示是无序的,想要得到有序的数据,那么我们就需要使用ORDER BY子句进行排序。
2.ORDED BY 子句语法:
SELECT <列1>,<列2>,<列3>,......
FROM <表名>
ORDER BY <排序基准1>,<排序基准2>,.....
ORDED BY 子句(商品的销售单价升序排列)
其中desc表示降序,asc表示升序排列。
二、rank,dense_rank,row_number 使用上的区别
RANK:跳跃排序
DENSE_RANK:连续排序
row_number:没有重复值的排序[记录相等也是不重复的]可以进行分页使用。
MySQL中不存在类似于SQL Server或Orcal中的以上三个函数来得到排名。
而在实际的工作中,常常需要将查询后排序得到的排名给记录下来。由于项目需要,不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。这里先来介绍用变量赋值的方法来实现排序。这里取经典面试题里的排序问题来讲解。请看下面三种排序类型
1.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
2.按各科成绩进行排序,并显示排名, Score 重复时合并名次
我们来看看怎么解答:
1)按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺.
对于15题排序就是没有重复值得排序(1-2-3-4)
select sc.CId ,@curRank:=@curRank+1 as rank,
sc.score from (select @curRank:=0) as t ,sc
ORDER BY sc.score desc;
第一:要在mysql中声明一个变量,你必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET,但它会处理两个查询
set @curRank:=0;
select sc.CId ,@curRank:=@curRank+1 as rank,sc.score
from sc ORDER BY sc.score desc;
第二:一定要进行排序order by ,否则会出现这样的情况:
那如果我们用函数rank_number()函数怎么实现
select *,
row_number() over(partition by Cid order by score desc) as 'rank' from sc;
其中里面的partition by +某个字段表示以什么字段来排序。
2).按各科成绩进行排序,并显示排名, Score 重复时合并名次
对于这题就是连续排序(1-2-2-2-3)
select sc.CId ,
case when @fontscore=score then @curRank
when @fontscore:=score then @curRank:=@curRank+1
end as rank,sc.score
from (select @curRank:=0 ,@fontage:=null) as t ,sc
ORDER BY sc.score desc
现在,如果我们希望为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的score)。为此,我们使用了一个额外的变量@fontscore。
那我们来看用dense_rank()连续排序怎么实现:
select *,
dense_rank() over(partition by Cid order by score desc) as 'rank' from sc;
以上函数的语法规则都是一样的
select * from 函数() over(partition by 字段1 order by 字段2 desc or asc) as rank from table;
3).在MySQL中实现Rank普通并列排名函数(1-2-2-2-5),这里举另外一个例子
当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是实际排名中存在有关系的差距。
select pid, name, age, rank from
(select pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,
@incRank := @incRank + 1,
@prevRank := age
from players p, (
select @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY age) s
在这里我们可以看到,Andre,Vino,John和Tom都有相同的age,所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6,而不是第3,因为有4个人并列排名在第2。