バージョンごとのドキュメント一覧

7.5. 行の並べ替え(ORDER BY) #

<title>Sorting Rows (<literal>ORDER BY</literal>)</title>

After a query has produced an output table (after the select list has been processed) it can optionally be sorted. If sorting is not chosen, the rows will be returned in an unspecified order. The actual order in that case will depend on the scan and join plan types and the order on disk, but it must not be relied on. A particular output ordering can only be guaranteed if the sort step is explicitly chosen. ある問い合わせが1つの出力テーブルを生成した後(選択リストの処理が完了した後)、並べ替えることができます。 並べ替えが選ばれなかった場合、行は無規則な順序で返されます。 そのような場合、実際の順序は、スキャンや結合計画の種類や、ディスク上に格納されている順序に依存します。 しかし、当てにしてはいけません。 明示的に並べ替え手続きを選択した場合にのみ、特定の出力順序は保証されます。

The <literal>ORDER BY</literal> clause specifies the sort order: ORDER BY句は並べ替えの順番を指定します。

SELECT select_list
    FROM table_expression
    ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
             [, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

The sort expression(s) can be any expression that would be valid in the query's select list. An example is: 並べ替え式(複数可)は問い合わせの選択リスト内で使用可能な任意の式を取ることができます。 以下に例を示します。

SELECT a, b FROM table1 ORDER BY a + b, c;

When more than one expression is specified, the later values are used to sort rows that are equal according to the earlier values. Each expression can be followed by an optional <literal>ASC</literal> or <literal>DESC</literal> keyword to set the sort direction to ascending or descending. <literal>ASC</literal> order is the default. Ascending order puts smaller values first, where <quote>smaller</quote> is defined in terms of the <literal>&lt;</literal> operator. Similarly, descending order is determined with the <literal>&gt;</literal> operator. 複数の式が指定された場合、前の式の値が等しい行を並べ替える際に後の式の値が使用されます。 列指定の後にオプションでASCもしくはDESCを付与することで、並べ替えの方向を昇順、降順にするかを設定することができます。 ASC順がデフォルトです。 昇順では、小さな値を先に出力します。 ここでの小さいとは、<演算子によって決定されます。 同様に降順では>演算子で決定されます。 [6]

The <literal>NULLS FIRST</literal> and <literal>NULLS LAST</literal> options can be used to determine whether nulls appear before or after non-null values in the sort ordering. By default, null values sort as if larger than any non-null value; that is, <literal>NULLS FIRST</literal> is the default for <literal>DESC</literal> order, and <literal>NULLS LAST</literal> otherwise. NULLS FIRSTおよびNULLS LASTオプションを使用して、その並べ替え順においてNULL値を非NULL値の前にするか後にするかを決定することができます。 デフォルトでは、NULL値はあたかもすべての非NULL値よりも大きいとみなして並べ替えます。 と言うことは、NULLS FIRSTDESC順序付けのデフォルトで、そうでなければNULLS LASTです。

Note that the ordering options are considered independently for each sort column. For example <literal>ORDER BY x, y DESC</literal> means <literal>ORDER BY x ASC, y DESC</literal>, which is not the same as <literal>ORDER BY x DESC, y DESC</literal>. この順序づけオプションは、並べ替えで使用される各列に個別に適用されることに注意してください。 例えば、ORDER BY x, y DESCは、ORDER BY x DESC, y DESCと同じではなく、ORDER BY x ASC, y DESCを意味します。

A <replaceable>sort_expression</replaceable> can also be the column label or number of an output column, as in: 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;

both of which sort by the first output column. Note that an output column name has to stand alone, that is, it cannot be used in an expression &mdash; for example, this is <emphasis>not</emphasis> correct: 両方とも最初の出力列で並べ替えられます。 出力列名は単体でなければなりません。つまり式としては使用できないことに注意してください。 例えば以下は間違いです。


SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          &#45;- wrong

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- 間違い

This restriction is made to reduce ambiguity. There is still ambiguity if an <literal>ORDER BY</literal> item is a simple name that could match either an output column name or a column from the table expression. The output column is used in such cases. This would only cause confusion if you use <literal>AS</literal> to rename an output column to match some other table column's name. これは曖昧さを減らすための制限です。 ORDER BY項目が単純な名前であっても、出力列名とテーブル式による列と同じ名前となる場合、曖昧さはまだ存在します。 この場合、出力列名が使用されます。 ASを使用して他のテーブル列の名前と同じ名前に出力列を変名した場合にのみ混乱が発生します。

<literal>ORDER BY</literal> can be applied to the result of a <literal>UNION</literal>, <literal>INTERSECT</literal>, or <literal>EXCEPT</literal> combination, but in this case it is only permitted to sort by output column names or numbers, not by expressions. ORDER BYを、UNIONINTERSECTEXCEPT組み合わせの結果に適用することができます。 しかしこの場合、出力列の名前または番号でのみ並べ替えることができ、式では並べ替えることができません。



[6] Actually, <productname>PostgreSQL</productname> uses the <firstterm>default B-tree operator class</firstterm> for the expression's data type to determine the sort ordering for <literal>ASC</literal> and <literal>DESC</literal>. Conventionally, data types will be set up so that the <literal>&lt;</literal> and <literal>&gt;</literal> operators correspond to this sort ordering, but a user-defined data type's designer could choose to do something different. 実際、PostgreSQLは、ASCDESCの並べ替え順を決定するために、式のデータ型用のデフォルトのB-tree演算子クラスを使用します。 慣習的に、データ型は<>演算子をこの並べ替え順になるように設定されます。 しかし、ユーザ定義データ型の設計者は異なるものを選択することができます。