【SQL】LIMIT・OFFSETで件数を制限する

SQL

こんにちは、かつコーチです。

「新着記事を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, 初心者向け, 基本文法

タイトルとURLをコピーしました