SQLのORDER BYとは?昇順・降順と複数列を結果表で解説
ORDER BYは、検索結果の行を指定した順に並べる構文です。社員IDの小さい順や月給の高い順など、見たい順番を決められます。同じ5人の表で、並び方だけがどう変わるかを見てみましょう。
例で使う表
employeesの1行が社員1人分です。営業が2人、開発が2人、サポートが1人います。salaryは月給(円)で、恵比寿さんのNULLは月給が未入力であることを表し、0円とは区別します。すべての例でこの5人を使います。
| id(社員ID) | name(名前) | department(部署) | salary(月給) |
|---|---|---|---|
| 1 | 青木 | 営業 | 300000 |
| 2 | 北野 | 開発 | 400000 |
| 3 | 中央 | 営業 | 350000 |
| 4 | 大和 | 開発 | 400000 |
| 5 | 恵比寿 | サポート | NULL |
ORDER BYの基本構文
SELECT id, name, salary
FROM employees
ORDER BY id ASC;ASCで社員IDの小さい順に並べる
SELECTとFROMの後ろにORDER BY id ASCと書くと、社員IDが1、2、3、4、5の順に並びます。ASCは小さい値から大きい値への昇順です。並べ替えても社員の人数や月給は変わりません。
SELECT id, name, salary
FROM employees
ORDER BY id ASC;| id | name | salary |
|---|---|---|
| 1 | 青木 | 300000 |
| 2 | 北野 | 400000 |
| 3 | 中央 | 350000 |
| 4 | 大和 | 400000 |
| 5 | 恵比寿 | NULL |
DESCで社員IDの大きい順に並べる
ASCをDESCに変えると、社員IDが5、4、3、2、1の順になります。DESCは大きい値から小さい値への降順です。最初の結果と、先頭・末尾の社員を見比べてください。
SELECT id, name, salary
FROM employees
ORDER BY id DESC;| id | name | salary |
|---|---|---|
| 5 | 恵比寿 | NULL |
| 4 | 大和 | 400000 |
| 3 | 中央 | 350000 |
| 2 | 北野 | 400000 |
| 1 | 青木 | 300000 |
複数列で同じ月給の人の順番を決める
月給の低い順にし、同額なら社員IDの小さい順にします。先にsalaryを比べ、月給400000円の北野さんと大和さんだけはidで順番を決めます。PostgreSQLでは昇順のNULLは既定で末尾なので、未入力の恵比寿さんが最後です。
SELECT id, name, salary
FROM employees
ORDER BY salary ASC, id ASC;| id | name | salary |
|---|---|---|
| 1 | 青木 | 300000 |
| 3 | 中央 | 350000 |
| 2 | 北野 | 400000 |
| 4 | 大和 | 400000 |
| 5 | 恵比寿 | NULL |
NULLS LASTで未入力を末尾に置く
月給の高い順でも未入力の人を最後にしたい場合は、salary DESC NULLS LASTと書きます。PostgreSQLではDESCだけだとNULLが先頭になるため、この指定が必要です。ここでも同額ならidの小さい順にしています。
SELECT id, name, salary
FROM employees
ORDER BY salary DESC NULLS LAST, id ASC;| id | name | salary |
|---|---|---|
| 2 | 北野 | 400000 |
| 4 | 大和 | 400000 |
| 3 | 中央 | 350000 |
| 1 | 青木 | 300000 |
| 5 | 恵比寿 | NULL |
LIMITで月給の上位2人を取り出す
前のSQLの末尾にLIMIT 2を足すと、並べた結果の先頭2行だけを取り出せます。この表では北野さんと大和さんです。同額でもidで順番を決めてあるので、上位の行を選ぶ基準が明確です。
SELECT id, name, salary
FROM employees
ORDER BY salary DESC NULLS LAST, id ASC
LIMIT 2;| id | name | salary |
|---|---|---|
| 2 | 北野 | 400000 |
| 4 | 大和 | 400000 |
実際に1問解いてみる
ASC
staff_directoryを、氏名の昇順で取得してください。
テーブル
読み込み中…
実行結果
関連構文
ORDER BYについてよくある質問
- ORDER BYを書かなくても社員ID順になりますか?
- 保証されません。今回の元の表がID順に見えていても、検索結果をその順にしたいときはORDER BY idを指定します。
- NULLを先頭に置きたい場合は?
- NULLS FIRSTを指定します。NULLS FIRSTとNULLS LASTは、ASC・DESCのどちらとでも組み合わせられます。
参考文献
内容はPostgreSQL公式ドキュメントを参照し、初めて学ぶ人向けに日本語で整理しています。
- PostgreSQL公式:行の並べ替え — 行の並べ替えの仕様と使用例
- PostgreSQL公式:LIMITとOFFSET — LIMITとOFFSETの仕様と使用例