LIMIT、OFFSET、FETCH FIRST
MySQL、Postgres、SQL Serverにおけるページネーション構文を学びます。
「LIMIT、OFFSET、FETCH FIRST」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
ページネーションはデータベース方言をまたぐ質問
「最初の10行をどのように取得しますか?」という質問は、面接官が「標準SQLで行うなら?」、または「ではSQL Serverでは?」と続けるまでは簡単に聞こえます。行数を制限する構文は、データベース間で最も違いが大きい機能の1つです。
このレッスンでは、主な3つの形式を整理します。LIMIT(MySQL/Postgres/SQLite)、OFFSET ... FETCH(ANSI標準、SQL Server)、そして旧式のTOP(SQL Server)です。
MySQLとPostgreSQLのLIMIT
最も一般的な形式はLIMIT nです。結果をn行に制限します。MySQL、PostgreSQL、SQLiteでサポートされています。
重要なのは、論理的な実行順序ではLIMITがORDER BYの後に適用されることです。そのため、ほとんどの場合は両方を組み合わせます。ソートせずに制限すると、任意の行の集合が返されます。
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10;行をスキップするOFFSET
ページネーションでは、前のページをスキップするためにオフセットが必要です。OFFSET mは、LIMITが適用される前に最初のm行をスキップします。
ページサイズが10の3ページ目を取得するには、20行をスキップして10行を取得します。一般的な式はOFFSET = (page - 1) * page_sizeです。
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10 OFFSET 20;MySQLのカンマ構文
MySQLでは、2つの引数をカンマで区切る形式LIMIT offset, countも使用できます。キーワード形式とは順序が逆なので、混乱しやすい点に注意してください。
LIMIT 20, 10は20行をスキップしてから10行取得するという意味で、LIMIT 10 OFFSET 20と同じです。面接では、わかりやすいキーワード形式を使用するのがよいでしょう。
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 20, 10;ANSI標準: FETCH FIRST
SQL標準では、OFFSET ... ROWS FETCH FIRST ... ROWS ONLYを使用します。PostgreSQL、Oracle 12c以降、DB2、SQL Server 2012以降がすべてサポートしています。
冗長な記述にはなりますが、移植性のある選択肢です。ROWとROWSは互換性があり、FIRSTとNEXTは同義語です。
SELECT name, salary
FROM employees
ORDER BY salary DESC
OFFSET 20 ROWS
FETCH FIRST 10 ROWS ONLY;SQL ServerのTOP
古いSQL Serverのコードでは、SELECTの直後にTOP nを置きます。組み込みのオフセット機能がないため、それだけでは最初のページより先にページネーションできません。
面接では、TOPを標準的な形式に書き換えるよう求められることがあります。ORDER BYを指定したSELECT TOP 10は、FETCH FIRST 10 ROWS ONLYと同等です。
SELECT TOP 10 name, salary
FROM employees
ORDER BY salary DESC;TOP WITH TIES
SQL Serverには便利な機能があります。TOP n WITH TIESを使うと、ORDER BYのキーで最後の行と同順位になった行が追加で返されます。
10番目に高い給与の人が3人いる場合、TOP 10 WITH TIESはその全員を返すため、返却行数が12行になることもあります。これは標準SQLのFETCH FIRST ... WITH TIESに相当します。
SELECT TOP 10 WITH TIES name, salary
FROM employees
ORDER BY salary DESC;決定的なページングにはORDER BYが必須
ここで面接で最も重要なポイントは、決定的なORDER BYなしのOFFSET/LIMITは安全ではないということです。元となる順序が未定義のため、エンジンは「2ページ目」に対して、「1ページ目」のときとは異なる行を選ぶ可能性があります。
必ず、一意、または実質的に一意となるキーの組み合わせで並べ替えてください。並べ替えに使う列に重複がある場合は、ページ間で行が重複したり抜け落ちたりしないよう、主キーを同順位時の判定に追加してください。
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 10 OFFSET 20;OFFSETページネーションのスケール性が低い理由
上級者向けの面接では、パフォーマンスについて詳しく問われます。大きなOFFSETを指定すると、データベースはスキップするすべての行を生成して破棄しなければなりません。OFFSET 100000 LIMIT 10では、10行を返すために100,010行を読み取ります。
ページ番号が大きくなるほどコストは線形に増加するため、大きなテーブルでは深いページの取得が遅くなります。
キーセット(シーク)ページネーション
スケーラブルな代替手段がキーセットページネーションです。件数でスキップするのではなく、直前に見た最後の値より後の行を絞り込みます。この方法ではインデックスの範囲スキャンが使われるため、どれだけ深いページでも高速なままです。
前のページの最後の行の並べ替えキーを記憶し、それより後の行を取得するよう指定します。キーセットページネーションに言及できると、上級者らしさを強く示せます。
SELECT id, name, created_at
FROM events
WHERE created_at < '2026-01-01 10:00:00'
ORDER BY created_at DESC
LIMIT 10;SQL方言別チートシート
面接ですぐに思い出せるよう、次の表を暗記しておきましょう。
- MySQL / Postgres / SQLite:
LIMIT n OFFSET m - 標準SQL / SQL Server 2012以降 / Oracle 12c以降:
OFFSET m ROWS FETCH FIRST n ROWS ONLY - 古いSQL Server:
SELECT TOP n(オフセットなし) - 古いOracle(12cより前): サブクエリで
ROWNUMを使って絞り込む
確認問題
ページサイズが10の場合に、3ページ目を取得する正しいクエリを選んでください。
まとめ
ページネーションの要点:
- MySQL、Postgres、SQLiteでは
LIMIT/OFFSET、標準SQLと最新のSQL ServerではOFFSET ... FETCH FIRST、レガシーなSQL ServerではTOPを使います。 OFFSET = (page - 1) * page_sizeです。- 必ず決定的な
ORDER BYと組み合わせ、同順位時の判定には一意なキーを追加してください。 - 大きなオフセットは遅いため、深いページの取得にはキーセットページネーションを優先してください。
よくある質問
「LIMIT、OFFSET、FETCH FIRST」レッスンは無料ですか?
はい。「LIMIT、OFFSET、FETCH FIRST」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「LIMIT、OFFSET、FETCH FIRST」で何を学びますか?
MySQL、Postgres、SQL Serverにおけるページネーション構文を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「LIMIT、OFFSET、FETCH FIRST」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 複数列の並べ替えとNULLの配置
- LIMIT、OFFSET、FETCH FIRST
- 上位N行を確実に返す
- 式とエイリアスで並べ替える