2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

7.6. LIMITOFFSET #

LIMITOFFSET 允许您仅检索由查询其余部分生成的行的部分。

SELECT select_list
    FROM table_expression
    [ ORDER BY ... ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]

如果给出了限制计数,则返回的行数不超过该计数(但可能更少,如果查询本身产生的行更少)。LIMIT ALL 与省略 LIMIT 子句相同,与具有 NULL 参数的 LIMIT 相同。

OFFSET 指示在开始返回行之前跳过该数量的行。 OFFSET 0 与省略 OFFSET 子句相同,与具有 NULL 参数的 OFFSET 相同。

如果同时出现 OFFSETLIMIT,则在开始计算返回的 LIMIT 行之前,跳过 OFFSET 行。

在使用 LIMIT 时,重要的是使用一个 ORDER BY 子句,该子句将结果行约束到唯一的顺序。否则,您将获得查询行的不可预测子集。您可能要求第 10 到 20 行,但第 10 到 20 行按什么顺序排列?除非您指定了 ORDER BY,否则排序是未知的。

查询优化器在生成查询计划时会考虑 LIMIT,因此您很可能会获得不同的计划(产生不同的行顺序),具体取决于您为 LIMITOFFSET 提供的值。因此,使用不同的 LIMIT/OFFSET 值来选择查询结果的不同子集 将产生不一致的结果,除非您使用 ORDER BY 强制可预测的结果排序。这不是错误;这是 SQL 不会保证以任何特定顺序传递查询结果(除非使用 ORDER BY 来约束顺序)这一事实的必然结果。

OFFSET 子句跳过的行仍必须在服务器内部计算;因此,较大的 OFFSET 可能效率低下。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。