SELECT コマンドは、表やビューから行を取り出します。指定した基準 (WHERE 条件を含む) を満たす行を戻します。WHERE 条件を省略した場合、SELECT コマンドはすべての行から選択します。
SELECT [ DISTINCT | ALL ] [ * | <col> [ AS <output_name> ]
<expression> [ AS <output_name> ] [,<expression> [ AS <output_name> ]…]
[ FROM <from_item>[,<from_item>…] ]
[ WHERE <condition> ]
[ GROUP BY <expression>[,<expression>…] ]
[ HAVING <condition>[,<condition>…] ]
[ { UNION | INTERSECT | EXCEPT | MINUS }[ DISTINCT | ALL ]
SELECT
[ ORDER BY <expression> [ ASC | DESC | USING <operator>
[NULLS {FIRST | LAST}][, …] ]
[ LIMIT { <count> | ALL } ]
<table>
[ [ AS ] <alias> [ ( <column_alias_list> ) ] ] |
( <select> ) [ AS ] <alias> [ ( <column_alias_list> ) ] |
<from_item> [ NATURAL ] <join_type> <from_item>
[ ON <join_condition> | USING ( <join_column_list> ) ]
SELECT コマンドの入力は以下のとおりです。
| 入力 | 説明 |
|---|---|
| 別名 | 前述の表の名前の代替名を指定します。別名は、省略の目的または自己結合 (同じ表が複数回スキャンされる) の際の不明瞭さを避けるために使用します。別名を記述する場合、列別名のリストを記述して、表の複数の列に対して代替名を提供することができます。 |
| <col> | 列の名前。 |
| <output_name> | 対象列に対して出力で与えられる名前。
通常、この名前を列に指定して表示用に使用します。また、ORDER BY 節と GROUP BY 節にある列値を参照するときにも使用できます。 WHERE 節でも HAVING 節でもこの名前は使用できません。代わりに式を書く必要 があります。 |
| <expression> | 表の列名または式。 |
| FROM | FROM 節は、1 つまたは複数のソース表を SELECT コマンドに対して指定します。複数のソースを指定する場合、結果は、すべてのソースのすべての行のデカルト積になります。通常は、限定条件を追加してシステムから返される行を制限し、デカルト積を小さくします。 subselect コマンドを FROM 節内で括弧に入れることができます。subselect コマンドの使用は、単一の照会内で複数レベルのグループ化、集約、またはソートを実現するための唯一の方法です。 subselect コマンドの別名を指定する必要があります。 FROM 項目として、より単純な 2 つの from 項目を結合する join 節を使用できます。入れ子構造の順序を決定する必要がある場合には、括弧を使用してください。 |
| <from_item> | table reference 節、subselect 節、または join 節。 |
| WHERE | この節の一般形式は次のとおりです。
この節の boolean_expr の部分は、ブール値を生成する任意の式で構成できます。
多くの場合、次のような式を使用します。
説明:
|
| GROUP BY | この節は、1 つ以上の値と一致する行のグループに表を分割するために使用します。
この節では、節を適用して派生するグループ化表を次のように指定します。
GROUP BY 節は、グループ化された列において値を共有する行をすべて選択し、1 つの行にまとめます。 システムは、各グループを構成するすべての行において集約関数を計算し、グループごとに別々の値を生成します。GROUP BY を使用しない場合は、集約の結果、選択されたすべての行で計算される単一の値が生成されます。 GROUP BY 節を含める場合、SELECT コマンドの出力式は、集約関数内を除き、グループ化を解除された列を参照できません。これは、グループ化を解除された列に対しては複数の値が返される可能性があるためです。 group by には、以下の指定ができます。
|
| HAVING | HAVING 節 (オプション) の一般形式は次のとおりです。
where boolean_expr は、where 節での指定と同じです。HAVING 節は、boolean_expr を満たさない行を除外することによって導かれたグループ化表を指定します。 HAVING 節は、以下の点が WHERE 節と異なります。
boolean_expr で参照される各列は、あいまいさがないようにグループ化列を参照する必要があります (ただし、その参照が集約関数内に表示される場合を除きます)。 グループ化する select においては、HAVING 節は 1 つのグループ内の一価式しか参照できません。すなわち、グループ・フィールドまたは集約 (定数を含む必要あり) から導出されたグループ・フィールド、集約、または一価式しか参照できません。 例えば、メンバーが
4 より多い grp と grp のカウントを返すには、次のようにします。
グループ化しない select、すなわち、概念的にはゼロ個のグループ・フィールドでグループ化する select においては、一価の集約または式のみを参照できます。 例えば、emp の従業員数が 4 人以下の場合には行を返さず、emp の従業員数が 5 人以上の場合にはそのカウントを含む 1 行を返すには、次のようにします。
|
| <condition> | true または false の結果を返すブール式。 |
| UNION | Operator を指定すると、システムは照会によって返された行の集合を計算します。ALL キーワードを指定しない限り、行の重複は取り除かれます。
ここで、table_query には、ORDER BY 節、FOR UPDATE 節、または LIMIT 節を持たない任意の select 式を指定します。部分式を括弧で囲む場合、ORDER BY 節および LIMIT 節を含めることができます。括弧を使用しない場合、これらの節は、その右側の入力式ではなく、union の結果に適用されます。 UNION operator では、呼び出された照会によって返された行の集合 (set union) を計算します。union の直接オペランドを表す 2 つの select は、列数が同じで、しかも対応する列のデータ型に互換性がなければなりません。 ALL オプションを指定しない限り、UNION の結果には行の重複は含まれません。ALL オプションを指定すると、重複の除去は行われません。 同じ SELECT コマンドにある複数の UNION 演算子は、左から右に評価されます (括弧を使って別の方法を指定することも可能)。 |
| INTERSECT | 2 つの照会の結果を組み合わせ、両方の照会に共通するすべての行を含む単一の結果が得られます。詳しくは、INTERSECT 演算 を参照してください。 |
| EXCEPT または MINUS | 2 つの照会の差を取り、最初の照会にのみ属する行が結果に含まれます。 詳しくは、EXCEPT 演算 を参照してください。 |
| ORDER BY | この節を使用すると、返される行を指定順序にソートすることができます。
ORDER BY 節は、次のようにできます。
この機能には制限があり、union 照会の結果に適用される ORDER BY 節では、式ではなく、出力列の名前または番号しか指定できない場合があります。 ORDER BY 節が単純な名前で、結果列名と入力列名の両方に一致する場合、ORDER BY 節はこの名前を結果列名と解釈します。 これは、同じ状況での GROUP BY 節の選択とは逆です。 昇順または降順のソート順序を指定できます。
Null データに対してソート順序を指定できます。
|
| LIMIT | 照会によって生成される行のサブセットを返します。
LIMIT パラメーターを指定する場合、ORDER BY パラメーターも指定してください。一緒に指定しないと、返される行のサブセットが不確定になり ます。 |
| <join_column_list> | 結合列のリスト。例えば、USING (a,b) と指定することは、ON left_table.a = right_table.a と ON left_table.b = right_table.b を指定することと同じです。 |
| <join_condition> | 限定条件。この条件は WHERE 条件に類似していますが、この join 節で結合される 2 つの from_items のみに適用される点が異なります。 |
| <join_type> | 以下のいずれかの結合の種類。
|
| <select> | SELECT コマンド。subselect は括弧で囲み、その別名を提供する必要があります。 FROM 節に subselect を含めると、この単一の select コマンドの実行中、subselect の動作は、subselect 出力が一時表として作成される場合と同じになります。 |
| <table> | FROM 節における表またはビューの名前。 |
| CROSS JOIN および INNER JOIN | 簡単なデカルト積を生成します。2 つの項目を FROM のトップレベルにリスト指定した場合に得られる結果と同じになります。
クロス結合と内部結合 (true) は等価です。限定によって削除される行はありません。 これらの結合タイプは 1 つの表記法にすぎません。 FROM 節および WHERE 節を使用して同じ結果を得ることができます。 |
| LEFT OUTER JOIN | 限定されたデカルト積 (すなわち、on 条件をパスするすべての行の組み合わせ) のすべての行と、on 条件をパスした行が右側になかった左側の表の各行のコピー 1 が返されます。
一致する行を判別する際には、結合の独自の on 条件または using 条件のみが考慮されます。 その後で、OUTER ON 条件または WHERE 条件が適用されます。 |
| RIGHT OUTER JOIN | 結合されたすべての行と、一致しなかった右側の行ごとに 1 行ずつ (左側が NULL で拡張) が返されます。
この結合タイプは単なる表記法に過ぎません。左と右の入力を切り替えることで、左外部結合に変換できます。 |
| FULL OUTER JOIN | 結合されたすべての行と、一致しなかった左側の行ごとに 1 行ずつ (右側が NULL で拡張) と、一致しなかった右側の行ごとに 1 行ずつ (左側が NULL で拡張) が返されます。
クロス結合以外のすべての結合タイプでは、以下のうちいずれか 1 つのみを記述する必要があります。
|
SELECT コマンドの出力は以下のとおりです。
| 出力 | 説明 |
|---|---|
| ROWS | 照会の結果として得られた行セット全体を返します。 |
| COUNT | 照会によって返された行数を返します。 |
admin ユーザー、表の所有者、またはこの表が定義されたデータベースかスキーマの所有者であるか、アカウントがこの表または Table オブジェクト・クラスに対する Select 特権を持っている必要があります。表の値 を読み取るための Select 特権を持っている必要があります。リリース 4.0 以降、外部表のデータを選択するには、 External Table クラスの Select 特権を持っている必要があります。
オブジェクト特権とオブジェクト・クラスについて詳しくは、 「IBM Netezza システム管理者ガイド」を参照してください。
MYDB.SCH1(USER)=> 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 Hours |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
MYDB.SCH1(USER)=> 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
MYDB.SCH1(USER)=> 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
MYDB.SCH1(USER)=> SELECT * FROM distributors ORDER BY name;
or
MYDB.SCH1(USER)=> 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
MYDB.SCH1(USER)=> SELECT distributors.name
FROM distributors
WHERE distributors.name LIKE 'W%';
UNION
SELECT actors.name
FROM actors
WHERE actors.name LIKE 'W%';
Walt Disney
Walter Matthau
Warner Bros.
Warren Beatty
Westward
Woody Allen
distinct 行のみが必要であるため、ALL キーワードは省略されています。