Query Go
結果を並び替える - ORDER BY の使い方・オプション・サンプル

結果を並び替える - ORDER BY

結果を並び替える句。ASC/DESC、NULLS FIRST/LAST、複数キー、式による並び替えを整理

概念図

ORDER BY diagram

構文

sql
SELECT ... FROM テーブル ORDER BY1 [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() は全行ソートになるため大きなテーブルで使わない

関連トピック