Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

LIMIT / OFFSET

取得する行数と開始位置を指定する句です。ページネーション(ページ送り)の実装などに使用します。

構文
-- 取得件数を制限します(MySQLなど)。
SELECT 列名 FROM テーブル名 LIMIT 件数;

-- 開始位置と件数を指定します(OFFSET は 0 始まり)。
SELECT 列名 FROM テーブル名 LIMIT 件数 OFFSET 開始位置;

-- MySQL独自の短縮構文です(LIMIT 開始位置, 件数)。
SELECT 列名 FROM テーブル名 LIMIT 開始位置, 件数;

-- SQL Server では TOP を使用します。
SELECT TOP 件数 列名 FROM テーブル名;
構文一覧
構文概要
LIMIT 件数取得する最大行数を指定します。MySQL・PostgreSQL・SQLiteで使用できます。
OFFSET 開始位置取得を開始する行の位置を指定します。0が先頭です。LIMIT と組み合わせて使用します。
LIMIT 開始位置, 件数MySQLの短縮構文です。LIMIT 0, 10 は先頭から10件を意味します。
FETCH FIRST 件数 ROWS ONLY標準SQL(SQL:2008以降)の構文です。Oracle・DB2・PostgreSQLなどで使用できます。
サンプルコード
-- 給与が高い順に上位3件の社員を取得します。
SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 3;

-- ページネーションの例(1ページ10件、2ページ目を取得します)。
SELECT name, hire_date FROM employees ORDER BY hire_date DESC LIMIT 10 OFFSET 10;

-- MySQL短縮構文での同じ処理です。
SELECT name, hire_date FROM employees ORDER BY hire_date DESC LIMIT 10, 10;

-- 3ページ目(21件目〜30件目)を取得します。
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 20;
実行結果
-- SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 3; の結果例
-- +----------+--------+
-- | name     | salary |
-- +----------+--------+
-- | 鈴木花子 | 380000 |
-- | 佐藤一郎 | 350000 |
-- | 山田次郎 | 320000 |
-- +----------+--------+
データベース別の書き方

PostgreSQL・SQLite は MySQL と同じ『LIMIT / OFFSET』が使用できます。

SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10 OFFSET 20;

Oracle は『FETCH FIRST』を使用します(12c以降)。

SELECT name, salary FROM employees ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

SQL Server は『OFFSET / FETCH』を使用します(2012以降)。『ORDER BY』が必須です。

SELECT name, salary FROM employees ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
概要

『LIMIT』と『OFFSET』はページネーション実装に欠かせない機能です。ページ番号($page)と1ページあたりの件数($per_page)から、OFFSETは『($page - 1) * $per_page』で計算できます。

『ORDER BY』なしで『LIMIT / OFFSET』を使用すると、取得順序が保証されません。ページネーションでは必ず『ORDER BY』で並び順を固定してから使用してください。

データが大量にある場合、OFFSETの値が大きくなるほどパフォーマンスが低下します。大規模データではカーソルベースのページネーション(直前のIDを条件にする方法)の採用を検討してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。