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 によるオーバーヘッドは回避される(記述してもソート処理がスキップされる)。
既にソートされている ソート済ハッシュ・クラスタ
においても特記は無いが 実行計画 からみて ORDER BY によるオーバーヘッドは回避されている。
ORDER BY を記述することによるメリットはあるが、デメリットはないといえる。
DISTINCT と OREDER BY 併用時の制限事項
DISTINCT を SELECT 文に指定する場合には ORDER BY には SELECT リストに含まれていない項目を並び替えに使用できない。これは DISTINCT も ORDER BY も一時領域を使用してソート(して重複を削除 ※)する必要がある。異なるキーのソートを同時の実行できないということ。
(※) 最近では強力な CPU パワーと大規模メモリ志向によって結果セットの行をハッシュにして重複除去するプランになることが多いらしい。
関連事項