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 | 連續排名,即使相同的值,依舊按照連續數字進行排名。 |
具體說明可參考:
- 官方文檔:MySQL :: MySQL 8.0 Reference Manual :: 12.21.1 Window Function Descriptions
- 一篇博客:MYSQL實現排名函數RANK,DENSE_RANK和ROW_NUMBER_數據庫_博客-CSDN博客