SQLでデータを取得する際、全てのデータが必要なわけではなく、何件分のデータが欲しいといったケースは意外と多いものです。
今回はSQLでデータの取得件数を指定する際に利用するLIMIT句の使い方について、サンプルを交えながらご紹介していきたいと思います。
目次
SQLでデータの取得件数を指定する方法
SQLでデータの取得件数を指定するLIMIT句の基本的な使い方からご紹介していきます。
基本構文
LIMIT句はSQL文の末尾に記載します。
SELECT カラム名[, カラム名, ...] FROM テーブル名 [WHERE 条件式] LIMIT 件数;
サンプル
今回のサンプルでは「user」テーブルを作成し、下記のデータを格納しておきました。
user
+------+--------------------+------+ | id | name | age | +------+--------------------+------+ | 1 | 山田太郎 | 30 | | 2 | 山田花子 | 25 | | 3 | 鈴木次郎 | 20 | | 4 | 田中一 | 40 | | 5 | 田中ひかり | 19 | | 6 | 遠藤とおる | 39 | | 7 | 木田陽子 | 26 | | 8 | 浜田みく | 31 | | 9 | 大谷こうすけ | 56 | | 10 | 坂本雅人 | 26 | +------+--------------------+------+
最初のサンプルではシンプルにLIMIT句で5件のデータだけを取得してみましょう。
mysql> select * from user limit 5; +------+-----------------+------+ | id | name | age | +------+-----------------+------+ | 1 | 山田太郎 | 30 | | 2 | 山田花子 | 25 | | 3 | 鈴木次郎 | 20 | | 4 | 田中一 | 40 | | 5 | 田中ひかり | 19 | +------+-----------------+------+ 5 rows in set (0.02 sec)
idの順番に5件のデータが取得出来ましたね。
ただし、自分自身で並び順を指定したわけではないので、必ずid順に取得されるとの保証があるわけではありません。
SQLを並び替えて取得件数を指定してみよう
では自分が意図したデータの並びで取得件数を指定するために「ORDER BY」と組み合わせてデータを取得してみましょう。
idの降順で取得件数を指定する
最初のサンプルではidの降順に並び替えを行った上で5件のデータを取得しています。
mysql> select * from user order by id desc limit 5; +------+--------------------+------+ | id | name | age | +------+--------------------+------+ | 10 | 坂本雅人 | 26 | | 9 | 大谷こうすけ | 56 | | 8 | 浜田みく | 31 | | 7 | 木田陽子 | 26 | | 6 | 遠藤とおる | 39 | +------+--------------------+------+ 5 rows in set (0.04 sec)
年齢の若い順で取得件数を指定する
今回のサンプルでは少し複雑な条件として、WHERE句で20代以上のデータに絞り込みを行った上で、年齢が若い順に3人のデータを取得しています。
mysql> select * from user where age >= 20 order by age limit 3; +------+--------------+------+ | id | name | age | +------+--------------+------+ | 3 | 鈴木次郎 | 20 | | 2 | 山田花子 | 25 | | 10 | 坂本雅人 | 26 | +------+--------------+------+ 3 rows in set (0.01 sec)
このようにLIMIT句は、WHERE句による条件抽出やORDER BYの並び替えが全て完了した後に実行されます。
取得開始位置を指定するSQLを書いてみよう
SQLで取得件数を指定する際、取得開始位置を指定したいといった要望も多いものです。
例えば30位までのランキングがテーブルに格納されていて、11位から20位までを取得したいような意図ですね。
「OFFSET句」を利用する方法と、LIMIT句のオプションとして取得開始位置を指定する省略記法の2種類で実現することが可能です。
基本構文
OFFSET句を記述する方法から確認していきましょう。
SELECT カラム名[, カラム名, ...] FROM テーブル名 [WHERE 条件式] LIMIT 件数 OFFSET 開始位置;
LIMIT句の後にOFFSET句で開始位置を設定します。
開始位置は1件目から取得する場合「0」となり、11件目のデータから取得したい場合は「10」と指定します。
開始位置を指定しなかった場合のデフォルトは「0」なので、1件目から順番に取得する設定となります。
つぎにOFFSET句を利用しない記述方法です。
SELECT カラム名[, カラム名, ...] FROM テーブル名 [WHERE 条件式] LIMIT 開始位置, 取得件数;
開始位置と取得件数をカンマで区切ることで、OFFSET句を利用しない記述方法が可能です。
注意しておきたいポイントが、OFFSET句を利用する場合とは反対に開始位置の指定が、取得件数の指定より前に切り替わります。
サンプル
では実際にサンプルデータの7件目から9件目のデータを取得するサンプルで確認してみましょう。
mysql> select * from user limit 3 offset 6; +------+--------------------+------+ | id | name | age | +------+--------------------+------+ | 7 | 木田陽子 | 26 | | 8 | 浜田みく | 31 | | 9 | 大谷こうすけ | 56 | +------+--------------------+------+ 3 rows in set (0.08 sec)
OFFSET句を利用しない書き方でも試しておきましょう。
mysql> select * from user limit 6, 3; +------+--------------------+------+ | id | name | age | +------+--------------------+------+ | 7 | 木田陽子 | 26 | | 8 | 浜田みく | 31 | | 9 | 大谷こうすけ | 56 | +------+--------------------+------+ 3 rows in set (0.00 sec)
OFFSET句を利用した場合と同じ結果が取得出来ていますね。
さいごに:SQLの取得件数を指定して必要なデータだけを抽出しよう
本記事では、SQLの取得件数を指定するLIMIT句の使い方についてご紹介してきました。
LIMIT句を利用してデータの取得件数を指定することで、テーブルから不要なデータごと取得するよりもSQLパフォーマンスの向上が期待出来ます。
一方で、OFFSET句などを利用して取得開始位置を指定する場合には、使い方によって処理が遅くなってしまうケースもありますので、WHERE句での条件指定などとうまく組み合わせながら、最適なSQL文構築を模索してみてください。
LIMIT句はMySQLの記述方法で、データベース毎に取得件数の指定方法は異なります。
ご利用のデータベースの仕様を確認し、データベース仕様に準じた記述で実装してください。