As shown in the previous section,
the table expression in the <command>SELECT</command> command
constructs an intermediate virtual table by possibly combining
tables, views, eliminating rows, grouping, etc. This table is
finally passed on to processing by the <firstterm>select list</firstterm>. The select
list determines which <emphasis>columns</emphasis> of the
intermediate table are actually output.
前節で示したように、SELECT
コマンド中のテーブル式は、テーブルやビューの結合、行の抽出、グループ化などにより中間の仮想テーブルを作ります。
このテーブルは最終的に選択リストによる処理に渡されます。
選択リストは、中間のテーブルのどの列を実際に出力するかを決めます。
The simplest kind of select list is <literal>*</literal> which
emits all columns that the table expression produces. Otherwise,
a select list is a comma-separated list of value expressions (as
defined in <xref linkend="sql-expressions"/>). For instance, it
could be a list of column names:
テーブル式が生成するすべての列を出力する*
が最も簡単な選択リストです。
そうでなければ、選択リストは、カンマで区切られた(4.2で定義された)評価式のリストです。
例えば、以下のような列名のリストであっても構いません。
SELECT a, b, c FROM ...
The columns names <literal>a</literal>, <literal>b</literal>, and <literal>c</literal>
are either the actual names of the columns of tables referenced
in the <literal>FROM</literal> clause, or the aliases given to them as
explained in <xref linkend="queries-table-aliases"/>. The name
space available in the select list is the same as in the
<literal>WHERE</literal> clause, unless grouping is used, in which case
it is the same as in the <literal>HAVING</literal> clause.
a
、b
、c
という列名は、FROM
句で参照されるテーブルの実際の列名か、あるいは7.2.1.2で説明したような列名に対する別名です。
グループ化されていなければ、選択リストで使用可能な名前空間はWHERE
句と同じです。
グループ化されている場合は、HAVING
句と同じとなります。
If more than one table has a column of the same name, the table name must also be given, as in: もし、2つ以上のテーブルで同じ名前の列がある場合は、次のように、テーブル名を必ず指定しなければいけません。
SELECT tbl1.a, tbl2.a, tbl1.b FROM ...
When working with multiple tables, it can also be useful to ask for all the columns of a particular table: 複数のテーブルを使用する場合、特定のテーブルのすべての列を求める方法も便利かもしれません。
SELECT tbl1.*, tbl2.a FROM ...
See <xref linkend="rowtypes-usage"/> for more about
the <replaceable>table_name</replaceable><literal>.*</literal> notation.
table_name
.*
という指定方法の詳細については、8.16.5を参照してください。
If an arbitrary value expression is used in the select list, it
conceptually adds a new virtual column to the returned table. The
value expression is evaluated once for each result row, with
the row's values substituted for any column references. But the
expressions in the select list do not have to reference any
columns in the table expression of the <literal>FROM</literal> clause;
they can be constant arithmetic expressions, for instance.
任意の評価式が選択リストで使われる場合、返されるテーブルは、概念的には新たに仮想的な列を追加したものとなります。
評価式は、それぞれの結果行で、その列参照を置換した行の値としていったん評価されます。
しかし、選択リストの式はFROM
句で指定されたテーブル式内の列を参照するものである必要はありません。例えば、定数算術式であっても構いません。
The entries in the select list can be assigned names for subsequent
processing, such as for use in an <literal>ORDER BY</literal> clause
or for display by the client application. For example:
選択リスト中の項目は、ORDER BY
句の中での参照、もしくはクライアントアプリケーションによる表示での使用など、それに続く処理のために名前を付与できます。
例を示します。
SELECT a AS value, b + c AS sum FROM ...
If no output column name is specified using <literal>AS</literal>,
the system assigns a default column name. For simple column references,
this is the name of the referenced column. For function
calls, this is the name of the function. For complex expressions,
the system will generate a generic name.
AS
を使った出力列名の指定がない場合、システムはデフォルトの列名を付与します。
単純な列参照では参照された列名となります。
関数呼び出しでは関数名となります。
複雑な表現についてはシステムが汎用の名前を生成します。
The <literal>AS</literal> key word is usually optional, but in some
cases where the desired column name matches a
<productname>PostgreSQL</productname> key word, you must write
<literal>AS</literal> or double-quote the column name in order to
avoid ambiguity.
(<xref linkend="sql-keywords-appendix"/> shows which key words
require <literal>AS</literal> to be used as a column label.)
For example, <literal>FROM</literal> is one such key word, so this
does not work:
AS
キーワードは通常省略できますが、必要な列名がPostgreSQLキーワードと一致する場合は、あいまいさを避けるためにAS
と記述するか、列名を二重引用符で括る必要があります。
(付録Cは、列ラベルとしてAS
を使用する必要があるキーワードを示しています。)
例えば、FROM
はそのようなキーワードの1つなので、以下は動きません。
SELECT a from, b + c AS sum FROM ...
but either of these do: しかし、以下はどちらも動きます。
SELECT a AS from, b + c AS sum FROM ... SELECT a "from", b + c AS sum FROM ...
For greatest safety against possible
future key word additions, it is recommended that you always either
write <literal>AS</literal> or double-quote the output column name.
将来のキーワードの追加に対する最大限の安全性を確保するために、常にAS
と記述するか、出力列名を二重引用符で囲むことを推奨します。
The naming of output columns here is different from that done in
the <literal>FROM</literal> clause (see <xref
linkend="queries-table-aliases"/>). It is possible
to rename the same column twice, but the name assigned in
the select list is the one that will be passed on.
ここでの出力列の名前の指定は、FROM
句での名前の指定(7.2.1.2を参照)とは異なります。
同じ列の名前を2度変更することができますが、渡されるのは選択リストの中で割り当てられたものです。
DISTINCT
#
After the select list has been processed, the result table can
optionally be subject to the elimination of duplicate rows. The
<literal>DISTINCT</literal> key word is written directly after
<literal>SELECT</literal> to specify this:
選択リストが処理された後、結果テーブルの重複行を削除の対象にすることもできます。
これを指定するためには、SELECT
の直後にDISTINCT
キーワードを記述します。
SELECT DISTINCT select_list
...
(Instead of <literal>DISTINCT</literal> the key word <literal>ALL</literal>
can be used to specify the default behavior of retaining all rows.)
(DISTINCT
の代わりにALL
キーワードを使用して、すべての行が保持されるというデフォルトの動作を指定することができます。)
Obviously, two rows are considered distinct if they differ in at least one column value. Null values are considered equal in this comparison. 少なくとも1つの列の値が異なる場合、もちろん、それら2行は異なるとみなされます。 NULL値同士は、この比較において等しいとみなされます。
Alternatively, an arbitrary expression can determine what rows are to be considered distinct: また、任意の式を使用して、どの行が別であるかを決定することもできます。
SELECT DISTINCT ON (expression
[,expression
...])select_list
...
Here <replaceable>expression</replaceable> is an arbitrary value
expression that is evaluated for all rows. A set of rows for
which all the expressions are equal are considered duplicates, and
only the first row of the set is kept in the output. Note that
the <quote>first row</quote> of a set is unpredictable unless the
query is sorted on enough columns to guarantee a unique ordering
of the rows arriving at the <literal>DISTINCT</literal> filter.
(<literal>DISTINCT ON</literal> processing occurs after <literal>ORDER
BY</literal> sorting.)
ここでexpression
は、すべての行で評価される任意の評価式です。
すべての式が等しくなる行の集合は、重複しているとみなされ、集合の最初の行だけが出力内に保持されます。
DISTINCT
フィルタに掛けられる行の順序の一意性を保証できるよう十分な数の列で問い合わせを並べ替えない限り、出力される集合の「最初の行」は予想不可能であることに注意してください。
(DISTINCT ON
処理は、ORDER BY
による並べ替えの後に行われます。)
The <literal>DISTINCT ON</literal> clause is not part of the SQL standard
and is sometimes considered bad style because of the potentially
indeterminate nature of its results. With judicious use of
<literal>GROUP BY</literal> and subqueries in <literal>FROM</literal>, this
construct can be avoided, but it is often the most convenient
alternative.
DISTINCT ON
句は標準SQLではありません。
さらに、結果が不定となる可能性があるため、好ましくないスタイルとみなされることもあります。
GROUP BY
とFROM
中の副問い合わせをうまく使うことにより、この構文を使わずに済みますが、DISTINCT ON
句はしばしば非常に便利な代案となります。