オプションの ORDER BY 句の構文は次のとおりです。

ORDER BY expression [ ASC | DESC ] [, ...]

expressionには SELECT リストの出力列の名前または序数を指定することができます。 また、入力列の値から形成される任意の式にすることもできます。

ORDER BY 句を指定すると、指定した式に従って結果行がソートされます。 2 つの行が左端の式に基づいて等しい場合、それらはその次の式に従って比較されます。 指定されたすべての式に基づいて等しい場合、それらは実装依存の順序で返されます。

序数は、結果列の序数 (左から右) の位置を指します。 この機能により、一意の名前を持たない列に基づいて並べ替えることができます。 AS 句を使用して結果列に名前を割り当てることができるため、これは必要ありません。

また、ORDER BY 句の任意の式 (SELECT 出力リストに表示されない列を含む) を使用することもできます。 したがって、次の文は有効です。

SELECT ename FROM emp ORDER BY empno;

UNIONINTERSECT、または MINUS 句の結果に適用される ORDER BY 句は、式ではなく、出力列の名前または数値のみを指定できます。

ORDER BY 式が出力列名と入力列名の両方に一致する簡素な名前である場合、ORDER BY はこれを出力列名として解釈します。 これは、GROUP BY 句における同じ状況とは逆の選択です。 この不整合は、SQL 標準と互換性を確保するためのものです。

ORDER BY 句の任意の式の後ろに ASC (昇順) または DESC (降順) キーワードを追加することができます。 ASC も DESC も指定しない場合、ASC が使用されます。

null 値は、他の値よりも高い順に並べ替えられます。 つまり、null 値は昇順の最後にあり、降順の最初にあります。

文字列データは、データベースクラスターの初期化時に作成された特定のリージョンのソートルールセットに基づいてソートされます。

次の 2 つの例は、2番目の列 (dname) の内容に基づいて結果をソートする方法を示しています。

SELECT * FROM dept ORDER BY dname;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)

SELECT * FROM dept ORDER BY 2;

 deptno |   dname    |   loc
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     40 | OPERATIONS | BOSTON
     20 | RESEARCH   | DALLAS
     30 | SALES      | CHICAGO
(4 rows)