ORDER BY句は「並び替え」だけの機能ではありません。
複数条件の指定、昇順・降順の組み合わせ、NULLの扱い、条件付き並び替え(CASE式)まで理解すると、集計結果や検索結果の品質が大きく向上します。
単純に「ORDER BY 列名」だけを書いている状態は、SQLの機能を十分に活かせていないと言えます。
ORDER BYの基本構文
|
1 2 3 |
SELECT 列名 FROM テーブル名 ORDER BY 列名 [ASC | DESC]; |
・ASC:昇順(省略時のデフォルト)
・DESC:降順
例:
|
1 2 3 |
SELECT * FROM employees ORDER BY salary DESC; |
給与の高い順に並びます。

複数列で並び替える
ORDER BYは複数列を指定できます。
|
1 |
ORDER BY 列1, 列2; |
例:
|
1 2 3 |
SELECT * FROM employees ORDER BY department_id, salary DESC; |
このSQLの意味は次の通りです。
| 優先順位 | 並び替え対象 | 並び順 |
|---|---|---|
| 1 | department_id | 昇順 |
| 2 | salary | 降順 |
「まず部署IDで並べ、同じ部署内では給与が高い順」に表示されます。
昇順と降順を混在させる
列ごとにASCとDESCを指定できます。
|
1 |
ORDER BY 列1 ASC, 列2 DESC; |
例:
|
1 2 3 |
SELECT * FROM orders ORDER BY order_date DESC, order_id ASC; |
| 並び替え条件 | 内容 |
|---|---|
| order_date | 新しい順 |
| order_id | 同日内では若い順 |
日付で新しいものを優先し、同じ日付内はID順に整列します。
NULLの並び順を理解する
多くのDBでは、NULLは通常の値と比較できません。
そのため、ORDER BY時の位置はDBごとに異なります。
代表的な挙動は以下の通りです。
| DB製品 | 昇順時のNULL位置 |
|---|---|
| Oracle | 最後 |
| PostgreSQL | 最後 |
| MySQL | 最初 |
想定と違う順序になる原因の多くは、NULLの扱いを考慮していないことです。
NULLS FIRST / NULLS LAST(対応DB)
OracleやPostgreSQLでは、NULLの位置を明示できます。
|
1 |
ORDER BY 列名 ASC NULLS LAST; |
|
1 |
ORDER BY 列名 DESC NULLS FIRST; |
例:
|
1 2 3 |
SELECT * FROM employees ORDER BY commission_pct DESC NULLS LAST; |
NULLを必ず最後に回せます。
NULL対策(汎用テクニック)
NULLS FIRST/LASTが使えないDBでは、関数で代替します。
|
1 |
ORDER BY COALESCE(列名, 0) DESC; |
または
|
1 |
ORDER BY 列名 IS NULL, 列名 DESC; |
意味:
| 式 | 役割 |
|---|---|
| 列名 IS NULL | NULLを1、値ありを0として並び替え |
| 列名 DESC | 実値で並び替え |
NULLを最後にしたい場合に有効です。
CASE式を使った条件付き並び替え
ORDER BYではCASE式が使えます。
例:ステータス順を独自に定義
|
1 2 3 4 5 6 |
ORDER BY CASE status WHEN '重要' THEN 1 WHEN '通常' THEN 2 WHEN '低' THEN 3 END; |
文字順ではなく、業務ロジック順に並び替えできます。
よく使う例:
・優先度順
・状態遷移順
・固定順リスト
計算結果で並び替える
|
1 |
ORDER BY price * quantity DESC; |
集計関数も使えます。
|
1 2 3 4 |
SELECT category, SUM(amount) AS total FROM sales GROUP BY category ORDER BY total DESC; |
SELECT句の別名で並び替えるのが安全です。
文字列と数値の並び替えの違い
数値型と文字列型では並び方が異なります。
| 値 | 文字列順 | 数値順 |
|---|---|---|
| 2 | 10より後 | 10より前 |
| 10 | 2より前 | 2より後 |
文字列型の数値を並べると誤動作します。
対策:
|
1 |
ORDER BY CAST(列名 AS INTEGER); |
インデックスとORDER BY
ORDER BYはインデックスがあると高速になります。
| 条件 | 効果 |
|---|---|
| WHERE句と同じ列 | 効きやすい |
| ORDER BY列と一致 | ソート回避 |
逆に、計算式や関数付きORDER BYはインデックスが効きません。
サブクエリとORDER BY
サブクエリ内のORDER BYは意味を持たないケースがあります。
|
1 2 3 4 5 6 7 |
SELECT * FROM ( SELECT * FROM employees ORDER BY salary DESC ) WHERE ROWNUM <= 5; |
Oracleのように上位抽出と組み合わせる場合は有効です。
よくある質問(Q & A)
- ORDER BYは省略できますか?
-
省略できますが、並び順は保証されません。
表示順が必要な場合は必ずORDER BYを指定してください。 - ORDER BYに列番号は使えますか?
-
123SELECT name, salaryFROM employeesORDER BY 2 DESC;
可能ですが、列構成変更に弱いため非推奨です。
- NULLを必ず最後にしたいのですが?
-
対応DBでは
1ORDER BY 列名 NULLS LAST;未対応DBでは
1ORDER BY 列名 IS NULL, 列名;が安全です。
- 日本語の並び順が想定と違います
-
照合順序(COLLATION)の設定に依存します。
ORDER BY時に明示指定が必要な場合があります。
まとめ
ORDER BYは単なる並び替えではなく、
・複数条件
・NULL制御
・業務順制御
・集計結果の制御
まで担う重要な句です。
特にNULL対策とCASE式による並び替えは、実務で頻出します。
「ORDER BY 列名」だけで済ませず、意図した順序を明示するSQLを書くことが重要です。


