行の並び替え

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 7章問い合わせ | 早送り | 次のページ

# 7.5. 行の並び替え

ある問い合わせが1つの出力テーブルを生成した後（選択リストの処理が完了した後）、並べ替えることができます。 並べ替えが選ばれなかった場合、行は無規則な順序で返されます。 そのような場合、実際の順序は、スキャンや結合計画の種類や、ディスク上に格納されている順序に依存します。 しかし、当てにはなりません。 特定の順序で出力することは、明白に並べ替える処理を選択することでのみ保証されます。

`ORDER BY`句は並べ替えの順番を指定します。

    SELECT select_list
        FROM table_expression
        ORDER BY sort_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`順がデフォルトです。 昇順では、小さな値を先に出力します。 ここでの"小さい"とは、`<`演算子によって決定されます。 同様に降順では`>`演算子で決定されます。 [1]

`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`組み合わせの結果に適用することができます。 しかしこの場合、出力列の名前または番号でのみ並び替えすることができ、式では並び替えすることができません。

### 注意

[1] | 実際、PostgreSQLは、`ASC`と`DESC`の並び替え順を決定するために、式のデータ型用のデフォルトのB-tree演算子クラスを使用します。 慣習的に、データ型は`<`と`>`演算子をこの並び替え順になるように設定されます。 しかし、ユーザ定義データ型の設計者は異なるものを選択することができます。

前のページ | ホーム | 次のページ
問い合わせの結合 | 上に戻る | `LIMIT`と`OFFSET`