大家好,我是犀牛真皮,今天想解釋下這個名字,這個名字的來源是電影《夏日福星》中的角色犀牛皮,好了,接下來進入正題,講解下mysql8.0新增的幾個排名相關的視窗函式,
用過mysql5.xx版本的小伙伴肯定知道,我們排序時,一般都是先分組再排序,一條sql有時候會寫的非常的復雜,而mysql8.0新增的這幾個視窗函式,就大大的簡化了我們的sql,
我們先來了解下,什么叫做視窗函式?
視窗函式也稱為OLAP函式,OLAP 是online analytical processing的簡稱,意思是對資料庫資料進行實時分析處理,視窗函式要詳細講解的話,會很復雜,我們這里了解一下概念就可以了,
在開始講解之前,我們先建一個表,這個表是在leetcode刷題時的一道題的表,然后插入以下幾條資料:
CREATE TABLE `scores` (
`Id` int DEFAULT NULL,
`Score` decimal(3,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `scores` (`Id`, `Score`) VALUES (1, 3.50);
INSERT INTO `scores` (`Id`, `Score`) VALUES (2, 3.65);
INSERT INTO `scores` (`Id`, `Score`) VALUES (3, 4.00);
INSERT INTO `scores` (`Id`, `Score`) VALUES (4, 3.85);
INSERT INTO `scores` (`Id`, `Score`) VALUES (5, 4.00);
INSERT INTO `scores` (`Id`, `Score`) VALUES (6, 3.65);
接下來,先看看第一個函式ROW_NUMBER,該函式的排名結果是序號連續且不重復,如果遇到相同的資料也是按照不重復的順序往下排,如:
mysql> SELECT *,ROW_NUMBER() OVER (ORDER BY Score) as row_num FROM scores;
+------+-------+---------+
| Id | Score | row_num |
+------+-------+---------+
| 1 | 3.50 | 1 |
| 2 | 3.65 | 2 |
| 6 | 3.65 | 3 |
| 4 | 3.85 | 4 |
| 3 | 4.00 | 5 |
| 5 | 4.00 | 6 |
+------+-------+---------+
6 rows in set (0.00 sec)
第二個函式RANK():該函式如果有相同的資料就歸為一組,所以相同的資料排名相同,且排序不會連續執行,我們看到如下的例子,如有重復資料,會導致排名不連續:
mysql> SELECT *,RANK() OVER (ORDER BY Score) as row_num FROM scores;
+------+-------+---------+
| Id | Score | row_num |
+------+-------+---------+
| 1 | 3.50 | 1 |
| 2 | 3.65 | 2 |
| 6 | 3.65 | 2 |
| 4 | 3.85 | 4 |
| 3 | 4.00 | 5 |
| 5 | 4.00 | 5 |
+------+-------+---------+
6 rows in set (0.00 sec)
第三個函式DENSE_RANK():該函式排名結果是連續的,而且也會把相同的值分為一組且每組的排序號是一樣的,如:
mysql> SELECT *,DENSE_RANK() OVER (ORDER BY Score) as row_num FROM scores;
+------+-------+---------+
| Id | Score | row_num |
+------+-------+---------+
| 1 | 3.50 | 1 |
| 2 | 3.65 | 2 |
| 6 | 3.65 | 2 |
| 4 | 3.85 | 3 |
| 3 | 4.00 | 4 |
| 5 | 4.00 | 4 |
+------+-------+---------+
6 rows in set (0.00 sec)
最后一個函式NTILE(N):將所有記錄分成N個組,且每組序號都不一樣,如:
mysql> SELECT *,NTILE(3) OVER (ORDER BY Score) as row_nun FROM scores;
+------+-------+---------+
| Id | Score | row_nun |
+------+-------+---------+
| 1 | 3.50 | 1 |
| 2 | 3.65 | 1 |
| 6 | 3.65 | 2 |
| 4 | 3.85 | 2 |
| 3 | 4.00 | 3 |
| 5 | 4.00 | 3 |
+------+-------+---------+
6 rows in set (0.00 sec)
最后,需要特別注意的是,用這4個函式時,OVER中的ORDER BY 引數要跟SQL排序記錄中的ORDER BY的引數保持一致,否則得到的序號可能不是按順序排下來的,如:
mysql> SELECT *,ROW_NUMBER() OVER (ORDER BY Score) as row_num FROM scores ORDER BY id;
+------+-------+---------+
| Id | Score | row_num |
+------+-------+---------+
| 1 | 3.50 | 1 |
| 2 | 3.65 | 2 |
| 3 | 4.00 | 5 |
| 4 | 3.85 | 4 |
| 5 | 4.00 | 6 |
| 6 | 3.65 | 3 |
+------+-------+---------+
6 rows in set (0.00 sec)
今天,就到這里了,你學廢且記住了嗎?如果沒記住我們多用幾次就會了,一起加油,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/305007.html
標籤:其他
下一篇:Gin框架專案實戰(二)
