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の商品をリストしたり、検索結果をページングする場合)。

試してみる — SQL Cheat Sheet

フルツールを開く