他のバージョンの文書 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

2.6. LIMIT と OFFSET

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

LIMIT を使うことで、問い合わせの実行で生成された行の一部を取り出すことができます。リミットカウント(LIMIT)が指定されると、その数を越える行は返されません。LIMIT ALL は LIMIT 句を省略した場合と同じです。

OFFSET は、クライアントへ返す行の開始位置を飛ばす行数を指定します。OFFSET 0 は OFFSET 句を省略した場合と同じです。OFFSET と LIMIT の両方が指定された場合、返す行の LIMIT 行を数える前に、OFFSET 文の行を飛ばします。

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

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