SQLでデータを取得するとき、一覧を見やすくしたり、最新順・人気順にしたりするために欠かせないのが ソート(並び替え) です。
この記事では、SELECT の結果を 特定フィールドでソートする基本から、NULLの扱いや複数条件、カスタム順までを、最小限の知識で理解できるようにまとめます。
ORDER BYの基本(昇順 / 降順)
ソートは ORDER BY を SELECT の最後につけるだけです。
昇順(ASC)
SELECT id, name, created_at
FROM users
ORDER BY created_at ASC;
ASC は省略できるので、実務ではこう書くことも多いです。
SELECT id, name, created_at
FROM users
ORDER BY created_at;
降順(DESC)
SELECT id, name, created_at
FROM users
ORDER BY created_at DESC;
よくある用途
- 最新順:
ORDER BY created_at DESC - 古い順:
ORDER BY created_at ASC - 金額の高い順:
ORDER BY price DESC
複数フィールドで並び替える(優先順位あり)
「まずAで並べて、同じならBで並べたい」というケースは多いです。
SELECT id, status, updated_at
FROM tickets
ORDER BY status ASC, updated_at DESC;
この例だと、
statusでグルーピングするように並びstatusが同じ行はupdated_atの新しい順
になります。
NULLを先頭/末尾に寄せる(実務でめちゃくちゃ使う)
DBや列によって、NULLが混ざると並びが分かりづらくなることがあります。
そんなときは NULLを最後(または最初)に寄せるのが定番です。
MySQL / SQL Server(汎用:CASEで制御)
NULLを最後にしたい
SELECT *
FROM your_table
ORDER BY
CASE WHEN sort_col IS NULL THEN 1 ELSE 0 END,
sort_col ASC;
NULLを最初にしたい
SELECT *
FROM your_table
ORDER BY
CASE WHEN sort_col IS NULL THEN 0 ELSE 1 END,
sort_col ASC;
PostgreSQL / Oracle(NULLS FIRST/LASTが使える)
SELECT *
FROM your_table
ORDER BY sort_col ASC NULLS LAST;
文字列の“数字”を数値としてソートしたい(”1″,”10″,”2″問題)
データが "1", "2", "10" のように文字列型だと、辞書順で "10" が "2" より前になることがあります。
この場合は数値変換してソートします。
MySQL
SELECT *
FROM your_table
ORDER BY CAST(sort_col AS UNSIGNED) ASC;
SQL Server
SELECT *
FROM your_table
ORDER BY TRY_CONVERT(int, sort_col) ASC;
PostgreSQL
SELECT *
FROM your_table
ORDER BY sort_col::int ASC;
“独自の順番”に並べたい(カスタムソート)
「優先度:高→中→低」「ステータス:未対応→対応中→完了」みたいに、自然順ではない順序で並べたい場合は CASE が最強です。
例:priority を High→Medium→Low→その他 の順
SELECT *
FROM tasks
ORDER BY
CASE priority
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
ELSE 99
END,
updated_at DESC;
よくある注意点(性能と仕様)
1) ORDER BYは重いことがある(特に大量データ)
ソートはDBにとってコストが高めです。
よく使う並び替えカラムにはインデックスを貼ると改善することが多いです。
2) ORDER BYで関数をかけると遅くなりやすい
例:ORDER BY CAST(...) や ORDER BY LOWER(name) などは、インデックスが効きにくいことがあります。
頻出なら「型を直す」「別列に保持する」など設計で回避することもあります。
FAQ
Q1. ORDER BYはWHEREより前?後?
A. 書く順序は基本こうです:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
Q2. 降順と昇順を混ぜられる?
A. 可能です。
例:ORDER BY status ASC, created_at DESC
Q3. 並び替え対象が日本語だとおかしくなることがある?
A. あります。原因は 照合順序(collation)。DB/列の設定次第なので、意図した順にしたい場合は collation を見直します。
まとめ
- 基本は
ORDER BY 列 ASC/DESC - 複数条件は
ORDER BY A, B - NULLはCASE(またはNULLS LAST/FIRST)で制御
- カスタム順はCASEが便利
- 大量データなら インデックスも意識すると強い


コメント