MySQL ROW_NUMBER 函数
MySQL中的ROW_NUMBER()函数用于为每个分区内的每一行返回连续的编号。它是一种窗口函数。行编号从1开始,直到分区中存在的行数。
需要注意的是,在版本8.0之前,MySQL不支持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;
我们将得到如下所示的输出:
现在,我们可以使用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;
在这个语句中,我们首先指定了会话变量 @row_number ,由@prefix指示,并将其值设置为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;
我们将得到以下输出: