SQL LIMIT 分页
学习 LIMIT 和 OFFSET 分页 · 难度:入门 · +10XP
SQL LIMIT 分页查询
当表中包含成千上万条记录时,一次性查询所有数据会导致严重的性能问题:内存占用过大、网络传输缓慢、页面加载超时。分页查询是解决这个问题的标准方案——每次只获取一小部分数据,就像翻书一样一页一页地查看。SQL 的 LIMIT 和 OFFSET 子句就是实现分页的核心工具。
LIMIT 基本语法
SELECT 列名 FROM 表名 LIMIT 行数;
SELECT 列名 FROM 表名 LIMIT 行数 OFFSET 偏移量;
参数说明:行数表示每页要返回的记录条数;偏移量表示跳过前面多少条记录。第一页的偏移量为 0。
基础示例
-- 查询前3条记录
SELECT * FROM students LIMIT 3;
-- 跳过前1条,查询后续2条
SELECT * FROM students LIMIT 2 OFFSET 1;
-- 查询分数最高的前3名学生
SELECT * FROM students ORDER BY score DESC LIMIT 3;
-- 查询年龄最小的5名学生
SELECT * FROM students ORDER BY age ASC LIMIT 5;
分页计算公式
在 Web 应用中实现分页时,常用的计算公式如下:
| 页码 | LIMIT | OFFSET 计算公式 | 实际 OFFSET |
|---|---|---|---|
| 第1页 | 10 | (1-1)*10 = 0 | 0 |
| 第2页 | 10 | (2-1)*10 = 10 | 10 |
| 第3页 | 10 | (3-1)*10 = 20 | 20 |
通用公式:OFFSET = (页码 - 1) * 每页条数
不同数据库的语法差异
-- MySQL / PostgreSQL / SQLite
SELECT * FROM students LIMIT 10 OFFSET 20;
-- MySQL 简写(OFFSET 在前时不能用)
SELECT * FROM students LIMIT 20, 10; -- OFFSET 20, LIMIT 10
-- SQL Server / MS Access
SELECT TOP 10 * FROM students;
-- Oracle(12c之前)
SELECT * FROM students WHERE ROWNUM <= 10;
-- Oracle 12c+
SELECT * FROM students FETCH FIRST 10 ROWS ONLY;
性能注意事项
- LIMIT 必须配合 ORDER BY 使用,否则结果的顺序不可预测,分页将失去意义
- 大 OFFSET 值会导致性能下降(数据库仍需扫描跳过的行),建议使用游标分页(WHERE id > 上次最大id)替代
- 先 ORDER BY 再 LIMIT,数据库会先排序全表再截取,排序开销不可避免
- 在 ORDER BY 列上建立索引可以显著提升分页查询性能
实战任务
- 查询分数排名前 3 名的学生信息
- 模拟分页:每页 2 条,分别查询第 1 页和第 2 页的数据
- 使用 ORDER BY + LIMIT 找出年龄最小的 3 位学生