SQLのSELECT結果を並び替える方法(ORDER BYで特定フィールドをソート)

SQLでデータを取得するとき、一覧を見やすくしたり、最新順・人気順にしたりするために欠かせないのが ソート(並び替え) です。
この記事では、SELECT の結果を 特定フィールドでソートする基本から、NULLの扱い複数条件カスタム順までを、最小限の知識で理解できるようにまとめます。


ORDER BYの基本(昇順 / 降順)

ソートは ORDER BYSELECT の最後につけるだけです。

昇順(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;

この例だと、

  1. status でグルーピングするように並び
  2. 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 が最強です。

例:priorityHigh→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が便利
  • 大量データなら インデックスも意識すると強い
あざらし

はじめまして、あざらしです。 フリーターからエンジニア会社へ就職し、 現在はフリーランスのシステムエンジニアとして働いています。 本業のエンジニア業のかたわら、 ✍️ ブログ運営 と「収入の柱を増やす挑戦」を少しずつ続けています。 フリーター時代から比べると、 段階的に収入が増えていくのを実感できるのが素直にうれしい今日この頃。 このブログでは、日々の気づき・体験談 IT・ガジェット・ゲーム系の話 「調べて分かったこと」を噛み砕いた解説 などを中心に、ジャンルに縛られない雑記ブログとして発信しています。 「自分と同じように悩んでいる人のヒントになればいいな」 そんな気持ちで更新中です。 👉 プロフィール詳細は、名前「あざらし」をクリックしてください