LIMITで件数制限

LIMITで件数制限 とは

SQLのLIMIT句を使って、取得するデータ件数を制限する方法を学びます。本レッスンでは、LIMITで件数制限 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

スマートフォンでテーブル全件を一画面に並べたら、メモリと通信量が一気に膨らみます。データベースが返す行数を制限する LIMIT 句は、ページング、無限スクロール、ランキング表示、トップ N の抽出、すべての基盤になります。LIMIT を使わずに SELECT * FROM users を本番で実行すると、データ量によってはサーバを停止させる威力があります。だからこそ「読むときも書くときも LIMIT を意識する」のがプロの作法です。

また、OFFSET と組み合わせることで「2 ページ目から 20 件」のようなページング処理が可能になります。本レッスンでは LIMIT 単体の使い方から、OFFSET との組み合わせ、そしてキー追跡型ページングの考え方まで触れます。

構文の全体像

SQL クエリ

SELECT <列リスト> FROM <テーブル> ORDER BY <> LIMIT <件数> OFFSET <スキップ件数>;

MySQL / TiDBLIMIT 10 OFFSET 20 形式と LIMIT 20, 10 形式の両方を受け付けます。標準 SQL は前者なので、移植性を考えると LIMIT 10 OFFSET 20 で揃えるのが無難です。

処理の流れ

diagram (will load when visible)

ORDER BY と組み合わせないと、LIMIT で返ってくる行は不定です。「とりあえず先頭 10 件」と書くと、毎回違うレコードが返ることがあります。必ず ORDER BY を付ける癖を付けましょう。

代表例

例 1 は、ランキング上位 5 件を取り出すケースです。

SQL クエリ

SELECT id, name, score FROM rankings ORDER BY score DESC LIMIT 5;

ORDER BY で score の降順に並べ、その先頭 5 件だけを取り出します。「ランキング TOP 5」のような UI に直結する書き方です。

例 2 は、ページングを実装するケースです。

SQL クエリ

SELECT id, name FROM users ORDER BY id LIMIT 20 OFFSET 40;

1 ページ 20 件、3 ページ目を表示する場合の SQL です。OFFSET は (ページ番号 - 1) × 件数で計算します。アプリ側で (page - 1) * pageSize を渡せばそのまま動きます。

例 3 は、件数 + 並び順を組み合わせて「最新 3 件」を取るケースです。

SQL クエリ

SELECT id, title, created_at FROM articles ORDER BY created_at DESC LIMIT 3;

新着記事のサイドバーや、ダッシュボードのフィード表示でよく使うパターンです。

OFFSET の限界とキー追跡型ページング

OFFSET は便利ですが、ページ番号が大きくなるほど低速になります。OFFSET 100000 は「先頭から 10 万行スキャンしてから 10 行返す」処理になり、テーブルが大きくなると致命的に遅くなります。SNS や検索結果のような大量データのページングでは、WHERE id < ? ORDER BY id DESC LIMIT 20 のようにキーの大小で進めるキー追跡型 (cursor based) ページングを使うのが定番です。

SQL クエリ

-- 直前のページの最後の id を使って次の 20 件を取る SELECT id, title FROM articles WHERE id < 12345 ORDER BY id DESC LIMIT 20;

この形なら、ページが何ページ目でも一定の速度で動きます。

ORDER BY なしの危険性

LIMIT 10 だけで ORDER BY を書かないと、行の順番はデータベースエンジン任せになります。リロードしたら違う 10 件が返る、本番リリース直後だけ違う挙動になる、というバグの典型例です。LIMIT を使うときは必ず ORDER BY とセットにします。

DBMS 別の方言

SQL クエリ

-- MySQL / TiDB / SQLite / Postgres SELECT * FROM t ORDER BY id LIMIT 10 OFFSET 20; -- MySQL 独自記法 (互換のため残っている) SELECT * FROM t ORDER BY id LIMIT 20, 10; -- SQL Server SELECT TOP 10 * FROM t ORDER BY id; -- もしくは OFFSET FETCH SELECT * FROM t ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

MySQL / TiDB / SQLite / Postgres は LIMIT n OFFSET m で揃っており、もっとも汎用性が高い書き方です。SQL Server は TOPOFFSET / FETCH NEXT を使います。Oracle 12c 以降も OFFSET / FETCH NEXT をサポートしています。複数 DB を相手にするときは、SQL の方言差を覚えておくと移行が楽になります。

まとめ

  • LIMIT は結果セットの件数を制限する句。OFFSET でスキップ件数を指定
  • ページング、ランキング、最新 N 件の表示などに必須
  • ORDER BY と必ずセットにする。並びがないと不定の結果になる
  • 大量データでは OFFSET が遅い。キー追跡型ページングを検討する
  • 本番運用では「LIMIT が付いているか」をクエリレビューの定番チェック項目にする
  • DBMS 別の方言差を意識する。Postgres / MySQL は LIMIT n OFFSET m で揃っている

次のレッスン

次は 日付関数の活用 です。SQLで日付関数を活用する方法を学びます。日付データの操作をマスターしましょう。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. LIMIT OFFSET の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. LIMIT OFFSET とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE articles ( id INT PRIMARY KEY, title VARCHAR(100) NOT NULL, views INT NOT NULL, published_at DATE NOT NULL ); INSERT INTO articles (id, title, views, published_at) VALUES (1, 'SQL 入門', 1500, '2026-01-10'), (2, 'JOIN の使い方', 3200, '2026-02-05'), (3, 'インデックス設計', 2800, '2026-02-12'), (4, 'トランザクション基礎', 1800, '2026-03-01'), (5, '正規化と非正規化', 4500, '2026-03-15'), (6, 'ウィンドウ関数入門', 5200, '2026-04-02'), (7, 'クエリチューニング', 6100, '2026-04-20'), (8, 'NoSQL との比較', 2200, '2026-05-01'), (9, 'CTE と再帰クエリ', 3800, '2026-05-10'), (10, 'パーティショニング', 1900, '2026-05-15');

期待される出力

idtitleviews
7クエリチューニング6100
6ウィンドウ関数入門5200
5正規化と非正規化4500

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...