LIMIT
とOFFSET
#
<literal>LIMIT</literal> and <literal>OFFSET</literal> allow you to retrieve just
a portion of the rows that are generated by the rest of the query:
LIMIT
およびOFFSET
を使うことで、問い合わせの実行で生成された行の一部だけを取り出すことができます。
SELECTselect_list
FROMtable_expression
[ ORDER BY ... ] [ LIMIT {count
| ALL } ] [ OFFSETstart
]
If a limit count is given, no more than that many rows will be
returned (but possibly fewer, if the query itself yields fewer rows).
<literal>LIMIT ALL</literal> is the same as omitting the <literal>LIMIT</literal>
clause, as is <literal>LIMIT</literal> with a NULL argument.
限度(limit)数を指定すると、指定した行数より多くの行が返されることはありません(しかし、問い合わせの結果が指定した行数より少なければ、それより少なくなります)。
LIMIT ALL
は、LIMIT
句を省略した場合と同じです。LIMIT
の引数がNULLの場合も同様です。
<literal>OFFSET</literal> says to skip that many rows before beginning to
return rows. <literal>OFFSET 0</literal> is the same as omitting the
<literal>OFFSET</literal> clause, as is <literal>OFFSET</literal> with a NULL argument.
OFFSET
は、行を返し始める前に飛ばす行数を指定します。
OFFSET 0
は、OFFSET
句を省略した場合と同じです。OFFSET
の引数がNULLの場合も同様です。
If both <literal>OFFSET</literal>
and <literal>LIMIT</literal> appear, then <literal>OFFSET</literal> rows are
skipped before starting to count the <literal>LIMIT</literal> rows that
are returned.
OFFSET
およびLIMIT
の両者が指定された場合、OFFSET
分の行を飛ばしてから、返されるLIMIT
行を数え始めます。
When using <literal>LIMIT</literal>, it is important to use an
<literal>ORDER BY</literal> clause that constrains the result rows into a
unique order. Otherwise you will get an unpredictable subset of
the query's rows. You might be asking for the tenth through
twentieth rows, but tenth through twentieth in what ordering? The
ordering is unknown, unless you specified <literal>ORDER BY</literal>.
LIMIT
を使用する時は、結果の行を一意な順序に制御するORDER BY
句を使用することが重要です。
ORDER BY
を使わなければ、問い合わせの行について予測不能な部分集合を得ることになるでしょう。
10番目から20番目の行を問い合わせることもあるでしょうが、どういう並び順での10番目から20番目の行でしょうか?
ORDER BY
を指定しなければ、並び順はわかりません。
The query optimizer takes <literal>LIMIT</literal> into account when
generating query plans, so you are very likely to get different
plans (yielding different row orders) depending on what you give
for <literal>LIMIT</literal> and <literal>OFFSET</literal>. Thus, using
different <literal>LIMIT</literal>/<literal>OFFSET</literal> values to select
different subsets of a query result <emphasis>will give
inconsistent results</emphasis> unless you enforce a predictable
result ordering with <literal>ORDER BY</literal>. This is not a bug; it
is an inherent consequence of the fact that SQL does not promise to
deliver the results of a query in any particular order unless
<literal>ORDER BY</literal> is used to constrain the order.
問い合わせオプティマイザは、問い合わせ計画を生成する時にLIMIT
を考慮します。
そのため、LIMIT
とOFFSET
に指定した値によって、異なった計画(得られる行の順序も異なります)が得られる可能性が高いです。
従って、1つの問い合わせ結果から異なる部分集合を選び出すために、異なるLIMIT
/OFFSET
の値を使用すると、ORDER BY
で結果の順序を制御しなければ、一貫しない結果が生じるでしょう。
これは不具合ではありません。
ORDER BY
を使って順序を制御しない限り、SQLは必ずしも特定の順序で問い合わせの結果を渡さないという特性の必然的な結果です。
The rows skipped by an <literal>OFFSET</literal> clause still have to be
computed inside the server; therefore a large <literal>OFFSET</literal>
might be inefficient.
OFFSET
句で飛ばされる行を、実際にはサーバ内で計算しなければなりません。
そのため、大きな値のOFFSET
は非効率的になることがあります。