MySQL分页存储过程怎么写其实也没那么复杂,跟着步骤走就行了
- 问答
- 2026-01-23 23:07:06
- 2
很多人一听到“存储过程”就觉得头大,更别说还要在里面实现分页功能了,感觉是专业人士才能碰的东西,但其实,如果你会写基本的SQL查询,那么写一个分页存储过程真的没那么复杂,咱们今天就不扯那些晦涩难懂的专业术语,就把它当成一个模板或者一个工具,跟着步骤一步步来,你也能轻松搞定。
咱们得明白分页存储过程到底要干嘛,简单说,就是你告诉它“我要看第几页,每页显示多少条”,它就能帮你把对应的数据准确地捞出来,就像翻书一样,你说“翻到第50页”,它不会把前49页的内容也给你,我们的存储过程需要两个最基本的输入参数:当前是第几页,和每页显示多少条记录。
好了,思路清楚了,我们开始动手写,第一步,创建一个存储过程,你可以用任何你习惯的MySQL管理工具,比如Navicat或者直接在命令行里,我们先给这个过程起个名字,比如就叫 sp_pagination,然后定义那两个参数,通常我们用 in_page_no 表示当前页码,用 in_page_size 表示每页大小,参数前面加上 IN 表示这是传入的参数。
接下来是最核心的部分,就是写SQL语句,分页的原理是利用 LIMIT 关键字。LIMIT 后面可以跟两个数字,LIMIT 0, 10,意思是从第0条记录开始(也就是第一条),返回10条记录,这里的“0”叫做偏移量,那么问题就变成了,如何根据页码和每页大小计算出这个偏移量。
计算规则很简单:偏移量 = (当前页码 - 1) 每页大小,每页显示10条,你要看第3页的数据,那么偏移量就是 (3-1)10 = 20,所以你的SQL语句就是 LIMIT 20, 10,这样就能取出第21条到第30条记录,正好是第三页的内容。
在我们的存储过程里,SQL语句就可以这样写,假设我们要查询的是 user 表:
SELECT * FROM user ORDER BY id DESC LIMIT param_offset, param_page_size;
这里我加了 ORDER BY id DESC 是为了让结果按ID倒序排列,这样新添加的数据会排在前面,更符合常见需求,你可以根据你的需要修改排序字段和方式。param_offset 和 param_page_size 就是我们待会儿要计算和替换的变量。
我们需要在存储过程内部声明两个变量,用来存放计算出的偏移量和真正要使用的每页大小,使用 DECLARE 关键字来声明变量,v_offset 和 v_page_size,在开始执行逻辑的地方,用 SET 关键字给这些变量赋值。v_page_size 就直接等于传入的 in_page_size,而 v_offset 就等于我们刚才说的公式:(in_page_no - 1) * in_page_size。
到这里,主体部分就差不多了,一个好的程序还得考虑健壮性,万一有人传进来一个负数或者特别大的页码怎么办?所以我们最好加一个简单的判断,如果页码小于1,我们就让它等于1,如果每页大小小于1,我们可以给它设一个默认值,比如10,这样能避免程序出错。
把这些逻辑用 IF...THEN...END IF; 语句包裹起来,放在变量赋值之后,SQL查询之前。
把我们之前写好的SQL语句里的 param_offset 和 param_page_size 替换成我们计算好的变量 v_offset 和 v_page_size。
我们来把所有的代码片段组合起来,形成一个完整的存储过程,它看起来大概是这个样子的:
DELIMITER // -- 这行是为了改变语句结束符,避免SQL语句里的分号造成混淆
CREATE PROCEDURE sp_pagination(
IN in_page_no INT, -- 传入参数:页码
IN in_page_size INT -- 传入参数:每页大小
)
BEGIN
-- 声明变量
DECLARE v_offset INT DEFAULT 0;
DECLARE v_page_size INT DEFAULT 10;
-- 处理参数,确保有效性
IF in_page_size <= 0 THEN
SET v_page_size = 10;
ELSE
SET v_page_size = in_page_size;
END IF;
IF in_page_no <= 0 THEN
SET v_offset = 0;
ELSE
SET v_offset = (in_page_no - 1) * v_page_size;
END IF;
-- 执行分页查询(这里以user表为例,你可以换成任何你需要的表和数据)
SELECT * FROM `user`
ORDER BY `id` DESC -- 按需修改排序规则
LIMIT v_offset, v_page_size;
END // DELIMITER ; -- 记得把结束符改回分号
写完之后,执行这段代码,就在你的数据库里创建好这个存储过程了,以后你要分页查询用户数据的时候,就不用再写复杂的SQL了,只需要简单地调用这个存储过程就行了,调用的方式也非常简单:
CALL sp_pagination(2, 15);
这行命令的意思就是,查询第2页的数据,每页显示15条,你看,是不是非常清晰简洁?
写一个分页存储过程的关键步骤就是:定义参数 -> 计算偏移量 -> 处理边界情况 -> 组装SQL查询,整个过程其实就是在你已有的SQL知识基础上,加了一层简单的逻辑包装,下次再遇到需要分页的地方,你就可以自豪地拿出这个自己写的“秘密武器”了,省时又省力,希望这个一步步的讲解能让你觉得,分页存储过程其实真的没那么复杂。

本文由瞿欣合于2026-01-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/84731.html
