「テーブルにデータが多すぎて全部は見きれない」
「最新の5件だけ表示したい」
といった場面、ありませんか?
そんなときに便利なのがSQLのLIMIT句です。
LIMIT句を使えば、取得するデータの件数を制限できるので、処理が早くなり、確認作業もスムーズになります。
この記事では、LIMITの基本的な使い方から、ORDER BYとの組み合わせ、OFFSETの使い方まで、実例付きでわかりやすく解説します。
LIMIT句って何?基本を理解しよう

LIMIT句の役割
LIMIT句は、SELECT文で取得する行数を制限する機能です。
大量のデータから「一部だけ」表示したいときに使用します。
基本的な書き方
SELECT * FROM テーブル名 LIMIT 数値;
実際の使用例
最初の10件だけ取得
SELECT * FROM users LIMIT 10;
最初の3件だけ取得
SELECT * FROM products LIMIT 3;
LIMITを使わない場合との違い
LIMITなし(全件取得)
SELECT * FROM users;
→ 10万件のデータがあれば、10万件全て取得(時間がかかる)
LIMITあり(制限あり)
SELECT * FROM users LIMIT 10;
→ 10万件のデータがあっても、最初の10件だけ取得(早い)
どんなときに使うの?
データの確認
- テーブルの構造を確認したいとき
- サンプルデータを見たいとき
表示件数の制限
- 一覧画面で20件ずつ表示したいとき
- トップページで最新記事を5件表示したいとき
パフォーマンス向上
- 大量データの処理を軽くしたいとき
- テスト時に少量データで確認したいとき
ORDER BYと組み合わせて順番を整えよう
なぜORDER BYが必要?
LIMITだけでは、データベースは適当な順番でデータを返します。毎回実行するたびに、違う結果が返ってくる可能性があります。
問題のある例
-- これだと、毎回違う5件が返ってくる可能性がある
SELECT * FROM users LIMIT 5;
正しい例
-- IDの順番で、最初の5件を確実に取得
SELECT * FROM users ORDER BY id LIMIT 5;
最新データを取得する
最新の投稿を5件取得
SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 5;
ORDER BY created_at DESC
:作成日時の新しい順に並べるLIMIT 5
:上位5件だけ取得
最新の注文を10件取得
SELECT order_id, customer_name, order_date, total_amount
FROM orders
ORDER BY order_date DESC
LIMIT 10;
価格順で商品を取得する
最も安い商品を3件取得
SELECT product_name, price
FROM products
ORDER BY price ASC
LIMIT 3;
最も高い商品を5件取得
SELECT product_name, price
FROM products
ORDER BY price DESC
LIMIT 5;
実際の業務での使用例
人気商品トップ10
SELECT product_name, sales_count
FROM products
ORDER BY sales_count DESC
LIMIT 10;
最新のお客様レビュー
SELECT customer_name, review_text, rating, review_date
FROM reviews
ORDER BY review_date DESC
LIMIT 20;
売上トップの営業員
SELECT employee_name, sales_amount
FROM employees
ORDER BY sales_amount DESC
LIMIT 5;
OFFSETを使ってページ分割しよう

OFFSETとは?
OFFSETは、どこからデータを取得するかを指定する機能です。ページ分割(ページネーション)を実現するときに使います。
基本的な書き方
SELECT * FROM テーブル名
ORDER BY 列名
LIMIT 取得件数 OFFSET スキップ件数;
具体例で理解しよう
1ページ目(1〜10件)
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 0;
- 0件スキップして、10件取得
- つまり1〜10件目
2ページ目(11〜20件)
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 10;
- 10件スキップして、10件取得
- つまり11〜20件目
3ページ目(21〜30件)
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 20;
- 20件スキップして、10件取得
- つまり21〜30件目
ページ番号から計算する方法
ページネーションでは、通常次のような計算を行います:
OFFSET = (ページ番号 - 1) × 1ページあたりの件数
例:1ページ20件の場合
- 1ページ目:
OFFSET = (1-1) × 20 = 0
- 2ページ目:
OFFSET = (2-1) × 20 = 20
- 3ページ目:
OFFSET = (3-1) × 20 = 40
-- 1ページ目
SELECT * FROM products ORDER BY product_id LIMIT 20 OFFSET 0;
-- 2ページ目
SELECT * FROM products ORDER BY product_id LIMIT 20 OFFSET 20;
-- 3ページ目
SELECT * FROM products ORDER BY product_id LIMIT 20 OFFSET 40;
MySQLの省略記法
MySQLでは、LIMITに2つの数値を書くことで、OFFSETを省略できます。
通常の書き方
SELECT * FROM users LIMIT 10 OFFSET 20;
MySQL省略記法
SELECT * FROM users LIMIT 20, 10;
どちらも「20件スキップして、10件取得」という意味です。
実際のWebアプリケーションでの使用例
商品一覧ページ
-- 1ページ目(1〜12件)
SELECT product_id, product_name, price, image_url
FROM products
WHERE category = '家電'
ORDER BY created_at DESC
LIMIT 12 OFFSET 0;
-- 2ページ目(13〜24件)
SELECT product_id, product_name, price, image_url
FROM products
WHERE category = '家電'
ORDER BY created_at DESC
LIMIT 12 OFFSET 12;
ブログ記事一覧
-- 記事一覧の3ページ目(21〜30件)
SELECT title, summary, author, publish_date
FROM articles
WHERE status = '公開'
ORDER BY publish_date DESC
LIMIT 10 OFFSET 20;
データベース別の違い

MySQL
-- 標準的な書き方
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 5;
-- MySQL独自の省略記法
SELECT * FROM users ORDER BY id LIMIT 5, 10;
PostgreSQL
-- 標準的な書き方のみ対応
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 5;
SQL Server
-- OFFSET-FETCH句を使用(SQL Server 2012以降)
SELECT * FROM users
ORDER BY id
OFFSET 5 ROWS
FETCH NEXT 10 ROWS ONLY;
SQLite
-- 標準的な書き方
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 5;
実践的な使用例

ランキング表示
売上ランキング上位10位
SELECT
ROW_NUMBER() OVER (ORDER BY sales_amount DESC) as rank_num,
employee_name,
sales_amount
FROM employees
ORDER BY sales_amount DESC
LIMIT 10;
人気記事トップ5
SELECT title, view_count, author
FROM articles
WHERE publish_date >= '2025-01-01'
ORDER BY view_count DESC
LIMIT 5;
サンプリング
データの確認用サンプル
-- 大きなテーブルから少しだけデータを確認
SELECT * FROM large_table
ORDER BY RANDOM() -- PostgreSQL
LIMIT 100;
-- MySQL の場合
SELECT * FROM large_table
ORDER BY RAND()
LIMIT 100;
最新データのモニタリング
最新のエラーログ
SELECT log_time, error_level, error_message
FROM error_logs
ORDER BY log_time DESC
LIMIT 50;
最新の注文
SELECT order_id, customer_name, total_amount, order_time
FROM orders
ORDER BY order_time DESC
LIMIT 20;
よくある間違いと注意点
ORDER BYなしのLIMITは危険
問題のある例
-- 毎回違う結果が返ってくる可能性がある
SELECT * FROM products LIMIT 10;
解決方法
-- 必ず順序を指定する
SELECT * FROM products ORDER BY product_id LIMIT 10;
大きなOFFSETは遅い
問題のある例
-- 100万件目から10件取得(とても遅い)
SELECT * FROM large_table
ORDER BY id
LIMIT 10 OFFSET 1000000;
解決方法:カーソルベースページネーション
-- 前回の最後のIDを覚えておいて、そこから取得
SELECT * FROM large_table
WHERE id > 1000000 -- 前回の最後のID
ORDER BY id
LIMIT 10;
GROUP BYとの組み合わせ
注意が必要な例
-- LIMITがGROUP BYの後に適用される
SELECT category, COUNT(*)
FROM products
GROUP BY category
ORDER BY COUNT(*) DESC
LIMIT 5; -- カテゴリの集計結果上位5件
JOINとの組み合わせ
期待と異なる結果になる例
-- 重複する行も含めて10件になる
SELECT u.name, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id
ORDER BY o.order_date DESC
LIMIT 10; -- ユーザーが重複する可能性がある
解決方法
-- 個別のユーザーの最新注文を10人分
SELECT DISTINCT u.name,
(SELECT o.order_date
FROM orders o
WHERE o.user_id = u.id
ORDER BY o.order_date DESC
LIMIT 1) as latest_order
FROM users u
WHERE EXISTS (SELECT 1 FROM orders WHERE user_id = u.id)
ORDER BY u.id
LIMIT 10;
パフォーマンスの最適化

