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;
我们会得到输出,如下图:
现在,我们可以使用 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 的值每行增加1。
查询成功执行后,我们将得到如下输出:
同样,我们将使用会话变量作为表并使用以下语句将其与源表交叉连接:
SELECT (@row_number:=@row_number + 1) AS row_num, Name, Country, Year
FROM Person, (SELECT @row_number:=0) AS temp ORDER BY Year;
我们将得到如下输出:
相关用法
- MySQL ROUND()用法及代码示例
- MySQL REPEAT()用法及代码示例
- MySQL RPAD()用法及代码示例
- MySQL REGEXP_SUBSTR()用法及代码示例
- MySQL REGEXP_INSTR()用法及代码示例
- MySQL REPLACE()用法及代码示例
- MySQL RIGHT()用法及代码示例
- MySQL RADIANS()用法及代码示例
- MySQL RAND()用法及代码示例
- MySQL REVERSE()用法及代码示例
- MySQL REGEXP_REPLACE()用法及代码示例
- MySQL RTRIM()用法及代码示例
- MySQL POWER()用法及代码示例
- MySQL LEAD() and LAG()用法及代码示例
- MySQL IS_IPV4()用法及代码示例
- MySQL WEEK()用法及代码示例
- MySQL CHARACTER_LENGTH()用法及代码示例
- MySQL CURTIME()用法及代码示例
- MySQL weekofyear()用法及代码示例
注:本文由纯净天空筛选整理自 MySQL ROW_NUMBER() Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。