当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


MySQL ROW_NUMBER()用法及代码示例


MySQL 中的 ROW_NUMBER() 函数用于返回其分区内每一行的序列号。它是一种窗口函数。行号从 1 开始到分区中存在的行数。

需要注意的是,MySQL 在 8.0 版本之前不支持 ROW_NUMBER() 函数,但它们提供了一个会话变量,允许我们模拟该函数。

用法

以下是在 MySQL 中使用 ROW_NUMBER() 的基本语法:

ROW_NUMBER() OVER (<partition_definition> <order_definition>)

让我们用一个例子来演示它

首先,我们将使用以下语句创建一个名为 "Person" 的表:

CREATE TABLE Person (
  Name varchar(45) NOT NULL,
  Product varchar(45) DEFAULT NULL,
  Country varchar(25) DEFAULT NULL,
  Year int NOT NULL
);

接下来,需要向该表添加值。执行以下语句:

INSERT INTO Person(Name, Product, Country, Year) 
VALUES ('Stephen', 'Computer', 'USA', 2015), 
('Joseph', 'Laptop', 'India', 2016), 
('John', 'TV', 'USA', 2016),
('Donald', 'Laptop', 'England', 2015),
('Joseph', 'Mobile', 'India', 2015),
('Peter', 'Mouse', 'England', 2016);

接下来,执行 SELECT 语句以显示记录:

mysql> SELECT * FROM Person;

我们会得到输出,如下图:

MySQL ROW_NUMBER() Function

现在,我们可以使用 ROW_NUMBER() 函数使用以下语句为每条记录分配一个序列号:

SELECT *, 
	ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它将给出以下输出:

MySQL ROW_NUMBER() Function

同样,我们可以使用 ROW_NUMBER() 函数使用以下语句为分区内的每个记录分配一个序列号:

SELECT *, 
	ROW_NUMBER() OVER(PARTITION BY Year) AS row_num
FROM Person;

它将给出如下输出,其中根据年份(2015 年和 2016 年)找到了两个分区。

MySQL ROW_NUMBER() Function

MySQL ROW_NUMBER() 使用会话变量

我们可以模拟 ROW_NUMBER() 函数,使用会话变量按递增顺序添加行号。

执行以下语句,为每行添加行号,从 1 开始:

SET @row_number = 0; 

SELECT Name, Product, Year, Country,
	(@row_number:=@row_number + 1) AS row_num
FROM Person ORDER BY Country;

在此语句中,我们首先指定@prfix 指示的会话变量@row_number 并将其值设置为0。然后,我们从表Person 中选择数据,并将变量@row_number 的值每行增加1。

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

MySQL ROW_NUMBER() Function

同样,我们将使用会话变量作为表并使用以下语句将其与源表交叉连接:

SELECT (@row_number:=@row_number + 1) AS row_num, Name, Country, Year
FROM Person, (SELECT @row_number:=0) AS temp ORDER BY Year;

我们将得到如下输出:

MySQL ROW_NUMBER() Function



相关用法


注:本文由纯净天空筛选整理自 MySQL ROW_NUMBER() Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。