Partition By 子句可用來提高查詢效能。它降低了儲存需求,並提高了資料可管理性。透過對大表進行分區,可以更快地執行僅存取一小部分資料的查詢。分割區還可以縮短備份和還原時間。在本文中,我們將透過語法和各種範例討論 MySQL 中的 Partition By 子句。
PARTITION BY 子句的目的是將表格的行分組到單獨的分割區。當使用同一分區中的其他行對分區內的特定行執行計算時,這特別有用。
PARTITION BY 子句必須永遠在 OVER() 子句中使用。 PARTITION BY 子句所建立的分割區也稱為視窗。此子句專門對 RANK()、LEAD() 和 LAG() 等視窗函數進行操作。
如果從 OVER() 子句中排除 PARTITION BY 子句,則整個資料表將被視為單一分割區。
Window_function ( expression ) Over ( partition by expr [order_clause] [frame_clause] )
order_clause 和frame_clause 是語法的可選元件。
在 MySQL 中,Partition 子句中的運算式可以是列名,也可以是內建函數。但是,在標準 SQL 中,表達式中只允許使用列名稱。
讓我們以「Hacker」表為例 -
h_id | #h_name | #challenge_id | #分數 |
---|---|---|---|
3 |
拉朱 | #111 | #20 |
#2 |
密斯萊什 | #111 | #80 |
#5 |
樓陀羅 | #112 | #40 |
#5 |
莫漢 |
114 | #90 |
4 |
洛汗 |
112 | #30 |
#1 |
索漢 |
112 | #40 |
#我們需要確定每個挑戰中每個駭客的排名。換句話說,我們必須列出所有參與挑戰的駭客以及他們在該挑戰中各自的排名。
為了實現此目的,我們使用以下查詢:
select challenge_id, h_id, h_name, score, dense_rank() over ( partition by challenge_id order by score desc ) as "rank", from hacker;
在此查詢中,partition by 子句按challenge_id 將資料表分組。
order by 子句依照分數降序對每個分區的駭客進行排序。
over() 子句指定如何對視窗函數rank() 的表格行進行分區和排序。
視窗函數dense_rank()為挑戰的有序分區中的每個駭客分配一個等級。如果兩個黑客得分相同,則他們被分配相同的排名。
結果輸出顯示所有駭客的清單以及他們在每個挑戰中各自的排名 -
challenge_id |
#h_id |
#h_name |
#分數 |
排名 |
---|---|---|---|---|
111 |
#2 |
密斯萊什 |
#80 |
#1 |
111 |
#3 |
拉朱 |
#20 |
#2 |
112 |
#樓陀羅 |
#40 |
#1 |
|
112 |
#1 |
索漢 |
40 |
#1 |
112 | #4 |
洛汗 |
30 |
#2 |
114 |
#5 |
莫漢 |
90 |
1 |
因此,我們成功獲得了所有黑客的清單以及他們在每個單獨挑戰中的排名。
將表格的行分組到單獨的分割區中,以便對分割區內的特定行執行計算。
降低儲存需求並提高資料可管理性。
透過更快地執行僅存取一小部分資料的查詢來提高查詢效能。
縮短備份和復原時間。
以上是MySQL PARTITION BY 子句的詳細內容。更多資訊請關注PHP中文網其他相關文章!