他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

2.3. 選択リスト

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

SELECT a, b, c FROM ...

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

SELECT tbl1.a, tbl2.b, tbl1.c FROM ...

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

2.3.1. 列ラベル

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

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

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

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

2.3.2. DISTINCT

選択リストが処理された後、結果テーブルの重複した行を任意に削除したい場合、 DISTINCT キーワードを SELECT の直後に記述します。 DISTINCT の代わりとして ALL を指定するとデフォルトの選択となり、すべての行が返ります)。

SELECT DISTINCT select_list ...

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

また、任意の式を使用して、どの行が別であるかを決定することもできます。

SELECT DISTINCT ON (expression [, expression ...]) select_list ...

expression は、すべての行で評価されるの任意の評価式です。全ての式が等しくなる行の集合は、重複しているとみなされ、集合の最初の行だけが出力されます。DISTINCT フィルタへの入力となった行の一意な順序を保証できるほど十分な列で、その問い合わせがソートされていない限り、集合の"最初の行"は予測不可能であることに注意して下さい(DISTINCT ON処理は、ORDER BYソートの後に行われます)。

DISTINCT ON 句は、SQL 標準ではありません。さらに、結果が不定なるという可能性を秘めているため、時によっては悪いスタイルと考えられます。GROUP BY 句と FROM 句の中の副問い合わせをうまく使うことによりに回避はできますが、しばしば最も便利な別のやり方になります。