LIMITとOFFSET

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 7章問い合わせ | 早送り | 次のページ

# 7.6. `LIMIT`と`OFFSET`

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

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

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

`OFFSET`は、返す行の開始位置を飛ばす行数を指定します。 `OFFSET 0`は、`OFFSET`句を省略した場合と同じです。 `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`は非効率的になることがあります。

前のページ | ホーム | 次のページ
行のソート | 上に戻る | データ型