3.

SQL ORDER BY 完全ガイド(昇順 / 降順 / 複数カラム / NULL 順序 / インデックス活用)

編集
この記事の要点
  • ORDER BYSELECT 結果の行の並び順を指定する句
  • 昇順は ASC(省略可)、降順は DESC
  • 複数キーでの並び替え: ORDER BY col1 ASC, col2 DESC
  • NULL の扱いは DB 依存。Oracle / PostgreSQL は NULLS FIRST / NULLS LAST で明示可能
  • インデックスと並び順が一致していればソート省略で高速化できる

ORDER BY 句とは

ORDER BYSELECT 文の結果セットの行を並び替えるための句です。明示的に指定しない限り、SQL の結果順序は不定として扱われるため、決まった順番で取り出したいときは必須になります。

基本構文

SELECT カラム1, カラム2, ...
FROM   テーブル
[WHERE 条件]
ORDER BY ソートキー1 [ASC|DESC] [, ソートキー2 [ASC|DESC] ...];

1. 単一カラムでソート

-- 給料の昇順
SELECT empno, ename, sal
FROM   emp
ORDER BY sal;        -- ASC は省略可

-- 給料の降順
SELECT empno, ename, sal
FROM   emp
ORDER BY sal DESC;

2. 複数カラムでソート

-- 部署番号の昇順 → 同じ部署内では給料の降順
SELECT empno, ename, deptno, sal
FROM   emp
ORDER BY deptno ASC, sal DESC;

3. 列番号 / 別名でソート

-- 3 番目のカラム(sal)でソート
SELECT empno, ename, sal FROM emp
ORDER BY 3 DESC;

-- 別名でソート
SELECT ename, sal * 12 AS annual_sal
FROM   emp
ORDER BY annual_sal DESC;

4. 式 / 関数でソート

-- 大文字小文字を無視した名前順
SELECT * FROM users
ORDER BY UPPER(name);

-- CASE 式でカスタム順序
SELECT * FROM orders
ORDER BY CASE status
           WHEN 'urgent' THEN 1
           WHEN 'normal' THEN 2
           ELSE 3
         END;

NULL の扱い

NULL を最初・最後どちらに並べるかは DB によって既定が異なります。

DB既定(ASC)明示指定
Oracle / PostgreSQLNULL は最後NULLS FIRST / NULLS LAST
MySQLNULL は最初標準構文なし。IS NULL をソートキーに含める回避策
SQL ServerNULL は最初標準構文なし。CASE 式で代替
-- Oracle / PostgreSQL
SELECT * FROM emp ORDER BY commission DESC NULLS LAST;

-- MySQL で NULL を最後に
SELECT * FROM emp ORDER BY commission IS NULL, commission DESC;

LIMIT / OFFSET / FETCH との組み合わせ

ページング用途では ORDER BY + LIMIT/OFFSET または FETCH FIRST を組み合わせます。

-- MySQL / PostgreSQL
SELECT * FROM emp ORDER BY hiredate DESC LIMIT 10 OFFSET 20;

-- Oracle / SQL Server (標準 ANSI)
SELECT * FROM emp ORDER BY hiredate DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

パフォーマンス

  • 大きなテーブルの ORDER BY は全件ソートを伴うため重い処理
  • ソートキーにインデックスがあると、DB がソートをスキップしてインデックススキャンで結果を返せる
  • 複合インデックスは並び順まで一致している必要がある(例: (deptno ASC, sal DESC)
  • 関数を使ったソート(UPPER(col) など)はインデックスが効きにくい。関数インデックスまたは生成カラムで対処

注意点

  • GROUP BY との順序: WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT の順で評価される
  • SELECT に含まれていないカラムでもソートキーに使える(ただし DISTINCT や UNION と併用すると制限あり)
  • UNION など集合演算では、ORDER BY は最後に 1 回だけ書く
  • 列番号指定は可読性が下がるためチームコーディング規約で禁止することが多い

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. GROUP BY 句
  2. HAVING句
  3. ORDER BY 句

最近更新/作成されたページ