MySQL ROW_NUMBER()函数

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

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

一、MySQL ROW_NUMBER()函数 语法

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

OW_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;  

我们将得到输出,如下所示:

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

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

它将给出以下输出:

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

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

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

二、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 的值增加到每一行。

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

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

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

我们将得到如下输出:

热门文章

优秀文章