最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

總結(jié)幾種MySQL中常見的排名問題

 更新時間:2020年09月04日 11:36:02   作者:MySQL技術(shù)  
這篇文章主要總結(jié)了幾種MySQL中常見的排名問題,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下

前言:

在某些應(yīng)用場景中,我們經(jīng)常會遇到一些排名的問題,比如按成績或年齡排名。排名也有多種排名方式,如直接排名、分組排名,排名有間隔或排名無間隔等等,這篇文章將總結(jié)幾種MySQL中常見的排名問題。

創(chuàng)建測試表

create table scores_tb (
 id int auto_increment primary key,
 xuehao int not null, 
 score int not null
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into scores_tb (xuehao,score) values (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94);

# 查看下插入的數(shù)據(jù)
mysql> select * from scores_tb;
+----+--------+-------+
| id | xuehao | score |
+----+--------+-------+
| 1 | 1001 | 89 |
| 2 | 1002 | 99 |
| 3 | 1003 | 96 |
| 4 | 1004 | 96 |
| 5 | 1005 | 92 |
| 6 | 1006 | 90 |
| 7 | 1007 | 90 |
| 8 | 1008 | 94 |
+----+--------+-------+

1.普通排名

按分?jǐn)?shù)高低直接排名,從1開始,往下排,類似于row number。下面我們給出查詢語句及排名結(jié)果。

# 查詢語句
SELECT xuehao, score, @curRank := @curRank + 1 AS rank
FROM scores_tb, (
SELECT @curRank := 0
) r
ORDER BY score desc;

# 排序結(jié)果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 3 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 7 |
| 1001 | 89 | 8 |
+--------+-------+------+

上述查詢語句中,我們申明了一個變量 @curRank ,并將此變量初始化為0,查得一行將此變量加一,并以此作為排名。我們看到這類排名是沒間隔的并且有些分?jǐn)?shù)相同但排名不同。

2.分?jǐn)?shù)相同,名次相同,排名無間隔

# 查詢語句
SELECT xuehao, score, 
CASE
WHEN @prevRank = score THEN @curRank
WHEN @prevRank := score THEN @curRank := @curRank + 1
END AS rank
FROM scores_tb, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY score desc;

# 排名結(jié)果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 3 |
| 1005 | 92 | 4 |
| 1006 | 90 | 5 |
| 1007 | 90 | 5 |
| 1001 | 89 | 6 |
+--------+-------+------+

3.并列排名,排名有間隔

另外一種排名方式是相同的值排名相同,相同值的下一個名次應(yīng)該是跳躍整數(shù)值,即排名有間隔。

