こんにちは、かつコーチです。
「新着記事を5件だけ表示したい」「1ページあたり20件ずつ表示するページネーションを作りたい」。
こうした要件でよく使うのがLIMIT句とOFFSET句です。
この記事では、usersテーブルを例にLIMIT・OFFSETの使い方を解説します。
LIMITとは?
LIMITの役割
LIMIT句とは、SELECT文の結果として取得する行数を制限するための構文です。
データが何万件あっても、LIMITで指定した件数だけを取得できます。
基本構文
SELECT カラム名 FROM テーブル名 LIMIT 取得件数;
例えば、新しく登録された会員を3件だけ取得したい場合は、ORDER BYと組み合わせて以下のように書きます。
SELECT name, created_at FROM users ORDER BY created_at DESC LIMIT 3;
LIMITは「何件取得するか」を制限するだけなので、必ずORDER BYとセットで使うのが実務上の基本です。
ORDER BYがないと、「どの3件が返ってくるか」が保証されず、実行するたびに結果が変わる可能性があります。
OFFSETとは?
OFFSETの役割
OFFSET句とは、取得結果の先頭から何件分を読み飛ばすかを指定する構文です。
LIMITと組み合わせることで、「〇件目から△件分取得する」という指定ができます。
基本構文
SELECT カラム名 FROM テーブル名 LIMIT 取得件数 OFFSET 読み飛ばす件数;
例えば、4件目から2件分を取得したい場合は以下のように書きます。
SELECT name FROM users ORDER BY id LIMIT 2 OFFSET 3;
これは「先頭3件を読み飛ばして、そこから2件取得する」という意味になります。
ページネーションでの実践的な使い方
1ページあたり10件のページネーション
LIMIT・OFFSETの最も代表的な用途が、Webサイトでよく見るページネーション(ページ送り機能)です。
-- 1ページ目(1〜10件目)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 0;
-- 2ページ目(11〜20件目)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;
-- 3ページ目(21〜30件目)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
OFFSETの値は「(ページ番号 – 1) × 1ページあたりの件数」という計算式で求められます。
アプリ側でページ番号を受け取り、この計算式でOFFSETを動的に組み立てるのが一般的な実装パターンです。
つまずきやすい設定・注意点
OFFSETが大きくなると処理が遅くなる
学習中はあまり意識しませんが、実務でLIMIT・OFFSETによるページネーションを使う際に注意すべき点があります。
❌ SELECT * FROM users ORDER BY id LIMIT 20 OFFSET 500000;
-- OFFSETの値が大きいほど、読み飛ばす処理に時間がかかり遅くなる
私が担当した大規模な会員データを扱う案件では、OFFSETが数十万件を超えたページで表示が明らかに遅くなるという問題が発生しました。
これは、データベースが「読み飛ばす分も含めて一度データを読み込んでから絞り込む」という処理をしているためです。
対策としては、IDやcreated_atなど連続した値を基準に「前回取得した最後の値より大きいものをN件取得する」という書き方(カーソルベースページネーション)に切り替えるのが定番です。
✅ SELECT * FROM users WHERE id > 500000 ORDER BY id LIMIT 20;
大量データを扱うページネーションを実装する際は、この違いを覚えておくとパフォーマンス改善に役立ちます。
MySQL以外での構文の違い
LIMIT・OFFSETの書き方はMySQLとPostgreSQLでは共通ですが、SQL Serverなど一部のDBMSではOFFSET ... FETCHという異なる構文を使います。
この基礎編ではMySQL構文を基準にしていますが、他のDBMSに触れる際は構文の違いに注意しましょう。
まとめ
この記事のポイント
- LIMITは取得する行数を制限する構文で、必ずORDER BYとセットで使う
- OFFSETは取得結果の先頭から何件分を読み飛ばすかを指定する構文
- LIMIT・OFFSETを組み合わせることで、ページネーションを実装できる
- OFFSETの値が大きくなると処理が遅くなるため、大量データではカーソルベースの手法も検討する
次に読むべき記事
- ORDER BYで並び替える
- DISTINCTで重複を除去する
タグ: SQL, 初心者向け, 基本文法