ある問い合わせが1つの出力テーブルを生成した後(選択リストの処理が完了した後)、並べ替えることができます。 並べ替えが選ばれなかった場合、行は無規則な順序で返されます。 そのような場合、実際の順序は、スキャンや結合計画の種類や、ディスク上に格納されている順序に依存します。 しかし、当てにしてはいけません。 明示的に並べ替え手続きを選択した場合にのみ、特定の出力順序は保証されます。
ORDER BY
句は並べ替えの順番を指定します。
SELECTselect_list
FROMtable_expression
ORDER BYsort_expression1
[ASC | DESC] [NULLS { FIRST | LAST }] [,sort_expression2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
並べ替え式(複数可)は問い合わせの選択リスト内で使用可能な任意の式を取ることができます。 以下に例を示します。
SELECT a, b FROM table1 ORDER BY a + b, c;
複数の式が指定された場合、前の式の値が等しい行を並べ替える際に後の式の値が使用されます。
列指定の後にオプションでASC
もしくはDESC
を付与することで、並べ替えの方向を昇順、降順にするかを設定することができます。
ASC
順がデフォルトです。
昇順では、小さな値を先に出力します。
ここでの「小さい」とは、<
演算子によって決定されます。
同様に降順では>
演算子で決定されます。
[5]
NULLS FIRST
およびNULLS LAST
オプションを使用して、その並べ替え順においてNULL値を非NULL値の前にするか後にするかを決定することができます。
デフォルトでは、NULL値はあたかもすべての非NULL値よりも大きいとみなして並べ替えます。
と言うことは、NULLS FIRST
はDESC
順序付けのデフォルトで、そうでなければNULLS LAST
です。
この順序づけオプションは、並べ替えで使用される各列に個別に適用されることに注意してください。
例えば、ORDER BY x, y DESC
は、ORDER BY x DESC, y DESC
と同じではなく、ORDER BY x ASC, y DESC
を意味します。
sort_expression
は以下のように列ラベルもしくは出力列の番号で指定することができます。
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
両方とも最初の出力列で並べ替えられます。 出力列名は単体でなければなりません。つまり式としては使用できないことに注意してください。 例えば以下は間違いです。
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- 間違い
これは曖昧さを減らすための制限です。
ORDER BY
項目が単純な名前であっても、出力列名とテーブル式による列と同じ名前となる場合、曖昧さはまだ存在します。
この場合、出力列名が使用されます。
AS
を使用して他のテーブル列の名前と同じ名前に出力列を変名した場合にのみ混乱が発生します。
ORDER BY
を、UNION
、INTERSECT
、EXCEPT
組み合わせの結果に適用することができます。
しかしこの場合、出力列の名前または番号でのみ並べ替えることができ、式では並べ替えることができません。
[5] 実際、PostgreSQLは、ASC
とDESC
の並べ替え順を決定するために、式のデータ型用のデフォルトのB-tree演算子クラスを使用します。
慣習的に、データ型は<
と>
演算子をこの並べ替え順になるように設定されます。
しかし、ユーザ定義データ型の設計者は異なるものを選択することができます。