7.6. LIMITOFFSET

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

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

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

OFFSETは、返す行の開始位置を飛ばす行数を指定します。 OFFSET 0は、OFFSET句を省略した場合と同じで、LIMIT NULLLIMIT句を省略した場合と同じです。 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は必ずしも特定の順序で問い合わせの結果を渡さないという特性の必然的な結果です。

OFFSET句で飛ばされる行を、実際にはサーバ内で計算しなければなりません。 そのため、大きな値のOFFSETは非効率的になることがあります。