【初心者向け】SQLのLIMIT句とは?使い方・注意点・ORDER BYとの併用まで完全ガイド

データベース・SQL

「テーブルにデータが多すぎて全部は見きれない」
「最新の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を使わない
  • 必要な列だけ取得して処理を軽くする
  • 大量データでは効率的なページネーション手法を使う
  • インデックスを活用して高速化する

よく使う場面

  • 一覧画面のページ分割
  • 最新データの表示
  • ランキング表示
  • データの確認・テスト

コメント

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