MySQL 排名函数

17 Mar 2025 | 4 分钟阅读

MySQL 使用排名函数,该函数允许我们在数据库中对分区中的每一行进行排名。排名函数也是 MySQL 中窗口函数的一个子集。MySQL 中的排名函数可以与以下子句一起使用:

  • 它们总是与 OVER() 一起工作。
  • 它们根据 ORDER BY 为每一行分配排名。
  • 它们按顺序为每一行分配排名。
  • 它们总是为行分配排名,对于每个新分区都从一开始。

注意:请注意,MySQL 自 8.0 版本以来就支持排名函数和窗口函数。

MySQL 支持以下三种类型的排名函数:

  1. 密集排名 (Dense Rank)
  2. 排名
  3. 百分比排名 (Percent Rank)

现在,我们将详细讨论每种排名函数。

MySQL dense_rank()

这是一个函数,它在没有间隙的情况下为分区或结果集中的每一行分配排名。行的排名总是按连续顺序分配(比上一行增加一)。有时你会遇到值相等的情况,这时 dense_rank() 会将它们分配相同的排名,而下一个排名将是其下一个连续的数字。

以下是 dense_rank() 的语法:

在上面的语法中,PARTITION BY 子句对 FROM 子句返回的结果集进行分区,然后 dense_rank 函数应用于每个分区。接下来,ORDER BY 子句应用于每个分区,以指定行的顺序。

示例 1

让我们了解 MySQL dense_rank() 函数的工作原理。首先,创建一个包含以下数据的表:

表:employees

MySQL Ranking Functions

此语句使用 dense_rank() 函数为每一行分配排名值。

执行上述语句后,我们将得到以下输出:

MySQL Ranking Functions

示例 2

让我们看另一个示例,该示例将结果集划分为多个分区。以下语句使用 dense_rank() 函数为每一行分配值,并使用 emp_age 将结果集划分为分区:

成功执行上述查询后,我们将得到以下输出:

MySQL Ranking Functions

MySQL rank()

这是一个函数,它在有间隙的情况下为分区或结果集中的每一行分配排名。行的排名总是不按连续顺序分配(即,比上一行增加一)。有时你会遇到值相等的情况,这时 rank() 函数会将其分配相同的排名,而下一个排名值将是其前一个排名加上重复数字的数量。

以下是 rank() 的语法:

在上面的语法中,PARTITION BY 子句对 FROM 子句返回的结果集进行分区,然后 rank() 函数应用于每个分区,并在跨越其他分区的分区边界时重新初始化。接下来,ORDER BY 子句应用于每个分区,以按一个或多个列名对行进行排序。

让我们使用我们之前创建的表,并通过不同的示例查看 MySQL 中 rank() 函数的工作原理

表:employees

MySQL Ranking Functions

示例 1

此语句使用 rank() 函数为每一行分配排名值。

上述查询将产生以下输出:

MySQL Ranking Functions

示例 2

让我们看另一个示例,该示例将结果集划分为多个分区。以下语句使用 rank() 函数为每一行分配值,并使用 emp_age 将结果集划分为分区,并根据 emp_id 对其进行排序:

执行上述语句,我们将得到以下输出:

MySQL Ranking Functions

MySQL percent_rank()

这是一个函数,用于计算分区或结果集中行的百分比排名(相对排名)。此函数返回一个介于 0 和 1 之间的数字。

以下是 percent_rank() 的语法:

对于指定行,此函数使用以下公式计算排名:

此处,

rank:这是 rank() 函数返回的每一行的排名。

total_rows:它表示分区中存在的总行数。

注意:在使用此函数时,必须使用 ORDER BY 子句。否则,所有行将被视为重复项,并分配相同的排名,即 1。

让我们创建一个名为 "students" 的表,其中包含以下数据,并查看 MySQL 中 percent_rank() 函数的工作原理:

表:students

MySQL Ranking Functions

示例 1

此语句使用 percent_rank() 函数按 marks 列对每一行计算排名值。

上述查询将产生以下输出:

MySQL Ranking Functions

要查看上述公式的工作原理,请考虑以下查询:

它将提供以下输出

MySQL Ranking Functions
下一个主题MySQL 窗口函数