MySQL的排名函數和排名功能


1、mysql中的運算符

運算符 作用
:= 賦值
@ 標識用戶變量(讀取和使用)
@@ 標識用戶變量(讀取和使用)
<=> 做 NULL 值的關系運算(等同於:IS NULL)

示例:

SET @old_log_state = @@global.general_log;
作用說明:定義一個old_log_state的用戶變量,並把系統變量global.general_log的值賦給它

2、mysql8.0以下實現排名

2.1 可用Demo:

2.1 部分全部參考mysql 查詢獲取排名的方法(絕對有效)_數據庫_爐火純青-CSDN博客

注意里面的A,屬於嵌套查詢,所以排名會正確。

FROM
(
     SELECT A.*,@rank:=@rank+1 as pm
     FROM 
     (
      SELECT banji,avg(score) as AvgS FROM table_test GROUP BY banji  ORDER BY AvgS   DESC
     ) A ,(SELECT @rank:=0) B
) M
ORDER BY M.banji

如果里面沒有子查詢,使用下面的SQL,那么排序會出錯。出錯的取決於GROUP BY 是否有多於一條的分組。

SELECT banji,avg(score) as AvgS ,@rank:=@rank+1 as pm
FROM table_test A,(SELECT @rank:=0) B
GROUP BY banji
ORDER BY AvgS   DESC

原因:@rank排名發生在GROUP BY 之前。GROUP BY 是對排名后的結果進行分組。如果想對分組后的結果進行排名,請使用子查詢。

具體還可以參考:rank - Ranking sum in mysql - Stack Overflow

2.2 Demo語法解讀:

參考:mysql 中根據查詢結果排名_數據庫_T2080305的博客-CSDN博客
里面還有很多其他說明,需要可以自看,如果只是了解SQL的語法,看前面即可。

3、mysql8.0實現排名

官方提供了3個函數:RANK,DENSE_RANK和ROW_NUMBER。(使用時注意語法)

函數 作用
RANK 並列跳躍排名,並列即相同的值,相同的值保留重復名次,遇到下一個不同值時,跳躍到總共的排名。
DENSE_RANK 並列連續排序,並列即相同的值,相同的值保留重復名次,遇到下一個不同值時,依然按照連續數字排名。
ROW_NUMBER 連續排名,即使相同的值,依舊按照連續數字進行排名。

具體說明可參考:

4、參考

  1. mysql 運算符 <=>,:=,@,@@的含義 - big_cat - OSCHINA
  2. mysql里的at符號@有什么特殊含義呀??_數據庫_kendyhj9999的專欄-CSDN博客
    注:示例說明。
  3. mysql :=和=的區別_數據庫_wangjun5159的專欄-CSDN博客
    注:了解區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM