今回は、SQLのSELECT区で結果を抽出する際に、データの抽出件数や開始位置を指定することができるLIMITとOFFSETについて説明します。
一般にデータベースには大量のデータが格納されています。
それらを抽出する際にSELECT~FROMだけのSQL文を実行すると、テーブルに格納されているすべてのデータが抽出されてしまい、システムへの負担やデータ加工の手間などが発生してしまいます。
テーブルからデータを抽出する際には、必要な件数を指定するLIMITと開始位置を指定するOFFSETを使うことで、合理的なデータ抽出ができるようになります。
この記事では、LIMITとOFFSETの基本文法と実例を紹介します。
抽出件数を指定するLIMIT
この章では、テーブルからの抽出件数を指定するためのLIMIT区の基本的な書き方を説明します。
基本文法
抽出件数を指定する
SELECT * FROM テーブル名 LIMIT 抽出件数;
実際のSQL
- テーブル名・・・・Vegetable
- 抽出件数・・・3件
たとえば、テーブル[Vegetable]からデータを抽出する際、件数を3件に指定する場合には、下記のようにSQL文を記述します。
SELECT * FROM Vegetable LIMIT 3;
MySQLのLIMITの実例
PostgreSQLのLIMITの実例
データの開始位置も指定するOFFSET
前章のLIMIT区を使う場合には、データの開始位置を指定するOFFSETと併用することもあります。
TOP3やTOP5のデータを抽出するのであれば開始位置を指定する必要はありませんが、中間データを抽出したい場合などです。
その場合、LIMITにOFFSET区を加えることで、抽出件数と開始位置を同時に指定することができます。
なお、RDBMSではデータの並び順を保証していませんので、実際にLIMITやOFFSETを使う場合には、データの並び順を制御するORDER BYも組み合わせて使うことが普通です。
LIMITとOFFSETにORDER BYを組み合わせる場合のSQL文の書き方については、後述します。
基本文法
データの開始位置を指定する
SELECT * FROM テーブル名 LIMIT 抽出件数 OFFSET 開始位置;
OFFSETに続く開始位置は、実際にはスキップする件数を指定します。たとえば、下記のようなテーブル(Japan_rank)から4件目以降のデータを抽出したい場合のSQL文は、次のように記述します。
- 東京都
- 神奈川県
- 大阪府
- 愛知県
- 埼玉県
- 千葉県
SELECT * FROM Japan_rank limit 2 OFFSET 3;
これは、上位3件を除き4件目のデータから抽出するという命令になります。
MySQLのOFFSETの実例
PostgreSQLのOFFSETの実例
ORDER BYとの組み合わせ
最後に、前章までに説明したLIMITとOFFSETに、データの並び順を制御するORDER BYを組み合わせるSQL文について、説明します。
ORDER BY、LIMIT、OFFSET
- テーブル名・・・・Vegetable
- 並び順のキー・・id
- 抽出件数・・・2件
- 開始位置・・4件目以降を抽出
SELECT * FROM Vegetable ORDER BY id LIMIT 2 OFFSET 3;
上記のSQL文を実行すると、id列で昇順にソートされたデータを上位4件目から2件だけ抽出します。
あとがき
今回は、テーブルからSQL文でデータを抽出する際に、抽出件数や開始位置をLIMITとOFSSETを使って指定する方法について、記事にしました。
データベースのテーブルからデータを抽出するときには、目的に沿ったSQL文を記述するのが基本です。たとえば、レコード件数が10万件を超過するテーブルから、件数を指定せずにすべてのデータを抽出するのは合理的ではありません。
ORDER BYやLIMIT、OFFSETを使って効率的にSQL文を実行しましょう。