跳转到主要内容
OFFSETFETCH 允许你分批检索数据。它们指定了你希望通过单次查询获取的一个行块。
-- SQL 标准风格:
[OFFSET offset_row_count {ROW | ROWS}] [FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}]

-- MySQL/PostgreSQL 风格:
[LIMIT [n, ]m] [OFFSET offset_row_count]
offset_row_countfetch_row_count 的值可以是数值,也可以是字面常量。你可以省略 fetch_row_count;默认值为 1。 OFFSET 指定在开始返回查询结果集中的行之前要跳过的行数。OFFSET n 会跳过结果中的前 n 行。 支持负数 OFFSETOFFSET -n 会跳过结果中的最后 n 行。 也支持小数 OFFSETOFFSET n — 如果 0 < n < 1,则会跳过结果的前 n * 100%。 示例: • OFFSET 0.1 — 跳过结果的前 10%。
注意 • 该小数必须是大于 0 且小于 1 的 Float64 数值。 • 如果计算结果得到的行数不是整数,则会向上取整到下一个整数。
FETCH 指定查询结果中最多可包含的行数。 ONLY 选项用于返回紧接在被 OFFSET 省略的行之后的那些行。在这种情况下,FETCH 可作为 LIMIT 子句的替代方案。例如,以下查询
SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY;
与该查询完全相同
SELECT * FROM test_fetch ORDER BY a LIMIT 3 OFFSET 1;
WITH TIES 选项用于返回结果集中按照 ORDER BY 子句排序后与最后一行并列的其他行。例如,如果 fetch_row_count 设置为 5,但还有另外两行的 ORDER BY 列值与第 5 行相同,则结果集将包含 7 行。
根据标准,如果同时存在 OFFSET 子句和 FETCH 子句,则 OFFSET 子句必须位于 FETCH 子句之前。
实际偏移量还可能取决于 offset 设置。

示例

输入表:
┌─a─┬─b─┐
│ 1 │ 1 │
│ 2 │ 1 │
│ 3 │ 4 │
│ 1 │ 3 │
│ 5 │ 4 │
│ 0 │ 6 │
│ 5 │ 7 │
└───┴───┘
ONLY 选项的用法:
Query
SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS ONLY;
Response
┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
└───┴───┘
WITH TIES 选项的使用:
Query
SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS WITH TIES;
Response
┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
│ 5 │ 7 │
└───┴───┘
最后修改于 2026年6月10日