MySQL里怎么写分页代码才算对,给个简单点的示例参考一下吧
- 问答
- 2025-12-26 04:03:12
- 3
LIMIT怎么用?
想象一下,你有一本很厚的电话簿(这就是你数据库里的表),你不可能一次把所有人的电话都给别人看,你只能一页一页地翻。LIMIT 就是你告诉MySQL:“嘿,从这本书的第几条记录开始,只给我翻看接下来的多少条。”
LIMIT 有两种基本的写法:
写法1:只要指定数量
SELECT * FROM 表名 LIMIT 10;
这句话的意思是:从表里取数据,只要前10条,这就像你说“把电话簿最前面的10个人的信息给我”,这是最简单的情况,适用于只看第一页。
写法2:指定从哪儿开始,要多少条
SELECT * FROM 表名 LIMIT 20, 10;
这是分页最关键的写法,这里有两个数字,用逗号隔开。
- 第一个数字
20:表示“偏移量”(Offset),意思是“跳过前面多少条记录”,注意,MySQL的记录是从0开始数的,LIMIT 20, 10表示跳过前20条记录,从第21条开始。 - 第二个数字
10:表示“要获取的记录数”(Row Count),意思是“从跳过之后的位置开始,拿多少条”。
LIMIT 20, 10 合起来就是:跳过前20条,然后取接下来的10条,这正好就是显示第三页的数据(如果每页显示10条的话),因为第1页是1-10条(LIMIT 0,10),第2页是11-20条(LIMIT 10,10),第3页就是21-30条(LIMIT 20,10)。

一个完整的、简单的分页示例
假设我们有一个叫 users 的用户表,里面有id, name, email等字段,现在我们需要做一个网页,每页显示5个用户。
第1页的SQL代码:
SELECT id, name, email FROM users ORDER BY id ASC LIMIT 0, 5;
ORDER BY id ASC是为了让结果按照id从小到大的顺序排列,这样分页才不会乱。排序在分页中非常重要,如果没有固定的排序,每次查询结果的顺序可能不一样,分页就会出问题。LIMIT 0, 5表示从第0条开始(也就是从头开始),取5条。
第2页的SQL代码:
SELECT id, name, email FROM users ORDER BY id ASC LIMIT 5, 5;
这里 LIMIT 5, 5 表示跳过前5条(即第1页的数据),然后取接下来的5条。
第3页的SQL代码:

SELECT id, name, email FROM users ORDER BY id ASC LIMIT 10, 5;
以此类推。
在实际编程中怎么用?
在真实的项目中,比如用PHP、Java、Python等语言写后台,你不可能为每一页都手写一条SQL,页码通常是前端传过来的一个变量,page。
这时,我们需要根据页码动态计算 LIMIT 的两个参数,公式非常简单:
- 每页条数:一般固定,比如叫
pageSize,假设为10。 - 偏移量:
offset = (当前页码 - 1) * 每页条数
举例:
- 如果当前要查第1页:
offset = (1-1)*10 = 0,SQL就是LIMIT 0, 10 - 如果当前要查第3页:
offset = (3-1)*10 = 20,SQL就是LIMIT 20, 10
用Python(使用PyMySQL库)举个例子,代码会是这样:

import pymysql
# 连接数据库(这里用假参数)
connection = pymysql.connect(host='localhost', user='root', password='password', database='test_db')
# 获取前端传递的页码,假设是第3页
current_page = 3
page_size = 5
# 计算偏移量
offset = (current_page - 1) * page_size
# 构造SQL语句
sql = "SELECT id, name, email FROM users ORDER BY id ASC LIMIT %s, %s"
try:
with connection.cursor() as cursor:
# 执行SQL,传入两个参数 (offset, page_size)
cursor.execute(sql, (offset, page_size))
# 获取这一页的结果
page_data = cursor.fetchall()
for row in page_data:
print(f"ID: {row[0]}, 姓名: {row[1]}, 邮箱: {row[2]}")
finally:
connection.close()
这样,无论前端传过来哪一页,我们都能通过计算得到正确的 LIMIT 参数,从而查询到对应的数据。
一个重要的提醒:LIMIT 新写法
在比较新的MySQL版本中(也兼容老版本),推荐使用另一种更清晰的写法来代替 LIMIT offset, count。
新写法是:LIMIT count OFFSET offset
这个写法把两个参数分开了,语义上更明确:“限制获取多少条记录,偏移量是多少”,上面的例子用新写法重写就是:
- 第3页,每页5条:
LIMIT 5 OFFSET 10(注意,这里偏移量还是10,因为(3-1)*5=10)
这个写法避免了有时会混淆 LIMIT 20, 10 中两个数字顺序的问题(到底是跳过20条取10条,还是跳过10条取20条?),直接看 OFFSET 这个词就明白了,如果是从头开始学,可以优先采用这种写法。
怎样才算“写对了”?
在MySQL里把分页代码写对,关键就几点:
- 一定要用
ORDER BY:确保数据有一个固定的排序顺序,这是分页准确的前提,否则数据库可能按它觉得方便的顺序返回数据,导致不同页码出现重复数据或丢失数据。 - 理解
LIMIT两个参数的含义:特别是“偏移量”是从0开始计数的,熟练掌握偏移量 = (页码 - 1) * 每页大小这个核心公式。 - 在程序中安全地拼接SQL:就像上面的Python例子,使用参数化查询(
%s占位符)而不是直接字符串拼接,防止SQL注入攻击。 - 考虑性能(进阶提醒):当数据量非常大时(比如翻到第1000页),
LIMIT 10000, 20这种查询会先扫描偏移的10000条记录,然后才取20条,效率可能很低,优化方法通常涉及使用“游标”或“记录上一次查询的最大ID”等方式,但这属于更高级的话题,对于大多数普通应用,LIMIT已经足够好用。
一个“对的”、简单的分页代码模板就是:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT [offset], [count] 或者 SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT [count] OFFSET [offset],并确保偏移量是通过页码正确计算出来的。
本文由召安青于2025-12-26发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/68565.html
