0Pricing
SQL Academy · 课时

LIMIT 与 OFFSET

获取前 N 行并实现分页

LIMIT 与 OFFSET 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

只获取几行

有时您并不想要所有匹配的行,而只想要最前面的几行。LIMIT 会限制查询返回的行数。

这最多返回 5 个产品。

SELECT name, price
FROM products
LIMIT 5;

不使用 ORDER BY 的 LIMIT 具有随机性

单独使用 LIMIT 会返回一些行,但具体是哪些行并未定义。请始终将它与 ORDER BY 配对,以确保结果有意义且可重复。

-- The 5 newest orders, deterministically
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 5;

使用 OFFSET 跳过行

OFFSET 告诉数据库在返回结果前跳过若干行。与 LIMIT 结合后,它构成了分页的基础。

这会跳过前 10 行并返回接下来的 5 行。

SELECT name, price
FROM products
ORDER BY name
LIMIT 5 OFFSET 10;

构建分页

当每页显示 10 行时,页码与偏移量的对应关系如下:

  • 第 1 页:OFFSET 0
  • 第 2 页:OFFSET 10
  • 第 3 页:OFFSET 20

公式为 OFFSET = (page - 1) * page_size。

-- Page 3 with 10 rows per page
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;

操作顺序

数据库按以下顺序应用这些子句:用 WHERE 过滤、用 ORDER BY 排序,然后用 OFFSET 和 LIMIT 裁剪。

因此,您始终是在已排序且已过滤的结果中分页。

SELECT name, price
FROM products
WHERE price > 0
ORDER BY price DESC
LIMIT 10 OFFSET 0;

LIMIT ALL 和 OFFSET 0

LIMIT ALL 表示“不限制”(与省略 LIMIT 相同),而 OFFSET 0 表示不跳过任何内容。当某个值是动态构建时,它们偶尔会很有用。

SELECT name
FROM products
ORDER BY name
LIMIT ALL OFFSET 0;

标准 FETCH 语法

PostgreSQL 也支持 SQL 标准形式:OFFSET n ROWS FETCH NEXT m ROWS ONLY。它实现的功能与 LIMIT/OFFSET 完全相同,只是写法更为冗长。

SELECT name, price
FROM products
ORDER BY name
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;

大型 OFFSET 为什么很慢

较大的 OFFSET 仍会让数据库扫描并丢弃每一行被跳过的记录。OFFSET 100000 会读取 100,000 行后再将它们全部丢弃,因此翻到很后面的页面时会变慢。

-- Reads 100000 rows then discards them
SELECT id, name
FROM products
ORDER BY id
LIMIT 10 OFFSET 100000;

键集分页

更快的替代方案是键集(查找式)分页。不要使用偏移量,而是记住您看到的最后一行,然后请求它之后的行。

这种方式利用索引直接跳到下一页,无需跳过任何行。

-- Next page after the last seen id (e.g. 5000)
SELECT id, name
FROM products
WHERE id > 5000
ORDER BY id
LIMIT 10;

稳定的页面需要稳定的排序

如果您的 ORDER BY 存在并列值,行可能会在加载页面时重新排列,您也可能看到重复项或缺失项。请使用唯一键(例如主键)结束排序,这样分页结果才能保持一致。

SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 10 OFFSET 20;

单条最优记录

LIMIT 1 是获取单行的快捷方式,例如获取价格最高的产品或最新的订单。请将它与正确的 ORDER BY 结合使用。

SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 1;

快速检查

每页显示 10 行。哪个子句会返回第 3 页?

回顾

现在您可以切分查询结果了:

  • LIMIT n 限制行数上限
  • OFFSET m 跳过行;OFFSET = (page-1)*size
  • 始终与 ORDER BY 结合使用,以获得可预测的页面
  • 对于较大的偏移量,为提高速度,优先使用键集分页

接下来,您将使用这些工具查找前 N 名记录。

SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;

常见问题解答

「LIMIT 与 OFFSET」课时是免费的吗?

是的 — 「LIMIT 与 OFFSET」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「LIMIT 与 OFFSET」这节课中我会学到什么?

获取前 N 行并实现分页 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「LIMIT 与 OFFSET」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 ORDER BY 排序
  2. 按多个列排序
  3. LIMIT 与 OFFSET
  4. 查找前 N 条记录
← 返回 SQL Academy