SQL練習室
← SQLガイド

SQLのORDER BYとは?昇順・降順と並べ替えを解説

SQLのORDER BY句は、SELECT文の検索結果を指定した順序に並べ替えるために使います。昇順・降順、同じ値があるときの優先順位、NULLの位置まで指定できます。ORDER BYがない検索結果の行順は保証されないため、表示順が必要なら明示しましょう。

ORDER BYの基本構文

sql
SELECT columns
FROM table_name
ORDER BY sort_column [ASC | DESC];

ASCとDESCで昇順・降順を指定する

ORDER BY column ASCは小さい値から大きい値への昇順、DESCは大きい値から小さい値への降順です。ASCは既定値なので省略できますが、読み手へ意図を伝えたい場合は明記してもかまいません。文字列や日付もデータ型に応じた順序で並びます。

sql
SELECT name, hired_at
FROM employees
ORDER BY hired_at DESC;

ORDER BYで複数列を並べ替える

並べ替える列はカンマ区切りで複数指定できます。先頭の列が同じ行だけを次の列で比較します。結果を毎回同じ順序にしたい場合は、最後に主キーなど一意な列を追加すると安定します。

sql
SELECT id, department, salary, name
FROM employees
ORDER BY
  department ASC,
  salary DESC,
  id ASC;

NULLS FIRST・NULLS LASTでNULLの位置を決める

PostgreSQLではNULLS FIRSTまたはNULLS LASTを使い、NULLを先頭と末尾のどちらへ置くか指定できます。既定ではNULLは非NULL値より大きいものとして扱われ、ASCでは末尾、DESCでは先頭に置かれます。表示要件がある場合は明示すると安全です。

sql
SELECT name, manager_id
FROM employees
ORDER BY manager_id ASC NULLS LAST;

ORDER BYとLIMITを組み合わせる

ORDER BYで並べた後にLIMITで件数を絞ると、上位N件や最新N件を取得できます。LIMITだけではどの行が選ばれるか安定しないため、意味のある結果を得るにはORDER BYと組み合わせます。同順位でも結果を固定したい場合は一意な列まで指定します。

sql
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;

実際に1問解いてみる

ASC

staff_directoryを、氏名の昇順で取得してください。

テーブル

読み込み中…

実行結果

関連構文

ORDER BYについてよくある質問

ORDER BYの既定は昇順ですか?
はい。ASCもDESCも省略した場合、PostgreSQLではASCとして扱われます。明示的に降順へ並べる場合はDESCを指定します。
SELECTにない列でもORDER BYに指定できますか?
通常のSELECTでは指定できます。ただしSELECT DISTINCTを使う場合など、ORDER BYの式がSELECTリストに必要になる制約があります。

参考文献

内容はPostgreSQL公式ドキュメントを参照し、初めて学ぶ人向けに日本語で整理しています。