無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

7.6. LIMIT OFFSET

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

SELECT 

select_list


    FROM 

table_expression


    [
 ORDER BY ... 
]
    [
 LIMIT { 

number

 | ALL } 
] [
 OFFSET 

number

 
]

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

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


powered by SEO.CUG.NET