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 / TiDB は LIMIT 10 OFFSET 20 形式と LIMIT 20, 10 形式の両方を受け付けます。標準 SQL は前者なので、移植性を考えると LIMIT 10 OFFSET 20 で揃えるのが無難です。
処理の流れ
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 は TOP か OFFSET / 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 つができることを確認しましょう。
- LIMIT OFFSET の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (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');期待される出力
| id | title | views |
|---|---|---|
| 7 | クエリチューニング | 6100 |
| 6 | ウィンドウ関数入門 | 5200 |
| 5 | 正規化と非正規化 | 4500 |