7.6. LIMITOFFSET

附加上 LIMITOFFSET 子句之後,您就可以檢索原來查詢語句查詢出來的結果中的一部分資料行:

SELECT select_list
	FROM table_expression
	[LIMIT { number | ALL }] [OFFSET number]

如果給出了一個限制計數,那麼返回不超過那麼多的行。 (但可能更少些,因為查詢本身可能生成的行數就比較少。) LIMIT ALL和省略 LIMIT子句一樣。

OFFSET說明在開始返回行之前忽略多少行。 OFFSET 0和省略OFFSET子句是一樣的。 如果OFFSETLIMIT都出現了, 那麼在計算LIMIT個行之前忽略OFFSET行。

如果使用LIMIT,那麼用ORDER BY 子句把結果行約束成一個唯一的順序是一個好主意。 否則您就會拿到一個不可預料的該查詢的行的子集。 — 您要的可能是第十到二十行,但以什麼順序的十到二十? 除非您聲明了ORDER BY,否則順序是不知道的。

查詢優化器在生成查詢規劃的時候會考慮LIMIT,因此如果您給 LIMITOFFSET不同的東西,那麼您很可能收到不同的規劃(產生不同的行順序)。 因此,使用不同的LIMIT/OFFSET值選擇不同的查詢結果的子集將生成不一致的結果, 除非您用ORDER BY強制一個可預料的順序。這可不是臭蟲; 這是一個很自然的結果,因為 SQL 沒有許諾把查詢的結果按照任何特定的順序發出,除非用了ORDER BY來約束順序。

OFFSET 子句忽略的行仍然需要在伺服器內部計算;因此,一個很大的 OFFSET 可能還是不夠有效率的。