SELECT [ALL|DISTINCT [ON column] ] expression [ AS name ] [, ...] [ INTO [TEMP] [TABLE] new_table ] [ FROM table [alias ] [, ...] ] [ WHERE condition ] [ GROUP BY column [, ...] ] [ HAVING condition [, ...] ] [ { UNION [ALL] | INTERSECT | EXCEPT } select ] [ ORDER BY column [ ASC | DESC ] [, ...] ] [ FOR UPDATE [OF class_name...]] [ LIMIT count [OFFSET|, count]]
テーブルのカラム名または式。
カラムまたは式の別名を AS 句を使用して指定します。 name は WHERE 条 件の中では使用できません。しかし、関連する ORDER BY または GROUP BY 句では参照できます。
このセッションで一意となるテーブルが作成され、セッション終了 時に自動的に削除されます。
INTO TABLE 句が指定された場合、問い合わせの結果は指定された名 前の別のテーブルに保存されます。対象となる( new_table )テー ブルは、自動的に作成され、また、このコマンド実行前には存在して はいけません。より詳しくは SELECT INTO を参 照して下さい。
Note: CREATE TABLE AS 文もまた、select 文から新 しいテーブルを作成します。
FROM 句で参照される、既存テーブルの名前。
直前の table の 別名。簡潔にするため、もしくは、1 つのテーブル内での結合の際 のあいまいな部分を除去するために使用されます。
その結果として true または false を返すブール式。WHERE 句を参 照して下さい。
テーブルのカラム名。
ORDER BY 以外の全ての機能を持つ select 文。
SELECT は 1 つ以上のテーブルから行を返します。選 択の候補は、WHERE 条件を満たす行です。WHERE が省略された場合は全ての 行がその候補となります。
DISTINCT は選択したものから重複する行を全て除き ます。 DISTINCT ON column は指定カラム内の全ての重複を除きます。これは GROUP BY column の使用と同じことです。ALL は全ての候補となる行を、 重複したものも含めて返します。
GROUP BY 句により、1 つのテーブルを概念的なグループに分割すること ができます。( GROUP BY 句を参照して下さい。)
HAVING 句は、事前に指定された句によりグループ化されたテーブルの中 から取り除くべきグループを指定します。( HAVING 句を参照して下さい。)
ORDER BY 句により、ユーザが望むように行を順方向(ASC)、または逆 方向(DESC)モード演算子にしたがって行をソートできます。( 後述の ORDER BY 句を参照して下さい。)
UNION 句により実行した問い合わせから返される行をまとめたものを結果 とすることができます。(後述の UNION 句を参照して下さい。)
INTERSECT は 2 つの問い合わせの共通部分となる行を返します。( 後述の INTERSECT 句を参照して下さい。)
EXCEPT は、上側の問い合わせにあり、下側の問い合わせにない行を返 します。( 後述の EXCEPT 句を参照して下さい。)
FOR UPDATE 句により、この SELECT 文で選ばれた行を排他的ロックで きます。(後述の EXCEPT 句を参照して下さい。) (訳注: See EXCEPT clause は間違いと思われます。)
LIMIT...OFFSET 句により、問い合わせで返される行を抑制することが できます。
テーブルから値を読みとるためにそのテーブルに SELECT 権限を持って いる必要があります。
オプションである、WHERE 句は一般的に次の形式です。
WHERE expr ETER">ce"PARreplaceable> [ log_op ... ]ここで、cond_op は、 =、 <、 <=、 >、 >= 、<>、または、ALL、ANY、 IN、LIKE などといった条件演算子、ローカルに定義された演算子の内 の 1 つを指定できます。また、 log_opは、AND、OR、 NOT の内の 1 つです。比較は TRUE か FALSE を返し、もし式が FALSE と評価されたら、全インスタンスは廃棄されます。
GROUP BY は、ここで指定された句ごとにテーブルをグループ化します。
GROUP BY column [, ...]
GROUP BY はグループ化されたカラムにて同一値を持つ全ての行を 1 つの 行にまとめ、グループを構成する全ての行から導かれる値を集約します。 グループ化されず、集約されずに返されたカラムの値は、その行がデータ ベースから読みとられた順番に依存します。
オプションである、HAVING 条件は一般的に次の形式です。
HAVING cond_exprここで、cond_expr は WHERE 句で指定するものと同一です。
HAVING は、事前に指定された句によりグループ化されたテーブルの中か ら取り除くべき、つまり、 cond_expr に合わなか ったグループを指定します。
cond_expr で参照さ れる各カラムは、明瞭にグループ化されたカラムを参照します。
ORDER BY column [ ASC | DESC ] [, ...]
column には、カラム 名または序数を指定できます。
序数はカラムの位置を(左から右に数えた)順序で参照します。この機 能によって、適切な名前を持たないカラムを元に順番を定義することが できます。これは絶対に必要なものではありません。というのは、AS 句を下のように使えば、常に対象とするカラムに名前を割り当てること ができるからです。
SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen;
PostgreSQL のリリース 6.4 から、ORDER BY 句のカラムは SELECT 句 にある必要がなくなりました。従って、以下の文は、現在正当なもので す。
SELECT name FROM distributors ORDER BY code;
オプションとして、ORDER BY 句の各カラム名の後にキーワード DESC(逆方向)もしくは ASC(順方向)を付けることができます。 指定がなければ、デフォルトとして ASC がついているものとしま す。
table_query UNION [ ALL ] table_query [ ORDER BY column [ ASC | DESC ] [, ...] ]ここで、table_query は、ORDER BY 句を持たない任意の select 式を指定できます。
UNION 句によって、呼び出された問い合わせから返される行をまとめたも のを結果とすることができます。( UNION 句を参照して下さい。) UNION の直接の演算項目として指定された 2 つのテーブルは、同一のカラム数 でなければならず、また、その対応するカラムのデータ型には互換性がな ければなりません。
デフォルトでは、ALL 句が指定されていない限り、UNION の結果には重 複行を含みません。
1 つの SELECT 文内の複数の UNION 演算子は、左から右に評価されます。 キーワード ALL は当然グローバルなものではなく、現在の 2 つのテーブ ルの結果に対してのみ適用されます。
table_query INTERSECT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ]ここで、table_query は、ORDER BY 句を持たない任意の select 式を指定できます。
INTERSECT 句は、呼び出した問い合わせに共通する行全てを結果とする ことができます。INTERSECT の引数として直接指定された 2 つのテーブ ルは、同一のカラム数でなければならず、また、その対応するカラムの データ型には互換性がなければなりません。
1 つの SELECT 文内の複数の INTERSECT 演算子は、左から右に評価さ れます。
table_query EXCEPT table_query [ ORDER BY column [ ASC | DESC ] [, ...] ]ここで、table_query は、ORDER BY 句を持たない任意の select 式を指定できます。
EXCEPT 句は、下側の問い合わせの結果に無く上側の問い合わせの結果に ある行を結果とすることができます。EXCEPT の引数として直接指定され た 2 つのテーブルは、同一のカラム数でなければならず、また、その対 応するカラムのデータ型には互換性がなければなりません。
1 つの SELECT 文内の複数の EXCEPT 演算子は、左から右に評価されま す。
テーブル films に、テーブル distributors を結合します。
SELECT f.title, f.did, d.name, f.date_prod, f.kind FROM distributors d, films f WHERE f.did = d.did title |did|name | date_prod|kind -------------------------+---+----------------+----------+---------- The Third Man |101|British Lion |1949-12-23|Drama The African Queen |101|British Lion |1951-08-11|Romantic Une Femme est une Femme |102|Jean Luc Godard |1961-03-12|Romantic Vertigo |103|Paramount |1958-11-14|Action Becket |103|Paramount |1964-02-03|Drama 48 Hrs |103|Paramount |1982-10-22|Action War and Peace |104|Mosfilm |1967-02-12|Drama West Side Story |105|United Artists |1961-01-03|Musical Bananas |105|United Artists |1971-07-13|Comedy Yojimbo |106|Toho |1961-06-16|Drama There's a Girl in my Soup|107|Columbia |1970-06-11|Comedy Taxi Driver |107|Columbia |1975-05-15|Action Absence of Malice |107|Columbia |1981-11-15|Action Storia di una donna |108|Westward |1970-08-15|Romantic The King and I |109|20th Century Fox|1956-08-11|Musical Das Boot |110|Bavaria Atelier |1981-11-11|Drama Bed Knobs and Broomsticks|111|Walt Disney | |Musical
films からカラム len の総和を求め、その結果を kind でグループ化します。
SELECT kind, SUM(len) AS total FROM films GROUP BY kind; kind |total ----------+------ Action | 07:34 Comedy | 02:58 Drama | 14:28 Musical | 06:42 Romantic | 04:38
filmsからカラム len の総和を求め、その結果を kind でグループ化します。そして、総和が 5 時 間未満となるグループを示します。
SELECT kind, SUM(len) AS total FROM films GROUP BY kind HAVING SUM(len) < INTERVAL '5 hour'; kind |total ----------+------ Comedy | 02:58 Romantic | 04:38
以下の 2 つの例は、2 番目のカラム( name )の 内容にしたがって個々の結果をソートするという同一のものです。
SELECT * FROM distributors ORDER BY name; SELECT * FROM distributors ORDER BY 2; did|name ---+---------------- 109|20th Century Fox 110|Bavaria Atelier 101|British Lion 107|Columbia 102|Jean Luc Godard 113|Luso films 104|Mosfilm 103|Paramount 106|Toho 105|United Artists 111|Walt Disney 112|Warner Bros. 108|Westward
この例は、テーブル distributors と actors から W という文字から始まるもののみ抽出 した結果からなる union をどのように取得するのかを示したものです。
-- distributors: actors: -- did|name id|name -- ---+------------ --+-------------- -- 108|Westward 1|Woody Allen -- 111|Walt Disney 2|Warren Beatty -- 112|Warner Bros. 3|Walter Matthau -- ... ... SELECT distributors.name FROM distributors WHERE distributors.name LIKE 'W%' UNION SELECT actors.name FROM actors WHERE actors.name LIKE 'W%' name -------------- Walt Disney Walter Matthau Warner Bros. Warren Beatty Westward Woody Allen
Postgres では問い合わせから FROM 句を省略することができます。この機能は、 元々の PostQuel 問い合わせ言語から残っているものです。
SELECT distributors.* WHERE name = 'Westwood'; did|name ---+---------------- 108|Westward