前のセクションで示したように、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句で指定されたテーブルのカラムである必要 はありません。それらは、定数算術式も可能です。例えば、
選択リスト中のエントリは後の処理のために名前を割り当てることができます。 この場合の"後の処理"とは、オプションの類の記述とクライアント アプリケーションのことです(例えば、カラムへッダを表示するために使います)。 例えば:
SELECT a AS value, b + c AS sum FROM ...
もし、ASを使ったカラム名の指定が無かった場合、システムは、デフォルトの 名前を割り当てます。 単にカラムを参照するためには、参照されたカラム名となります。 関数呼び出しでは、関数名となります。 複雑な表現は、システムが特有の名前を生成します。
Note: ここでの出力カラムの名前は、FROM句(xref linkend="queries-table-aliases"参照) で示したものとは異なります。 この方法は、同じコラムを2度改名することが可能ですが、選択リストの中で選ばれ た名前が渡されます。
選択リストが処理された後、結果テーブルの重複した行を任意で削除したい場合が ありますが、 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の中の副問い合わせをうまく使うことによりに回避はできますが、 非常に多くの場合最も便利な代案となります。