2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 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 子句相同,LIMIT 帶有 NULL 引數也與此相同。

OFFSET 表示在開始返回行之前跳過指定數量的行。OFFSET 0 與省略 OFFSET 子句相同,OFFSET 帶有 NULL 引數也與此相同。

如果同時出現 OFFSETLIMIT,則在開始計算要返回的 LIMIT 行之前,會跳過 OFFSET 行。

使用 LIMIT 時,使用約束結果行以產生唯一順序的 ORDER BY 子句非常重要。否則,您將獲得查詢行的不可預測的子集。您可能正在請求第十行到第二十行,但這是在什麼順序下的第十行到第二十行?除非您指定了 ORDER BY,否則順序是未知的。

查詢最佳化器在生成查詢計劃時會考慮 LIMIT,因此根據您為 LIMITOFFSET 提供的值,您很可能會獲得不同的計劃(產生不同的行順序)。因此,使用不同的 LIMIT/OFFSET 值來選擇查詢結果的不同子集,將導致結果不一致,除非您使用 ORDER BY 來強制執行可預測的結果順序。這不是錯誤;這是 SQL 不保證以任何特定順序返回查詢結果的固有結果,除非使用 ORDER BY 來約束順序。

OFFSET 子句跳過的行仍然需要在伺服器內部進行計算;因此,較大的 OFFSET 可能會效率低下。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。