無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

7.3. 選択リスト

前節で示したように、 SELECT コマンド中のテーブル式は、テーブルの結合やビュー、行の抽出、グループ化などにより中間の仮想テーブルを作ります。 このテーブルは最終的に 選択リスト に渡されます。 選択リストは、中間のテーブルのどの を実際に出力するかを決めます。

7.3.1. 選択リスト項目

テーブル式が生成するすべての列を出力する * が最も簡単な選択リストです。 そうでなければ、選択リストは、カンマで区切られた( 項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 ...

項7.2.2 も参照してください。)

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

7.3.2. 列ラベル

選択リスト中の項目は、 ORDER BY 句の中での参照、もしくはクライアントアプリケーションによる表示に使うように、それに続く処理のために名前を割り当てることができます。 例を示します。

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

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

AS キーワードは省略することができますが、新規列名が PostgreSQL キーワード( 付録C を参照)のいかなるものとも一致しない場合のみです。 あるキーワードと予測外の一致を防ぐために、列名を二重引用符で囲むことができます。 例えば、 VALUE はキーワードですのでうまく動作しません。

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

しかしこれは動きます。

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

ありえそうな将来のキーワードの追加に対応するため、 AS を記述するか、出力列名を二重引用符で囲むかのいずれかを推奨します。

注意: ここでの出力列の名前は、 FROM 句( 項7.2.1.2 を参照)で示したものとは異なります。 同じ列の名前を2度変更することができますが、渡されるのは選択リストの中で割り当てられたものです。

7.3.3. 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 句はしばしば非常に便利な代案となります。


powered by SEO.CUG.NET