MySQL PARTITION BY 子句

WBOY
WBOY 转载
2023-08-29 21:25:02 879浏览

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,如有侵犯,请联系admin@php.cn删除