MySQL PARTITION BY 子句
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 |
score |
---|---|---|---|
3 |
Raju |
111 |
20 |
2 |
Mithlesh |
111 |
80 |
5 |
Rudra |
112 |
40 |
5 |
Mohan |
114 |
90 |
4 |
Rohan |
112 |
30 |
1 |
Sohan |
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 |
score |
rank |
---|---|---|---|---|
111 |
2 |
Mithlesh |
80 |
1 |
111 |
3 |
Raju |
20 |
2 |
112 |
Rudra |
40 |
1 |
|
112 |
1 |
Sohan |
40 |
1 |
112 | 4 |
Rohan |
30 |
2 |
114 |
5 |
Mohan |
90 |
1 |
因此,我們已成功獲得所有駭客及其在每個單獨挑戰中的相應排名的列表。
PARTITION BY 子句的用途
將表的行分組到單獨的分割槽中,以便對分割槽內的特定行執行計算。
減少儲存需求並提高資料可管理性。
透過更快地執行僅訪問資料子集的查詢來提高查詢效能。
縮短備份和恢復時間。
結論
MySQL 中的 PARTITION BY 子句是將表的行分組到單獨的分割槽中、提高查詢效能和減少儲存需求的有用工具。此子句專門用於視窗函式,例如 RANK()、LEAD() 和 LAG()。語法簡單明瞭,並允許在子句中使用的表示式型別具有靈活性。上面的示例演示了 PARTITION BY 子句在計算每個客戶的銷售額執行總計方面的功能。透過利用此強大的功能,使用者可以最佳化其資料庫效能並提高資料可管理性。