Partition By 子句可用于提高查询性能。它降低了存储需求,并提高了数据可管理性。通过对大表进行分区,可以更快地执行仅访问一小部分数据的查询。分区还可以缩短备份和恢复时间。在本文中,我们将通过语法和各种示例讨论 MySQL 中的 Partition By 子句。,PARTITION BY 子句的目的是将表的行分组到单独的分区中。当使用同一分区中的其他行对分区内的特定行执行计算时,这特别有用。,PARTITION BY 子句必须始终在 OVER() 子句中使用。 PARTITION BY 子句创建的分区也称为窗口。该子句专门对 RANK()、LEAD() 和 LAG() 等窗口函数进行操作。,如果从 OVER() 子句中排除 PARTITION BY 子句,则整个表将被视为单个分区。,登录后复制,order_clause 和frame_clause 是语法的可选组件。,在 MySQL 中,Partition 子句中的表达式可以是列名,也可以是内置函数。但是,在标准 SQL 中,表达式中只允许使用列名称。,让我们以“Hacker”表为例 –,我们需要确定每个挑战中每个黑客的排名。换句话说,我们必须列出所有参与挑战的黑客以及他们在该挑战中各自的排名。,为了实现此目的,我们使用以下查询:,登录后复制,在此查询中,partition by 子句按challenge_id 对表进行分组。,order by 子句按照得分降序对每个分区中的黑客进行排序。,over() 子句指定如何对窗口函数rank() 的表行进行分区和排序。,窗口函数dense_rank()为挑战的有序分区中的每个黑客分配一个等级。如果两个黑客得分相同,则他们被分配相同的排名。,结果输出显示所有黑客的列表以及他们在每个挑战中各自的排名 –,因此,我们成功获得了所有黑客的列表以及他们在每个单独挑战中的排名。