インデックスの活用
効率的な例
-- ORDER BYで使う列にインデックスがある場合
CREATE INDEX idx_created_at ON posts(created_at);
SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10; -- 高速
不要な列は取得しない
悪い例
-- 全ての列を取得(重い)
SELECT * FROM large_table
ORDER BY id
LIMIT 10;
良い例
-- 必要な列だけ取得(軽い)
SELECT id, name, created_at
FROM large_table
ORDER BY id
LIMIT 10;
COUNT(*)との併用
ページネーションでは、通常「全体件数」も必要です。
-- 全体件数を取得
SELECT COUNT(*) as total_count
FROM products
WHERE category = '家電';
-- ページ分割されたデータを取得
SELECT product_name, price
FROM products
WHERE category = '家電'
ORDER BY created_at DESC
LIMIT 20 OFFSET 40;
より効率的なページネーション
従来の方法(遅い)
SELECT * FROM posts
ORDER BY id
LIMIT 20 OFFSET 10000; -- 遅い
改善された方法(早い)
-- 前回の最後のIDを使用
SELECT * FROM posts
WHERE id > 10020 -- 前回の最後のID
ORDER BY id
LIMIT 20;
よく使うパターン集
トップN取得
-- 売上トップ10の商品
SELECT product_name, sales_amount
FROM products
ORDER BY sales_amount DESC
LIMIT 10;
-- 最近登録された5人のユーザー
SELECT username, registration_date
FROM users
ORDER BY registration_date DESC
LIMIT 5;
サンプリング
-- ランダムに100件抽出(PostgreSQL)
SELECT * FROM survey_responses
ORDER BY RANDOM()
LIMIT 100;
-- ランダムに100件抽出(MySQL)
SELECT * FROM survey_responses
ORDER BY RAND()
LIMIT 100;
テストデータ作成
-- 開発用に少量データを取得
SELECT * FROM production_table
ORDER BY id
LIMIT 1000;
監視・モニタリング
-- 最新のエラーログ確認
SELECT * FROM error_logs
ORDER BY timestamp DESC
LIMIT 20;
-- 最新のアクセスログ確認
SELECT ip_address, request_url, response_time
FROM access_logs
ORDER BY timestamp DESC
LIMIT 50;
まとめ
LIMIT句は、SQLでデータを効率的に扱うための重要で実践的な機能です。
表示件数の制限、最新データの取得、ページ分割など、多くの場面で役立ちます。
重要なポイント
- LIMIT:取得件数を制限する
- ORDER BY:必ず一緒に使って順序を指定する
- OFFSET:ページ分割で開始位置を指定する
- パフォーマンス:大きなOFFSETは避ける
使い方のコツ
- ORDER BYなしでLIMITを使わない
- 必要な列だけ取得して処理を軽くする
- 大量データでは効率的なページネーション手法を使う
- インデックスを活用して高速化する
よく使う場面
- 一覧画面のページ分割
- 最新データの表示
- ランキング表示
- データの確認・テスト
コメント