この記事では、Oracle SQLで使われるORDER BY
句について徹底的に解説します。データベースの操作において並べ替えは必須のスキルです。ビジネス要件に応じてデータを整え、分析やレポート作成を効率化するための実践的なテクニックを、具体例を交えながら紹介します。今回は、scott
スキーマを用いて、SQL初心者からプロフェッショナルまで役立つ内容をお届けします。
SCOTTスキーマは以下を実行することでインストールが可能です。
SQL> @?/rdbms/admin/utlsampl.sql
1. ORDER BY句の役割と基本構文
ORDER BY
句は、クエリの実行結果を指定した順序で並べ替えるために使用されます。Oracle SQLの基礎的な機能ですが、組み合わせによって様々な並べ替えが可能です。
構文SELECT カラム1, カラム2, ...
FROM テーブル名
ORDER BY 並べ替え対象カラム [ASC|DESC];
- ASC(昇順):デフォルトの設定で、数字なら小さい順、文字列ならアルファベット順に並べます。
- DESC(降順):数字なら大きい順、文字列ならアルファベットの逆順で並べます。
2. ビジネスデータの基本的な並べ替え – 昇順と降順
たとえば、営業担当が顧客のリストを月額契約料の高い順に表示したい場合、次のように記述します。SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC;
このクエリでは給与が高い順に従業員が表示され、VIP顧客や重要なデータをすぐに確認できる形になります。逆に、昇順で小規模顧客からリストを見たい場合はASC
を指定します。
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 ORDER BY SAL DESC;
EMPNO ENAME JOB SAL
---------- -------------------- -------------------- ----------
7839 KING PRESIDENT 5000
7902 FORD ANALYST 3000
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7499 ALLEN SALESMAN 1600
7844 TURNER SALESMAN 1500
7934 MILLER CLERK 1300
7654 MARTIN SALESMAN 1250
7521 WARD SALESMAN 1250
7900 JAMES CLERK 950
7369 SMITH CLERK 800
12行が選択されました。
3. 複数条件での並べ替え – 柔軟なデータ表示
ORDER BY
句は複数のカラムに対して適用できます。たとえば、部門内の職位ごとに従業員を並べ替える際に、部門(DEPTNO
)と職位(JOB
)で並べ替えると効果的です。SELECT EMPNO, ENAME, DEPTNO, JOB, SAL
FROM EMP
ORDER BY DEPTNO, JOB DESC, SAL DESC;
この例では、部門ごとにグループ化され、さらに各職位の中で給与が高い順に並べ替えられます。このように複数条件を指定すると、データをより詳細に整理しやすくなります。
SQL> SELECT EMPNO, ENAME, DEPTNO, JOB, SAL
2 FROM EMP
3 ORDER BY DEPTNO, JOB DESC, SAL DESC;
EMPNO ENAME DEPTNO JOB SAL
---------- -------------------- ---------- -------------------- ----------
7839 KING 10 PRESIDENT 5000
7782 CLARK 10 MANAGER 2450
7934 MILLER 10 CLERK 1300
7566 JONES 20 MANAGER 2975
7369 SMITH 20 CLERK 800
7902 FORD 20 ANALYST 3000
7499 ALLEN 30 SALESMAN 1600
7844 TURNER 30 SALESMAN 1500
7521 WARD 30 SALESMAN 1250
7654 MARTIN 30 SALESMAN 1250
7698 BLAKE 30 MANAGER 2850
7900 JAMES 30 CLERK 950
12行が選択されました。
4. NULL値の扱いと並べ替えカスタマイズ
ORDER BY
句では、NULLの位置を制御することでデータの整合性を高めることができます。通常、昇順ではNULLが最後、降順では最初に並びますが、NULLS FIRST
またはNULLS LAST
を指定することで調整が可能です。SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC NULLS LAST;
この例では、給与の高い順に従業員が並び、給与がNULLのレコードは最後に表示されます。例えば、将来データが埋め込まれる予定のNULLデータを一目で区別する際に役立ちます。
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 ORDER BY SAL DESC NULLS LAST;
EMPNO ENAME JOB SAL
---------- -------------------- -------------------- ----------
7839 KING PRESIDENT 5000
7902 FORD ANALYST 3000
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7499 ALLEN SALESMAN 1600
7844 TURNER SALESMAN 1500
7934 MILLER CLERK 1300
7654 MARTIN SALESMAN 1250
7521 WARD SALESMAN 1250
7900 JAMES CLERK 950
7369 SMITH CLERK 800
12行が選択されました。
5. 別名を使った計算列での並べ替え
特に経営データや集計レポートでは、計算列を用いた並べ替えが重要です。カラムの別名を使用することで、計算した値に基づいた並べ替えが簡単に行えます。SELECT EMPNO, ENAME, SAL*12 AS ANNUAL_SALARY
FROM EMP
ORDER BY ANNUAL_SALARY DESC;
ここでは、年収を計算して降順に並べ、給与の高い順に従業員が表示されます。データの把握を迅速に行いたい時に、特に役立つテクニックです。
SQL> SELECT EMPNO, ENAME, SAL*12 AS ANNUAL_SALARY
2 FROM EMP
3 ORDER BY ANNUAL_SALARY DESC;
EMPNO ENAME ANNUAL_SALARY
---------- -------------------- -------------
7839 KING 60000
7902 FORD 36000
7566 JONES 35700
7698 BLAKE 34200
7782 CLARK 29400
7499 ALLEN 19200
7844 TURNER 18000
7934 MILLER 15600
7654 MARTIN 15000
7521 WARD 15000
7900 JAMES 11400
7369 SMITH 9600
12行が選択されました。
6. カラム位置での並べ替えと可読性のバランス
ORDER BY
句では、カラム名の代わりにカラム位置を指定することも可能です。これにより、クエリがシンプルになり、特に大規模なクエリで有効です。SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY 2, 4 DESC;
このクエリは、ENAME
(2番目のカラム)を昇順、SAL
(4番目のカラム)を降順で並べ替えます。ただし、カラム番号で指定するとSQLの可読性が低下することがあるため、特に共有クエリや長期的に使用するクエリではカラム名を使うほうが無難です。
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 ORDER BY 2, 4 DESC;
EMPNO ENAME JOB SAL
---------- -------------------- -------------------- ----------
7499 ALLEN SALESMAN 1600
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7902 FORD ANALYST 3000
7900 JAMES CLERK 950
7566 JONES MANAGER 2975
7839 KING PRESIDENT 5000
7654 MARTIN SALESMAN 1250
7934 MILLER CLERK 1300
7369 SMITH CLERK 800
7844 TURNER SALESMAN 1500
7521 WARD SALESMAN 1250
12行が選択されました。
7. ORDER BYでのCASE式を使ったカスタマイズ
場合によっては、特定の条件に基づいて並べ替えることが求められます。たとえば、部門ごとに表示順を設定し、特定の部門を優先して表示したい場合、CASE
式を用いて条件付き並べ替えが可能です。SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
ORDER BY
CASE
WHEN DEPTNO = 10 THEN 1
WHEN DEPTNO = 20 THEN 2
ELSE 3
END, SAL DESC;
このクエリでは、DEPTNO
が10の部門が最優先で表示され、その次にDEPTNO
が20、他の部門が続く順序で並べ替えられます。こうした並べ替えは、業務上の重要な要件に基づいてデータを表示する際に有効です。
SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
2 FROM EMP
3 ORDER BY
4 CASE
5 WHEN DEPTNO = 10 THEN 1
6 WHEN DEPTNO = 20 THEN 2
7 ELSE 3
8 END, SAL DESC;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- -------------------- ---------- ----------
7839 KING PRESIDENT 5000 10
7782 CLARK MANAGER 2450 10
7934 MILLER CLERK 1300 10
7902 FORD ANALYST 3000 20
7566 JONES MANAGER 2975 20
7369 SMITH CLERK 800 20
7698 BLAKE MANAGER 2850 30
7499 ALLEN SALESMAN 1600 30
7844 TURNER SALESMAN 1500 30
7521 WARD SALESMAN 1250 30
7654 MARTIN SALESMAN 1250 30
7900 JAMES CLERK 950 30
12行が選択されました。
8. ORDER BY句のパフォーマンス最適化
ORDER BY
句の使用はパフォーマンスに影響するため、データ量が多い場合には注意が必要です。以下のポイントを押さえると、処理が効率的になります。
- インデックスの活用:並べ替え対象のカラムにインデックスを設定することで、
ORDER BY
の処理が高速化する可能性があります。たとえば、SAL
カラムで並べ替えを頻繁に行う場合は、SAL
にインデックスを設定すると効果的です。 - 並べ替えカラムの数を減らす:複数のカラムを並べ替えるほど処理に時間がかかるため、必要なカラムのみに絞るとパフォーマンスが向上します。
- フェッチ制限の利用:大量のデータを並べ替える際、
FETCH FIRST N ROWS ONLY
を用いて表示件数を制限することで処理時間を短縮できます。
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC
FETCH FIRST 10 ROWS ONLY;
このクエリでは、給与の高い上位10件のみを表示し、効率的にデータを取得します。
SQL> SELECT EMPNO, ENAME, JOB, SAL
2 FROM EMP
3 ORDER BY SAL DESC
4 FETCH FIRST 10 ROWS ONLY;
EMPNO ENAME JOB SAL
---------- -------------------- -------------------- ----------
7839 KING PRESIDENT 5000
7902 FORD ANALYST 3000
7566 JONES MANAGER 2975
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7499 ALLEN SALESMAN 1600
7844 TURNER SALESMAN 1500
7934 MILLER CLERK 1300
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
10行が選択されました。
まとめ
ORDER BY
句はSQLにおける基本的な機能ですが、使いこなすことでビジネス上の分析やデータレポート作成を大幅に改善できます。並べ替えの基本から応用まで習得し、Oracleデータベースを自在に活用しましょう。
[参考]
SQL言語リファレンス – 問合せ結果のソート
コメント