PREPARATION
受験対策

オススメ!OSS-DB情報

第19回 SELECT文のLIMITとOFFSET

SELECT ... FROM ... WHERE ...
というSELECT文を普通に実行すると、WHERE句の条件に合致したすべての行が返されます。しかし、アプリケーションによっては、すべての行ではなく、一部の行だけを返して欲しい、ということもあります。そんなときに使えるのがLIMIT句です。
LIMITの後の数値で、SELECTから返される行数を指定します。
例えば、
SELECT * FROM tablename LIMIT 5;
とすると、tablenameというテーブルから5行だけ表示します。

どの行でも良いから、多数のデータからとにかく5行だけ表示したい、という場合は、単に LIMIT 5 と指定すれば良いですが、例えば、金額の多い順に並べた時の上位5件を表示したい、などといったケースがほとんどでしょうから、LIMITはORDER BYと組み合わせて使われるのが通常です。ORDER BY句を付けなければ、SELECT文が返す行の順序は何も保証されない、ということにも注意してください。

例えば、上位5件のデータを表示した後、それに続く処理として、次の5件を表示したい、というケースもあるでしょう。そんな時は、LIMITにOFFSETを組み合わせて使います。
SELECT * FROM tablename ORDER BY columnname LIMIT 5 OFFSET 5;
とすると、columnnameの値でソートした後、上位5件(OFFSETで指定した行数)のデータをスキップして、次の5件(LIMITで指定した行数)を表示します。つまり6番目から10番目のデータが表示されます。

LIMIT/OFFSETは便利な機能なのですが、標準SQLの機能ではないため、すべてのRDBMSで利用できるわけではないことにも注意が必要です。PostgreSQLの他、MySQLでもLIMIT/OFFSETを使うことができますが、それ以外の主要なデータベースではサポートしていないようです。
他のデータベースで利用されるよく似た機能では、TOP修飾子を使う方法、ROWNUM擬似列を使う方法、などがありますが、例えばOracleのROWNUM擬似列では、ORDER BYと組み合わせて、上位5件のデータを取得する、といったことができません。

標準SQLにはrow_number()という関数があり、これを使うとLIMIT/OFFSETと同様のことが実現できます。
ただし、上の6番目から10番目のデータを取得するSELECT文は、例えば
SELECT * FROM (
 SELECT *, row_number() OVER (ORDER BY columnname) rn
 FROM tablename
) t
WHERE t.rn > 5 AND t.rn <= 10;
となります。インラインビューを使わないと記述できないので、実現できるとは言え、LIMIT/OFFSETに比べると、かなり複雑ですね。

解説:松田神一

LPI-Japan
Platinum Sponsors

関連資格