在mysql的实际查询场景中,经常需要给返回的结果集添加连续的序列号,方便后续的数据展示和序号标记。下面介绍两种常用的实现方式,适配不同的mysql版本使用需求。

方法一:使用ROW_NUMBER窗口函数
mysql8.0及以上版本原生支持窗口函数,其中ROW_NUMBER()可以直接生成从1开始的连续序号,语法简单且执行效率较高。这种方式不需要额外定义变量,只需要按照指定的排序规则即可生成序列号。
假设我们有一张用户表user_info,表结构如下:
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
现在需要查询所有用户信息,并给结果添加从1开始的序列号,使用ROW_NUMBER的实现代码如下:
SELECT
ROW_NUMBER() OVER (ORDER BY id ASC) AS seq_num,
id,
user_name,
age
FROM user_info;
上述代码中,OVER (ORDER BY id ASC)表示按照id升序的顺序生成序列号,如果不需要固定排序,也可以写成OVER (),此时序列号会按照默认的查询顺序生成。需要注意的是,窗口函数需要mysql8.0及以上版本支持,低版本无法使用该语法。
方法二:使用用户变量手动累加
如果使用的mysql版本低于8.0,不支持窗口函数,可以通过自定义用户变量的方式手动累加生成序列号。这种方式兼容mysql5.6及以上的大部分版本,实现逻辑是通过变量存储上一次的序号值,每次查询一行数据时让变量加1。
同样基于上面的user_info表,使用用户变量生成序列号的代码如下:
SET @seq_num = 0;
SELECT
@seq_num := @seq_num + 1 AS seq_num,
id,
user_name,
age
FROM user_info
ORDER BY id ASC;
也可以将变量初始化和查询语句合并,避免单独执行SET语句:
SELECT
@seq_num := @seq_num + 1 AS seq_num,
id,
user_name,
age
FROM user_info, (SELECT @seq_num := 0) AS init
ORDER BY id ASC;
这种方式的原理是在查询开始时初始化@seq_num为0,每查询出一行数据,就执行@seq_num := @seq_num + 1让变量加1,最终得到连续的序列号。需要注意的是,用户变量的赋值顺序和查询的执行顺序相关,建议搭配ORDER BY子句使用,保证序列号的生成顺序符合预期。
两种方法的对比
两种方法的适用场景和特点如下:
| 对比项 | ROW_NUMBER窗口函数 | 用户变量累加 |
|---|---|---|
| 适用版本 | mysql8.0及以上 | mysql5.6及以上 |
| 语法复杂度 | 简单,原生支持 | 稍复杂,需要手动维护变量 |
| 执行效率 | 较高,优化器会做针对性优化 | 略低,依赖变量的执行逻辑 |
开发者可以根据自己使用的mysql版本选择合适的实现方法,如果版本支持优先选择ROW_NUMBER窗口函数,语法更清晰且维护性更好。
mysql序列号查询结果ROW_NUMBER变量修改时间:2026-06-25 10:21:30