# 查詢語句
SELECT xuehao, score, rank FROM
(SELECT xuehao, score,
@curRank := IF(@prevRank = score, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := score
FROM scores_tb, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY score desc) s;
# 排名結(jié)果
+--------+-------+------+
| xuehao | score | rank |
+--------+-------+------+
| 1002 | 99 | 1 |
| 1003 | 96 | 2 |
| 1004 | 96 | 2 |
| 1008 | 94 | 4 |
| 1005 | 92 | 5 |
| 1006 | 90 | 6 |
| 1007 | 90 | 6 |
| 1001 | 89 | 8 |
+--------+-------+------+

上面介紹了三種排名方式,實(shí)現(xiàn)起來還是比較復(fù)雜的。好在MySQL8.0增加了窗口函數(shù),使用內(nèi)置函數(shù)可以輕松實(shí)現(xiàn)上述排名。

MySQL8.0 利用窗口函數(shù)實(shí)現(xiàn)排名

MySQL8.0中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三個窗口函數(shù)實(shí)現(xiàn)上述三種排名,需要注意的一點(diǎn)是as后的別名,千萬不要與前面的函數(shù)名重名,否則會報錯,下面給出這三種函數(shù)實(shí)現(xiàn)排名的案例:

# 三條語句對于上面三種排名
select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;
select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;
select xuehao,score, RANK() over(order by score desc) as r from scores_tb;

# 一條語句也可以查詢出不同排名
SELECT xuehao,score,
 ROW_NUMBER() OVER w AS 'row_r',
 DENSE_RANK() OVER w AS 'dense_r',
 RANK()  OVER w AS 'r'
FROM `scores_tb`
WINDOW w AS (ORDER BY `score` desc);

# 排名結(jié)果
+--------+-------+-------+---------+---+
| xuehao | score | row_r | dense_r | r |
+--------+-------+-------+---------+---+
| 1002 | 99 |  1 |  1 | 1 |
| 1003 | 96 |  2 |  2 | 2 |
| 1004 | 96 |  3 |  2 | 2 |
| 1008 | 94 |  4 |  3 | 4 |
| 1005 | 92 |  5 |  4 | 5 |
| 1006 | 90 |  6 |  5 | 6 |
| 1007 | 90 |  7 |  5 | 6 |
| 1001 | 89 |  8 |  6 | 8 |
+--------+-------+-------+---------+---+

總結(jié):

本文給出三種不同場景下實(shí)現(xiàn)統(tǒng)計排名的SQL,可以根據(jù)不同業(yè)務(wù)需求選取合適的排名方案。對比MySQL8.0,發(fā)現(xiàn)利用窗口函數(shù)可以更輕松實(shí)現(xiàn)排名,其實(shí)業(yè)務(wù)需求遠(yuǎn)遠(yuǎn)比我們舉的示例要復(fù)雜許多,用SQL實(shí)現(xiàn)此類業(yè)務(wù)需求還是需要慢慢積累的。

以上就是總結(jié)幾種MySQL中常見的排名問題的詳細(xì)內(nèi)容,更多關(guān)于MySQL 排名的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL實(shí)現(xiàn)查詢數(shù)據(jù)庫表記錄數(shù)

    MySQL實(shí)現(xiàn)查詢數(shù)據(jù)庫表記錄數(shù)

    這篇文章主要介紹了MySQL實(shí)現(xiàn)查詢數(shù)據(jù)庫表記錄數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java連接Mysql 8.0.18版本的方法詳解

    Java連接Mysql 8.0.18版本的方法詳解

    這篇文章主要介紹了Java和Mysql 8.0.18版本的連接方式,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • MySQL表的增刪改查基礎(chǔ)教程

    MySQL表的增刪改查基礎(chǔ)教程

    這篇文章主要給大家介紹了關(guān)于MySQL表的增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Mysql全文搜索match against的用法

    Mysql全文搜索match against的用法

    全文檢索在 MySQL 中就是一個 FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、 VARCHAR 或 TEXT 列上創(chuàng)建
    2011-10-10
  • mysql存儲過程 在動態(tài)SQL內(nèi)獲取返回值的方法詳解

    mysql存儲過程 在動態(tài)SQL內(nèi)獲取返回值的方法詳解

    本篇文章是對mysql存儲過程在動態(tài)SQL內(nèi)獲取返回值進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL清理數(shù)據(jù)并釋放磁盤空間的實(shí)現(xiàn)示例

    MySQL清理數(shù)據(jù)并釋放磁盤空間的實(shí)現(xiàn)示例

    本文主要介紹了MySQL如何清理數(shù)據(jù)并釋放磁盤空間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • MySQL事務(wù)的四種特性總結(jié)

    MySQL事務(wù)的四種特性總結(jié)

    事務(wù)就是一組DML語句組成,這些語句在邏輯上存在相關(guān)性,這一組DML語句要么全部成功,要么全部失敗,是一個整體,一個 MySQL 數(shù)據(jù)庫,可不止你一個事務(wù)在運(yùn)行,所以一個完整的事務(wù),絕對不是簡單的 sql 集合,本文就給大家總結(jié)一下MySQL事務(wù)的四種特性
    2023-08-08
  • mysql 從一個表中查數(shù)據(jù)并插入另一個表實(shí)現(xiàn)方法

    mysql 從一個表中查數(shù)據(jù)并插入另一個表實(shí)現(xiàn)方法

    這篇文章主要介紹了mysql 從一個表中查數(shù)據(jù)并插入另一個表實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Mysql中的CHECK約束特性詳解

    Mysql中的CHECK約束特性詳解

    這篇文章主要介紹了Mysql中的CHECK約束特性詳解的相關(guān)資料,講解的十分淺顯易懂,這里推薦給大家,需要的朋友可以參考下
    2022-08-08
  • MySQL中導(dǎo)出用戶權(quán)限設(shè)置的腳本分享

    MySQL中導(dǎo)出用戶權(quán)限設(shè)置的腳本分享

    這篇文章主要介紹了MySQL中導(dǎo)出用戶權(quán)限設(shè)置的腳本分享,本文通過導(dǎo)出mysql.user表中數(shù)據(jù)實(shí)現(xiàn)導(dǎo)出權(quán)限設(shè)置,需要的朋友可以參考下
    2014-10-10

最新評論

思南县| 平湖市| 新田县| 青田县| 措勤县| 都匀市| 楚雄市| 马边| 正安县| 淮滨县| 闽侯县| 兴安盟| 天门市| 中西区| 中西区| 竹北市| 吐鲁番市| 蓝田县| 尚义县| 福建省| 普格县| 阿荣旗| 藁城市| 丘北县| 敦煌市| 缙云县| 定日县| 黄大仙区| 怀化市| 芷江| 临沧市| 班玛县| 永善县| 郯城县| 长白| 井陉县| 新干县| 勃利县| 天水市| 加查县| 永康市|