SQLのLIMITとOFFSETを徹底解説!初心者でもわかるデータ取得の範囲指定方法
生徒
「データベースから全部じゃなくて、一部だけデータを取り出したいんですけど、どうすればいいんですか?」
先生
「それはLIMITとOFFSETという機能を使います。例えば、百人の名簿から最初の十人だけ見たい時や、十一人目から二十人目までを見たい時に使える便利な機能です。」
生徒
「ページ分けみたいなことができるんですね!」
先生
「その通りです。ウェブサイトで商品一覧が十個ずつ表示されて、次のページボタンを押すと次の十個が出てくるのも、この仕組みで作られていますよ。」
1. LIMITとOFFSETとは何か?
LIMITとOFFSETは、SQLでデータベースからデータを取得する際に、取得するデータの範囲を指定するための命令です。データベースには大量のデータが保存されていることが多く、全てのデータを一度に取得すると時間がかかったり、画面に表示しきれなかったりします。
LIMITは「何件取得するか」を指定し、OFFSETは「何件目から取得を始めるか」を指定します。紙の名簿で例えると、LIMITは「何人分コピーするか」、OFFSETは「何人目からコピーするか」を決めるイメージです。
LIMIT: 取得するデータの件数を制限する命令
OFFSET: 取得を開始する位置を指定する命令
レコード: データベースの表における一行分のデータ
2. LIMITの基本的な使い方
まずはLIMITの使い方から見ていきましょう。LIMITは、SELECT文の最後に記述します。基本的な書き方は「LIMIT 取得件数」です。
例えば、会員テーブルから最初の三件だけを取得したい場合を見てみましょう。まず、データベースに以下のようなデータがあるとします。
membersテーブル(全データ)
id | name | age | point
---+--------------+-----+-------
1 | 田中太郎 | 28 | 1500
2 | 山田花子 | 22 | 3200
3 | 佐藤次郎 | 35 | 800
4 | 鈴木美咲 | 19 | 2100
5 | 高橋健一 | 41 | 500
6 | 伊藤さくら | 30 | 4000
7 | 渡辺大輔 | 25 | 1800
このテーブルから最初の三件だけを取得するには、以下のSQLを実行します。
SELECT *
FROM members
LIMIT 3;
このSQLを実行すると、以下のような結果が得られます。
実行結果
id | name | age | point
---+--------------+-----+-------
1 | 田中太郎 | 28 | 1500
2 | 山田花子 | 22 | 3200
3 | 佐藤次郎 | 35 | 800
このように、LIMIT 3と指定することで、データベースから最初の三件のレコードだけを取得できます。これは、ウェブサイトで「新着順に三件表示」といった機能を実装する時によく使われる方法です。
3. OFFSETと組み合わせた使い方
OFFSETは、LIMITと組み合わせて使うことで、取得を開始する位置を指定できます。基本的な書き方は「LIMIT 取得件数 OFFSET スキップ件数」です。OFFSETに指定した数だけ、最初のデータを飛ばしてから取得を開始します。
先ほどのmembersテーブルを使って、四件目から三件を取得する例を見てみましょう。
SELECT *
FROM members
LIMIT 3 OFFSET 3;
OFFSET 3と指定することで、最初の三件をスキップして、四件目から取得が始まります。実行結果は以下のようになります。
実行結果
id | name | age | point
---+--------------+-----+-------
4 | 鈴木美咲 | 19 | 2100
5 | 高橋健一 | 41 | 500
6 | 伊藤さくら | 30 | 4000
このように、最初の三件(田中太郎、山田花子、佐藤次郎)がスキップされ、四件目の鈴木美咲から三件が取得されています。
OFFSETの数え方は「ゼロ」から始まります。OFFSET 0は最初のレコードから、OFFSET 1は二件目から、という意味になります。
4. ページネーション(ページ分け)の実装方法
LIMITとOFFSETを組み合わせることで、ウェブサイトでよく見るページネーション機能を実装できます。ページネーションとは、大量のデータを複数のページに分けて表示する機能のことです。
例えば、一ページに三件ずつ表示する場合、各ページで以下のようなSQLを実行します。
一ページ目(最初の三件)
SELECT *
FROM members
LIMIT 3 OFFSET 0;
二ページ目(四件目から三件)
SELECT *
FROM members
LIMIT 3 OFFSET 3;
三ページ目(七件目から三件)
SELECT *
FROM members
LIMIT 3 OFFSET 6;
このように、OFFSETの値を「(ページ番号 - 1) × 1ページあたりの件数」で計算することで、任意のページのデータを取得できます。例えば、五ページ目なら「(5 - 1) × 3 = 12」なので、OFFSET 12となります。
5. ORDER BYと組み合わせた実践的な使い方
実務では、LIMITとOFFSETをORDER BY(並べ替え)と組み合わせて使うことが多いです。ORDER BYは、データを特定の順番に並べ替える命令です。
例えば、ポイントが高い順に上位三名を表示したい場合は、以下のようにします。
SELECT *
FROM members
ORDER BY point DESC
LIMIT 3;
ORDER BY point DESCは「pointカラムの値を降順(大きい順)に並べ替える」という意味です。DESCはDescending(降順)の略で、反対に昇順(小さい順)にしたい場合はASC(Ascending)を使います。実行結果は以下のようになります。
実行結果
id | name | age | point
---+--------------+-----+-------
6 | 伊藤さくら | 30 | 4000
2 | 山田花子 | 22 | 3200
4 | 鈴木美咲 | 19 | 2100
このように、ポイントが高い順に並べ替えられた状態で、上位三件が取得できます。ランキング表示などでよく使われる手法です。
6. データベース製品による書き方の違い
注意点として、LIMITとOFFSETの書き方はデータベース製品によって少し異なります。ここまで説明してきた書き方は、MySQL、PostgreSQL、SQLiteなどで使える標準的な方法です。
しかし、Microsoft SQL ServerやOracleでは異なる書き方をします。例えば、SQL Serverでは「TOP」や「OFFSET FETCH」という構文を使います。自分が使っているデータベースに合わせた書き方を確認することが大切です。
MySQL/PostgreSQL/SQLite: LIMIT と OFFSET を使用
SQL Server: TOP や OFFSET FETCH を使用
Oracle: ROWNUM や FETCH FIRST を使用
7. パフォーマンスを考慮した使い方
LIMITとOFFSETは便利な機能ですが、OFFSETの値が大きくなると処理が遅くなることがあります。例えば、OFFSET 10000と指定すると、データベースは内部で最初の一万件を読み飛ばしてから結果を返すため、時間がかかってしまいます。
大量のデータを扱う場合は、WHERE句で条件を指定したり、インデックスを活用したりすることで、より効率的にデータを取得できます。インデックスとは、データベースの検索を高速化するための仕組みで、本の索引のようなものです。
初心者のうちは、まずLIMITとOFFSETの基本的な使い方を理解することが大切です。データ量が少ないうちは問題なく動作しますので、安心して練習してください。
8. 実務でよく使う具体例
最後に、実務でよく使われる具体的な例をいくつか紹介します。これらのパターンを覚えておくと、様々な場面で応用できます。
最新の投稿を五件表示
ブログやSNSで、最新の投稿を五件だけ表示したい場合です。
SELECT *
FROM posts
ORDER BY created_at DESC
LIMIT 5;
ランキングの六位から十位を表示
上位五位は別枠で表示して、六位から十位を一覧表示する場合です。
SELECT *
FROM players
ORDER BY score DESC
LIMIT 5 OFFSET 5;
これらの例のように、LIMITとOFFSETを使えば、データの表示方法を柔軟にコントロールできます。ウェブサイトやアプリケーション開発において、非常によく使われる重要な機能です。
ポイント
- LIMITは取得件数を制限する
- OFFSETは取得開始位置を指定する
- ORDER BYと組み合わせると便利
- ページネーション実装の基本技術
- 大量データではパフォーマンスに注意