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 子句在计算每个客户的销售额运行总计方面的功能。通过利用此强大的功能,用户可以优化其数据库性能并提高数据可管理性。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP