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() 对表的行进行分区和排序。
窗口函数 density_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 子句在计算每个客户的累计销售总额方面的功能。通过利用这一强大的功能,用户可以优化数据库性能并提高数据可管理性。