MySQL PARTITION BY 子句

WBOY
發布: 2023-08-29 21:25:02
轉載
1633 人瀏覽過

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

#分數

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

因此,我們成功獲得了所有黑客的清單以及他們在每個單獨挑戰中的排名。

PARTITION BY 子句的使用

  • 將表格的行分組到單獨的分割區中,以便對分割區內的特定行執行計算。

  • 降低儲存需求並提高資料可管理性。

  • 透過更快地執行僅存取一小部分資料的查詢來提高查詢效能。

  • 縮短備份和復原時間。

結論

MySQL 中的 PARTITION BY 子句是一個有用的工具,用於將表格的行分組到單獨的分區中,從而提高查詢效能並減少儲存需求。此子句專門對 RANK()、LEAD() 和 LAG() 等視窗函數進行操作。語法很簡單,並且允許子句中使用的表達式類型具有靈活性。上面的範例示範了 PARTITION BY 子句在計算每位客戶的銷售總額時的功能。透過利用這項強大的功能,使用者可以優化資料庫效能並提高資料可管理性。

以上是MySQL PARTITION BY 子句的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板