4.6. LIMITとOFFSET

LIMIT および OFFSET を使うことで、問い合わせの実行で生成された行の一部だけを取り出すことができます。

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

限度数 (LIMIT) を指定すると、指定した行数より多くの行が返されることはありません (問い合わせの結果によって、指定より少ないことはあります)。 LIMIT ALL は、LIMIT 句を省略した場合と同じです。

OFFSET は、クライアントへ返す行の開始位置を飛ばす行数を指定します。 OFFSET 0 は、OFFSET 句を省略した場合と同じです。 OFFSET および LIMIT の両者が指定された場合、OFFSET 文の行をスキップしてから、返される LIMIT 行を数え始めます。

LIMIT を使用するときは、結果の行を一意な順序に制約する ORDER BY 句を使用すると便利です。ORDER BYを使わなければ、予知できない問い合わせの行の部分集合を得ることになるでしょう。 10番目から20番目の行を問い合わせることもあるでしょうが、10番目から20番目というのは、どういう順序で並んでいたものでしょうか? ORDER BY を指定しなければ、並び順はわかりません。

問い合わせオプティマイザは、問い合わせ計画を生成するときに LIMIT を考慮に入れます。したがって、LIMITOFFSET に指定した値によって、(行の順序が異なる) 異なった計画が得られます。 このように、1 つの問い合わせ結果から異なる部分集合を選び出すために、異なる LIMIT/OFFSET の値を使用すると、ORDER BY で結果の順序を制約しない限りは、矛盾した結果が生じるでしょう。 これはバグではありません。ORDER BY を使って順序を制約しない限り、SQL は必ずしも特定の順序で問い合わせの結果を渡さないという特性の必然的な結果です。