SQL ORDER BYとLIMIT — ソートとページネーション
ORDER BYでクエリ結果をソートし、LIMIT/OFFSETでページネーションする方法。複数カラムソート、ダイアレクトの違い、ページネーションパターンを解説します。
Clauses & Filters
詳細な説明
結果のソートとページネーション
ORDER BYは返される行の順序を制御します。LIMIT(またはFETCH FIRST)は返される行数を制限します。組み合わせるとページネーションが実現できます。
基本的なソート
SELECT name, salary
FROM employees
ORDER BY salary DESC; -- 最高額から
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC; -- 古い順(ASCがデフォルト)
複数カラムソート
SELECT name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
LIMITとOFFSET
-- 最初の10行
SELECT * FROM employees ORDER BY id LIMIT 10;
-- 3ページ目、1ページ10行(20行スキップ、10行返却)
SELECT * FROM employees ORDER BY id LIMIT 10 OFFSET 20;
ダイアレクトの違い
| データベース | 構文 |
|---|---|
| PostgreSQL | LIMIT n OFFSET mまたはFETCH FIRST n ROWS ONLY |
| MySQL | LIMIT [offset,] countまたはLIMIT count OFFSET offset |
| SQLite | LIMIT n OFFSET m |
| SQL Server | OFFSET m ROWS FETCH NEXT n ROWS ONLY |
ページネーションのベストプラクティス
オフセットページネーション(LIMIT/OFFSET)はシンプルですが、データベースがスキップされた行をスキャン・破棄する必要があるため、深いページでは遅くなります。
キーセットページネーション(seekメソッド)は大規模データセットでより高速です:
-- OFFSETの代わりに、前のページの最後の値でWHEREを使用
SELECT * FROM employees
WHERE id > 1000 -- 前のページの最後のid
ORDER BY id
LIMIT 10;
NULLの順序
-- PostgreSQL: NULLの表示位置を制御
SELECT * FROM employees
ORDER BY manager_id NULLS LAST;
-- MySQL: NULLは最小値として扱われる
SELECT * FROM employees
ORDER BY manager_id ASC; -- NULLが最初
ユースケース
ページネーション付きのAPIエンドポイントを実装したり、ソート機能付きのUIテーブルを構築している場合(例えば、売上トップ10の商品をリストしたり、検索結果をページングする場合)。