前節で示したように、SELECT
コマンド中のテーブル式は、テーブルやビューの結合、行の抽出、グループ化などにより中間の仮想テーブルを作ります。
このテーブルは最終的に選択リストによる処理に渡されます。
選択リストは、中間のテーブルのどの列を実際に出力するかを決めます。
テーブル式が生成するすべての列を出力する*
が最も簡単な選択リストです。
そうでなければ、選択リストは、カンマで区切られた(4.2で定義された)評価式のリストです。
例えば、以下のような列名のリストであっても構いません。
SELECT a, b, c FROM ...
a
、b
、c
という列名は、FROM
句で参照されるテーブルの実際の列名か、あるいは7.2.1.2で説明したような列名に対する別名です。
グループ化されていなければ、選択リストで使用可能な名前空間はWHERE
句と同じです。
グループ化されている場合は、HAVING
句と同じとなります。
もし、2つ以上のテーブルで同じ名前の列がある場合は、次のように、テーブル名を必ず指定しなければいけません。
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
複数のテーブルを使用する場合、特定のテーブルのすべての列を求める方法も便利かもしれません。
SELECT tbl1.*, tbl2.a FROM ...
table_name
.*
という指定方法の詳細については、8.16.5を参照してください。
任意の評価式が選択リストで使われる場合、返されるテーブルは、概念的には新たに仮想的な列を追加したものとなります。
評価式は、それぞれの結果行で、その列参照を置換した行の値としていったん評価されます。
しかし、選択リストの式はFROM
句で指定されたテーブル式内の列を参照するものである必要はありません。例えば、定数算術式であっても構いません。
選択リスト中の項目は、ORDER BY
句の中での参照、もしくはクライアントアプリケーションによる表示での使用など、それに続く処理のために名前を付与できます。
例を示します。
SELECT a AS value, b + c AS sum FROM ...
AS
を使った出力列名の指定がない場合、システムはデフォルトの列名を付与します。
単純な列参照では参照された列名となります。
関数呼び出しでは関数名となります。
複雑な表現についてはシステムが汎用の名前を生成します。
AS
キーワードは通常省略できますが、必要な列名がPostgreSQLキーワードと一致する場合は、あいまいさを避けるためにAS
と記述するか、列名を二重引用符で括る必要があります。
(付録Cは、列ラベルとしてAS
を使用する必要があるキーワードを示しています。)
例えば、FROM
はそのようなキーワードの1つなので、以下は動きません。
SELECT a from, b + c AS sum FROM ...
しかし、以下はどちらも動きます。
SELECT a AS from, b + c AS sum FROM ... SELECT a "from", b + c AS sum FROM ...
将来のキーワードの追加に対する最大限の安全性を確保するために、常にAS
と記述するか、出力列名を二重引用符で囲むことを推奨します。
ここでの出力列の名前の指定は、FROM
句での名前の指定(7.2.1.2を参照)とは異なります。
同じ列の名前を2度変更することができますが、渡されるのは選択リストの中で割り当てられたものです。
DISTINCT
#
選択リストが処理された後、結果テーブルの重複行を削除の対象にすることもできます。
これを指定するためには、SELECT
の直後にDISTINCT
キーワードを記述します。
SELECT DISTINCT select_list
...
(DISTINCT
の代わりにALL
キーワードを使用して、すべての行が保持されるというデフォルトの動作を指定することができます。)
少なくとも1つの列の値が異なる場合、もちろん、それら2行は異なるとみなされます。 NULL値同士は、この比較において等しいとみなされます。
また、任意の式を使用して、どの行が別であるかを決定することもできます。
SELECT DISTINCT ON (expression
[,expression
...])select_list
...
ここでexpression
は、すべての行で評価される任意の評価式です。
すべての式が等しくなる行の集合は、重複しているとみなされ、集合の最初の行だけが出力内に保持されます。
DISTINCT
フィルタに掛けられる行の順序の一意性を保証できるよう十分な数の列で問い合わせを並べ替えない限り、出力される集合の「最初の行」は予想不可能であることに注意してください。
(DISTINCT ON
処理は、ORDER BY
による並べ替えの後に行われます。)
DISTINCT ON
句は標準SQLではありません。
さらに、結果が不定となる可能性があるため、好ましくないスタイルとみなされることもあります。
GROUP BY
とFROM
中の副問い合わせをうまく使うことにより、この構文を使わずに済みますが、DISTINCT ON
句はしばしば非常に便利な代案となります。