SQL 入門 > SELECT 文の活用(ORDER BY)

並び替え:ORDER BY

レコードの並び替え (ORDER BY)

抽出したデータの並び替えには SELECT 文 の中の ORDER BY を使用する。
並び替えは、列ごとに昇順、降順、NULLの表示順を設定できる。
並び替えキーワードは 昇順:ASC(無指定時 デフォルト) と 降順:DESC

単一列 での並び替え

DEPT_NO の降順で表示する。 ⇒ ORDER BY DEPT_NO DESC

SELECT * FROM USER_MASTER
 ORDER BY DEPT_NO DESC

複数列 での昇順、降順を混ぜた並び替え

DEPT_NO の昇順、USER_ID の降順で表示する。⇒ ORDER BY DEPT_NO, USER_ID DESC

SELECT * FROM USER_MASTER
 ORDER BY DEPT_NO, USER_ID DESC

NULL 値 の取り扱い

DEPT_NO の昇順(NULL を先頭に配置) ⇒ NULLS FIRST (8.1.6 以上)

SELECT * FROM USER_MASTER
 ORDER BY DEPT_NO ASC NULLS FIRST

注意 NULL は無限大ではないが、指定しなければ並び順では無限大と同じ振る舞いをする。

まとめ:並び替えに使うキーワード

ASC - 昇順(省略時)
DESC - 降順(逆順)
NULLS LAST  - 昇順のときのデフォルト
NULLS FIRST - 降順のときのデフォルト

同値の場合の順序 (重複行の並び替え)

並び替えにおいて列の値が同じ値の場合、その順番は常に決定的とはいえず変動することがある。
ROWID 順になるということも保証されない。決定的にするためには ROWID を ORDER BY に記述すると良いだろう。

決定的でない理由としては実行計画の差異、パーティション表 やパラレルクエリのコーディネータなどの要因によって順番が変動することもある。ヒント句の /*+ FIRST_ROWS */ と /*+ ALL_ROWS */ の指定によって、わかり易く アクセスパス が変化することが多い。

特定の状況下では ORDER BY 句なしに並び替えられて取り出されることがある。 これは Oracle(オプティマイザ) が効率的にデータ処理するために、その処理プロセスで並び替え処理(事前処理含む)があるだけで、これを取り出し結果の並び替えに代用するようなことはしてはならない(※)。

(※) 索引構成表 において ORDER BY によるオーバーヘッドは回避される(記述してもソート処理がスキップされる)。 既にソートされている ソート済ハッシュ・クラスタ Oracle 10g においても特記は無いが 実行計画 からみて ORDER BY によるオーバーヘッドは回避されている。
ORDER BY を記述することによるメリットはあるが、デメリットはないといえる。

DISTINCT と OREDER BY 併用時の制限事項

DISTINCT を SELECT 文に指定する場合には ORDER BY には SELECT リストに含まれていない項目を並び替えに使用できない。これは DISTINCT も ORDER BY も一時領域を使用してソート(して重複を削除 ※)する必要がある。異なるキーのソートを同時の実行できないということ。

(※) 最近では強力な CPU パワーと大規模メモリ志向によって結果セットの行をハッシュにして重複除去するプランになることが多いらしい。



関連事項


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト