この記事では、行の並べ替えに関連する内容を紹介します。
概要
クエリが出力テーブルを生成した後 (選択リストが処理された後) 、オプションでソートできます。 並べ替えが選択されていない場合、行は指定されていない順序で返されます。 その場合の実際の順序は、スキャンプランと結合プランのタイプ、およびディスク上の順序に依存しますが、依存してはなりません。 特定の出力順序付けは、ソートステップが明示的に選択された場合にのみ保証できます。
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注文がデフォルトです。 昇順は、より小さい値を最初に配置します。ここで、「より小さい」は < 演算子で定義されます。 同様に、降順は > 演算子で決定されます。
NULLS FIRSTおよびNULLS LASTオプションを使用して、ソート順序でヌル以外の値の前または後にヌルが現れるかどうかを判断できます。 デフォルトでは、null値はnull以外の値よりも大きいかのようにソートされます。つまり、DESC順序のデフォルトはNULLS FIRSTで、それ以外の場合はNULLS LASTです。
順序付けオプションは、ソート列ごとに独立して考慮されることに注意してください。 たとえば、ORDER BY x, y DESCは、ORDER BY x ASC, y DESCを意味します。これは、ORDER BY x DESC, 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の組み合わせの結果に適用できますが、この場合は、式ではなく、列名または数値の出力でのみソートできます。
実際には、PostgreSQLは、式のデータ型にデフォルトのBツリー演算子クラスを使用して、ASCとDESCのソート順序を決定します。 従来、< および > 演算子がこのソート順序に対応するようにデータ型が設定されていましたが、ユーザー定義のデータ型の設計者は別のことを選択できました。