LIMIT
とOFFSET
LIMIT
およびOFFSET
を使うことで、問い合わせの実行で生成された行の一部だけを取り出すことができます。
SELECTselect_list
FROMtable_expression
[ ORDER BY ... ] [ LIMIT {number
| ALL } ] [ OFFSETnumber
]
限度(limit)数を指定すると、指定した行数より多くの行が返されることはありません(しかし、問い合わせの結果が指定した行数より少なければ、それより少なくなります)。
LIMIT ALL
は、LIMIT
句を省略した場合と同じです。LIMIT
の引数がNULLの場合も同様です。
OFFSET
は、行を返し始める前に飛ばす行数を指定します。
OFFSET 0
は、OFFSET
句を省略した場合と同じです。OFFSET
の引数がNULLの場合も同様です。
OFFSET
およびLIMIT
の両者が指定された場合、OFFSET
分の行を飛ばしてから、返されるLIMIT
行を数え始めます。
LIMIT
を使用する時は、結果の行を一意な順序に制御するORDER BY
句を使用することが重要です。
ORDER BY
を使わなければ、問い合わせの行について予測不能な部分集合を得ることになるでしょう。
10番目から20番目の行を問い合わせることもあるでしょうが、どういう並び順での10番目から20番目の行でしょうか?
ORDER BY
を指定しなければ、並び順はわかりません。
問い合わせオプティマイザは、問い合わせ計画を生成する時にLIMIT
を考慮します。
そのため、LIMIT
とOFFSET
に指定した値によって、異なった計画(得られる行の順序も異なります)が得られる可能性が高いです。
従って、1つの問い合わせ結果から異なる部分集合を選び出すために、異なるLIMIT
/OFFSET
の値を使用すると、ORDER BY
で結果の順序を制御しなければ、一貫しない結果が生じるでしょう。
これは不具合ではありません。
ORDER BY
を使って順序を制御しない限り、SQLは必ずしも特定の順序で問い合わせの結果を渡さないという特性の必然的な結果です。
OFFSET
句で飛ばされる行を、実際にはサーバ内で計算しなければなりません。
そのため、大きな値のOFFSET
は非効率的になることがあります。