LIMITとOFFSET
最初のN行を取得し、ページネーションします。
「LIMITとOFFSET」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
少数の行だけを取得する
一致する行をすべてではなく、最初の数行だけ取得したい場合があります。LIMITはクエリが返す行数の上限を設定します。
これは最大5件の商品を返します。
SELECT name, price
FROM products
LIMIT 5;ORDER BYなしのLIMITはランダムになる
LIMITだけを指定すると、一部の行は返されますが、どの行になるかは定義されません。意味のある再現可能な結果にするため、必ずORDER BYと組み合わせてください。
-- The 5 newest orders, deterministically
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 5;OFFSETで行をスキップする
OFFSETは、返す前に何行スキップするかをデータベースに伝えます。LIMITと組み合わせることで、ページネーションの基礎になります。
これは最初の10行をスキップし、次の5行を返します。
SELECT name, price
FROM products
ORDER BY name
LIMIT 5 OFFSET 10;ページを構築する
ページサイズを10とした場合、ページ番号とオフセットの対応は次のようになります。
- 1ページ目:
OFFSET 0 - 2ページ目:
OFFSET 10 - 3ページ目:
OFFSET 20
計算式はOFFSET = (page - 1) * page_sizeです。
-- Page 3 with 10 rows per page
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;処理の順序
データベースは次の順序で句を適用します。WHEREで絞り込み、ORDER BYで並べ替え、その後OFFSETとLIMITで結果を切り詰めます。
そのため、常に並べ替えと絞り込みが済んだ結果をページ単位で取得します。
SELECT name, price
FROM products
WHERE price > 0
ORDER BY price DESC
LIMIT 10 OFFSET 0;LIMIT ALLとOFFSET 0
LIMIT ALLは「制限なし」を意味し、LIMITを省略した場合と同じです。また、OFFSET 0は何もスキップしません。値を動的に組み立てる場合などに、これらが役立つことがあります。
SELECT name
FROM products
ORDER BY name
LIMIT ALL OFFSET 0;標準FETCH構文
PostgreSQLは、SQL標準形式のOFFSET n ROWS FETCH NEXT m ROWS ONLYもサポートしています。LIMIT/OFFSETとまったく同じ動作をしますが、より冗長です。
SELECT name, price
FROM products
ORDER BY name
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;大きなOFFSETが遅い理由
大きなOFFSETを指定しても、データベースはスキップするすべての行をスキャンして破棄する必要があります。OFFSET 100000では、破棄するだけのために100,000行を読み取るため、深いページでは遅くなります。
-- Reads 100000 rows then discards them
SELECT id, name
FROM products
ORDER BY id
LIMIT 10 OFFSET 100000;キーセットページネーション
より高速な方法として、キーセット(シーク)ページネーションがあります。オフセットの代わりに最後に取得した行を記録し、その行より後にある行を取得します。
インデックスを使って次のページへ直接移動できるため、行をスキップする必要がありません。
-- Next page after the last seen id (e.g. 5000)
SELECT id, name
FROM products
WHERE id > 5000
ORDER BY id
LIMIT 10;安定したページには安定した並び順が必要
ORDER BYの並び順に同順位の行があると、ページを読み込むたびに行の順番が入れ替わり、重複や抜けが発生することがあります。主キーのような一意キーで並び順を最後まで指定し、ページの内容を一貫させてください。
SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 10 OFFSET 20;最上位の1行
LIMIT 1は、最も高価な商品や最新の注文など、1行だけをすばやく取得する方法です。適切なORDER BYと組み合わせてください。
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 1;確認問題
1ページに10行表示します。3ページ目を返すのはどの句でしょうか。
まとめ
これで結果を切り分けられるようになりました。
LIMIT nは行数の上限を設定しますOFFSET mは行をスキップします。OFFSET = (page-1)*sizeです- 予測可能なページを得るには、常に
ORDER BYと組み合わせます - 大きなオフセットよりも、高速なキーセットページネーションを優先します
次は、これらの機能を使ってTop-Nレコードを見つけます。
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;よくある質問
「LIMITとOFFSET」レッスンは無料ですか?
はい。「LIMITとOFFSET」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「LIMITとOFFSET」で何を学びますか?
最初のN行を取得し、ページネーションします。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「LIMITとOFFSET」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ORDER BYで並べ替える
- 複数の列で並べ替える
- LIMITとOFFSET
- 上位・下位N件を取得する