SQLでデータを取得するとき、一覧を見やすくしたり、最新順・人気順にしたりするために欠かせないのが ソート(並び替え) です。
この記事では、SELECT の結果を 特定フィールドでソートする基本から、NULLの扱いや複数条件、カスタム順までを、最小限の知識で理解できるようにまとめます。
ソートは ORDER BY を SELECT の最後につけるだけです。
SELECT id, name, created_at
FROM users
ORDER BY created_at ASC;
ASC は省略できるので、実務ではこう書くことも多いです。
SELECT id, name, created_at
FROM users
ORDER BY created_at;
SELECT id, name, created_at
FROM users
ORDER BY created_at DESC;
よくある用途
ORDER BY created_at DESCORDER BY created_at ASCORDER BY price DESC「まずAで並べて、同じならBで並べたい」というケースは多いです。
SELECT id, status, updated_at
FROM tickets
ORDER BY status ASC, updated_at DESC;
この例だと、
status でグルーピングするように並びstatus が同じ行は updated_at の新しい順DBや列によって、NULLが混ざると並びが分かりづらくなることがあります。
そんなときは NULLを最後(または最初)に寄せるのが定番です。
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;
SELECT *
FROM your_table
ORDER BY sort_col ASC NULLS LAST;
データが "1", "2", "10" のように文字列型だと、辞書順で "10" が "2" より前になることがあります。
この場合は数値変換してソートします。
SELECT *
FROM your_table
ORDER BY CAST(sort_col AS UNSIGNED) ASC;
SELECT *
FROM your_table
ORDER BY TRY_CONVERT(int, sort_col) ASC;
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;
ソートはDBにとってコストが高めです。
よく使う並び替えカラムにはインデックスを貼ると改善することが多いです。
例:ORDER BY CAST(...) や ORDER BY LOWER(name) などは、インデックスが効きにくいことがあります。
頻出なら「型を直す」「別列に保持する」など設計で回避することもあります。
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/DESCORDER BY A, B