mysql 8.0版本用視窗函式就可以實現排名,有三種方式,對相同值的處理不同:
(以上區別會在文末舉例,本文主要討論用變數實現排名)
5.5版本用不了視窗函式(至少排序視窗用不了,其他的沒試過),那麼對於要顯示排名的需求就得想其他辦法啦,看網上的資料可以用變數來實現,來看看:
首先建表並插入資料(資料資料來自sql面試50題):
create
成績表資料:
一,如果不按照課程編號和學號,只對成績排名:
1.1,無重覆記錄,無間斷排名
select
**解釋:
變數@rank用於記錄排名值,初始值為0,可以理解為select是一條條資料查詢出來,第一條資料中@rank初始值0加上1,賦值給新的@rank寫入結果。
第二條資料中@rank值為1,執行@rank+1賦值給新的@rank,如此,實現不間斷也不重複的排名。結果如下:
1.2,有重覆記錄,無間斷排名
select
**解釋:
這裡賦值了兩個變數@rank、@a,@a用於記錄s_score的值,先存放上一條對應值,再與當前的s_score值比較,若相同則@rank保留上一條記錄值從而產生重覆記錄,否則@rank值加1並寫入結果。
1.3,有重覆記錄,有間斷排名
select
**解釋:
這裡新加了變數@note,用於記錄@rank要增加的值,@note初始值為0,通過變數@a與s_score的比較判斷,若當前s_score值與@a上一條記錄值相同,執行@note+1,同時@rank保留上一條記錄值從而產生重覆記錄;若當前s_score值與@a上一條記錄值不同,@note取值1,同時@rank執行@rank+@note,這裡@note是上一條記錄的值》1,從而@rank產生間斷。結果如下:
二,查詢每門課程的成績並排名:
2.1,無重覆記錄,無間斷排名
select
或:
select
**解釋:
2.2,有重覆記錄,無間斷排名
select
**解釋:
2.3,有重覆記錄,有間斷排名
select
**解釋:
這裡新加了變數@note,用於記錄@rank要增加的值,結果如下:
注意:所有變數在同一級查詢中都必須作為查詢字段,最後再用乙個子查詢篩選出要展示的最終結果即可。
以上便完成了通過變數來實現排名的各類情況。這裡用的是if函式來解題,當然還可以用case when結構,有時間再補充一下。
最後,看一下8.0版本中使用排序視窗函式的各種結果:
select
逃~ mysql使用者變數 MySQL使用者變數的用法
mysql資料庫中的變數分為mysql系統變數和mysql使用者變數,下面就為您介紹mysql使用者變數的應用,供您參考學習之用。mysql使用者變數 基於會話變數實現的,可以暫存值,並傳遞給同一連線裡的下一條sql使用的變數.當客戶端連線退出時,變數會被釋放.mysql使用者變數應用場景 同一連線...
mysql分組排名 mysql分組排名
1.建立表並寫入測試資料 create table tb rank score city varchar 20 score int insert into tb rank score values sz 89 insert into tb rank score values sz 76 insert...
mysql儲存函式查詢排名 MySQL排名函式
應用場景 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述...