[5]-MySQL排序總結(jié)

一、對查詢結(jié)果進(jìn)行排序(ORDER BY)

1.ORDED BY 子句
使用SELECT抽取數(shù)據(jù)時(shí),數(shù)據(jù)的顯示是無序的,想要得到有序的數(shù)據(jù),那么我們就需要使用ORDER BY子句進(jìn)行排序。
2.ORDED BY 子句語法:

SELECT <列1>,<列2>,<列3>,......
FROM <表名>
ORDER BY <排序基準(zhǔn)1>,<排序基準(zhǔn)2>,.....
ORDED BY 子句(商品的銷售單價(jià)升序排列)
其中desc表示降序,asc表示升序排列。

二、rank,dense_rank,row_number 使用上的區(qū)別

RANK:跳躍排序
DENSE_RANK:連續(xù)排序
row_number:沒有重復(fù)值的排序[記錄相等也是不重復(fù)的]可以進(jìn)行分頁使用。

MySQL中不存在類似于SQL Server或Orcal中的以上三個(gè)函數(shù)來得到排名。

而在實(shí)際的工作中,常常需要將查詢后排序得到的排名給記錄下來。由于項(xiàng)目需要,不僅要對成績進(jìn)行排名,而且需要相同成績的具有相同的排名。這里先來介紹用變量賦值的方法來實(shí)現(xiàn)排序。這里取經(jīng)典面試題里的排序問題來講解。請看下面三種排序類型

1.按各科成績進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)保留名次空缺
2.按各科成績進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)合并名次

我們來看看怎么解答:


分?jǐn)?shù)表
1)按各科成績進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)保留名次空缺.

對于15題排序就是沒有重復(fù)值得排序(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中聲明一個(gè)變量,你必須在變量名之前使用@符號(hào)。FROM子句中的(@curRank := 0)部分允許我們進(jìn)行變量初始化,而不需要單獨(dú)的SET命令。當(dāng)然,也可以使用SET,但它會(huì)處理兩個(gè)查詢

set @curRank:=0;
select sc.CId ,@curRank:=@curRank+1 as rank,sc.score
from sc ORDER BY sc.score desc;

第二:一定要進(jìn)行排序order by ,否則會(huì)出現(xiàn)這樣的情況:

那如果我們用函數(shù)rank_number()函數(shù)怎么實(shí)現(xiàn)
select *,
row_number()  over(partition by Cid order by score desc) as 'rank' from sc;

其中里面的partition by +某個(gè)字段表示以什么字段來排序。

2).按各科成績進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)合并名次
對于這題就是連續(xù)排序(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

現(xiàn)在,如果我們希望為并列數(shù)據(jù)的行賦予相同的排名,則意味著那些在排名比較列中具有相同值的行應(yīng)在MySQL中計(jì)算排名時(shí)保持相同的排名(例如在我們的例子中的score)。為此,我們使用了一個(gè)額外的變量@fontscore。

那我們來看用dense_rank()連續(xù)排序怎么實(shí)現(xiàn):
select *,
dense_rank() over(partition by Cid order by score desc) as 'rank' from sc;

以上函數(shù)的語法規(guī)則都是一樣的
select * from 函數(shù)() over(partition by 字段1 order by 字段2 desc or asc) as rank from table;

3).在MySQL中實(shí)現(xiàn)Rank普通并列排名函數(shù)(1-2-2-2-5),這里舉另外一個(gè)例子

當(dāng)使用RANK()函數(shù)時(shí),如果兩個(gè)或以上的行排名并列,則相同的行都會(huì)有相同的排名,但是實(shí)際排名中存在有關(guān)系的差距。

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,所以他們排名并列第二。下一個(gè)最高年齡的球員(Brian)排名第6,而不是第3,因?yàn)橛?個(gè)人并列排名在第2。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容