結果を並び替える - ORDER BY
結果を並び替える句。ASC/DESC、NULLS FIRST/LAST、複数キー、式による並び替えを整理
概念図
構文
sql
SELECT ... FROM テーブル ORDER BY 列1 [ASC|DESC] [, 列2 ...]サンプル
優先度が高い順 → 作成日が古い順に並べる複数キーソート
sql
SELECT id, name, priority, created_at
FROM tasks
ORDER BY priority DESC, created_at ASC;ORDER BY の基本
ORDER BY は結果を指定した順に並び替えます。指定しなければ順序は保証されません。たとえ主キー順に見えても RDBMS・プランが変われば変わります。
並び順は ASC(昇順・既定)か DESC(降順)を列ごとに指定します。
複数キーと式による並び替え
カンマ区切りで複数キーを並べると、左から優先してタイブレークします。列名だけでなく 式、エイリアス、列番号 でも指定できます(列番号は可読性が落ちるので非推奨)。
sql
SELECT id, price * quantity AS subtotal
FROM order_items
ORDER BY subtotal DESC, id ASC;NULL の位置: NULLS FIRST / LAST
NULL の並び順は RDBMS で異なります。
- PostgreSQL / Oracle: 既定で
ASC時は NULL が最後(NULLS LAST)、DESC時は先頭(NULLS FIRST)。NULLS FIRST/NULLS LASTを明示できる - MySQL / SQLite: NULL は常に最小として扱われる(
NULLS FIRST相当)。構文NULLS FIRST/LASTは未対応で、ORDER BY col IS NULL, colのような回避が必要 - SQL Server: NULL は最小扱い。制御したい場合は
CASE式を併用
sql
-- PostgreSQL / Oracle
SELECT * FROM tasks ORDER BY due_date ASC NULLS LAST;
-- MySQL 回避策
SELECT * FROM tasks ORDER BY due_date IS NULL, due_date ASC;パフォーマンスの注意
- 巨大テーブルの
ORDER BYはメモリ or 一時ファイルで並び替えるためコストが高い。インデックスの並び順と一致すれば追加ソート不要になる LIMITと組み合わせるなら Top-N クエリ最適化が適用され、全件ソートせず上位 N 件だけ取り出せるORDER BY RAND()は全行ソートになるため大きなテーブルで使わない
