2.2. 選択リスト

前のセクションで示したように、SELECTコマンド中のテーブル式は、 テーブルの結合やビュー、行の抽出、グループ化などにより中間 の仮想テーブルを作ります。 このテーブルは最終的に選択リストに渡されます。 選択リストは、中間のテーブルのどのが実際 に出力されるかを決めます。 テーブルの全ての列を出力する*がもっとも簡単な 選択リストです。 そうでなければ、選択リストは、カンマで区切られた評価式(Section 1.3参照)のリストです。 例えば、列名のリストであってもかまいません。

SELECT a, b, c FROM ...
a、bそしてcは、FROM句にあるテーブルの実際の列名か、あるいは、 Section 2.1.1.3で説明した別名です。 選択リストで使える名前はWHERE句と同じです。(もしグルーピングされていなけれ ば、それは、HAVING句と同じとなります。) もし、2つ以上のテーブルで列名が同じものを指定する場合は、次のよ うに、テーブル名を必ず指定しなければなりません。
SELECT tbl1.a, tbl2.b, tbl1.c FROM ...
(Section 2.1.2参照)

任意の評価式が選択リストで使われる場合、返されるテーブルは、概念的 には新たに仮想的な列を追加したもとのなります。 評価式は、それぞれの行で、行の値を列の参照と見なして一旦評価されます。 しかし選択リストには、FROM句で指定されたテーブルの列である必要 はありません。例えば、それらは定数算術式でもかまいません。

2.2.1. 列ラベル

選択リスト中のエントリは後の処理のために名前を割り当てることができます。 この場合の"後の処理"とは、オプションの類の記述とクライアント アプリケーションのことです(例えば、列へッダを表示するために使います)。 例えば:

SELECT a AS value, b + c AS sum FROM ...

もし、ASを使った列名の指定が無かった場合、システムは、デフォルトの 名前を割り当てます。 単に列を参照するためには、参照された列名となります。 関数呼び出しでは、関数名となります。 複雑な表現は、システムが特有の名前を生成します。

Note: ここでの出力列の名前は、FROM句(Section 2.1.1.3参照) で示したものとは異なります。 パイプ処理で、同じコラムを2度改名することが可能ですが、選択リストの中で選ばれ た名前が渡されます。

2.2.2. DISTINCT

選択リストが処理された後、結果テーブルの重複した行を任意で削除したい場合が ありますが、 DISTINCT キーワードをSELECTの後に書くと 可能になります。

SELECT DISTINCT select_list ...
(DISTINCTの代わりとしてALLを指定すると デフォルトの選択となり、全ての行が返ります。)

少なくとも一つの列の値が異なる場合、それら2列は別個と見なされます。 NULLは、この比較において等しいと見なされます。

二者択一で、どの行が別であるかを任意に表現できます。

SELECT DISTINCT ON (expression [, expression ...]) select_list ...
expressionは、全ての行で評されるの任意の表現です。 expressionで指定された行の値が等しい時は、 重複した行と考えられ、重複した行の集まりの内、最初の行だけが出力されます。 独自順序を保証するための十分な列でソートした後でなければ、集まりの内の "最初の行"が予測不可能であることに注意してください。 (DISTINCT ON処理は、ORDER BYソートの後に行われます。)

DISTINCT ON 句は、SQL標準ではありません。さらに、 結果が潜在的に不定となるため、時々悪いスタイルと考えられます。 GROUP BYとFROMの中の副問い合わせをうまく使うことによりに回避はできますが、 非常に多くの場合最も便利な代案となります。