IBM PureData System for Analytics, バージョン 7.1

SELECT (行の取り出し用)

SELECT コマンドは、表やビューから行を取り出します。指定した基準 (WHERE 条件を含む) を満たす行を戻します。WHERE 条件を省略した場合、SELECT コマンドはすべての行から選択します。

注: IBM® Netezza® ホストでストアード・プロシージャーを開始するために SELECT コマン ドを使用する方法については、SELECTを参照してください。
システムは、選択された各行の select 出力式を計算することによって、出力行を構成します。
  • 出力リストで * を使用することにより、選択された行のすべての列を含むことを省略形で示すことができます。また、<table>.* という表記を使用して、特定の表から取得される各列を省略形で表す こともできます。表の照会 では、SELECT コマンド内で使用できる関数について説明しています。
  • distinct キーワードを使用すると、結果から重複する行を除外できます。all キーワード (デフォルト) は、重複も含め、候補の行をすべて返します。

構文

表またはビューの行を取り出すために 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 } ]
ここで、<from_item> は、以下を表します。
<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 コマンドの入力は以下のとおりです。

表 1. 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 この節の一般形式は次のとおりです。
WHERE boolean_expr
この節の boolean_expr の部分は、ブール値を生成する任意の式で構成できます。 多くの場合、次のような式を使用します。
expr cond_op expr
or 
log_op expr
説明:
  • cond_op には、=、<、<=、>、>= または <>、条件演算子 (all、any、in、like など)、またはローカル定義の演算子から 1 つを使用できます。
  • log_op は、and、or、not のいずれかです。 select では、WHERE 条件が true を返さない行はすべて無視されます。
GROUP BY この節は、1 つ以上の値と一致する行のグループに表を分割するために使用します。 この節では、節を適用して派生するグループ化表を次のように指定します。
GROUP BY <expression>[,<expression>…]

GROUP BY 節は、グループ化された列において値を共有する行をすべて選択し、1 つの行にまとめます。 システムは、各グループを構成するすべての行において集約関数を計算し、グループごとに別々の値を生成します。GROUP BY を使用しない場合は、集約の結果、選択されたすべての行で計算される単一の値が生成されます。 GROUP BY 節を含める場合、SELECT コマンドの出力式は、集約関数内を除き、グループ化を解除された列を参照できません。これは、グループ化を解除された列に対しては複数の値が返される可能性があるためです。

group by には、以下の指定ができます。
  • 入力列名
  • 出力列 (select 式) の名前または序数
  • 入力列値から形成される任意の式。あいまいな場合、group by name が出力列名ではなく入力列名と解釈されます。
HAVING HAVING 節 (オプション) の一般形式は次のとおりです。
HAVING boolean_expr
where boolean_expr は、where 節での指定と同じです。

HAVING 節は、boolean_expr を満たさない行を除外することによって導かれたグループ化表を指定します。

HAVING 節は、以下の点が WHERE 節と異なります。
  • WHERE 節では、GROUP BY を適用する前に個々の行をフィルタリングします。
  • HAVING 節では、GROUP BY によって作成されるグループ行をフィルタリングします。

boolean_expr で参照される各列は、あいまいさがないようにグループ化列を参照する必要があります (ただし、その参照が集約関数内に表示される場合を除きます)。

グループ化する select においては、HAVING 節は 1 つのグループ内の一価式しか参照できません。すなわち、グループ・フィールドまたは集約 (定数を含む必要あり) から導出されたグループ・フィールド、集約、または一価式しか参照できません。

例えば、メンバーが 4 より多い grp と grp のカウントを返すには、次のようにします。
SELECT grp, count(id) AS n FROM emp GROUP BY grp HAVING n > 4

グループ化しない select、すなわち、概念的にはゼロ個のグループ・フィールドでグループ化する select においては、一価の集約または式のみを参照できます。

例えば、emp の従業員数が 4 人以下の場合には行を返さず、emp の従業員数が 5 人以上の場合にはそのカウントを含む 1 行を返すには、次のようにします。
SELECT count(id) AS n FROM emp HAVING n > 4
<condition> true または false の結果を返すブール式。
UNION Operator を指定すると、システムは照会によって返された行の集合を計算します。ALL キーワードを指定しない限り、行の重複は取り除かれます。
table_query UNION [ ALL ] table_query
[ ORDER BY <expression> [ASC|DESC|USING operator] [, …] ]
[ LIMIT { COUNT | ALL } ]
[ OFFSET start ]
ここで、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 節は、次のようにできます。
  • 出力列 (select 式) の名前または序数序数は、結果列の順序位置 (左から右) を参照します。この機能により、名前を持たない列があっても、その列に基づいて順序を定義できます。例:
    SELECT title, date_prod + 1 AS newlen
      FROM films ORDER BY newlen;
  • select 結果リストに表示されないフィールドを含む、入力列値から形成される任意の式。次に例を示します。
    SELECT name FROM distributors ORDER BY code;
    あいまいな場合は、ORDER BY の名前 は出力列名と解釈されます。

この機能には制限があり、union 照会の結果に適用される ORDER BY 節では、式ではなく、出力列の名前または番号しか指定できない場合があります。

ORDER BY 節が単純な名前で、結果列名と入力列名の両方に一致する場合、ORDER BY 節はこの名前を結果列名と解釈します。 これは、同じ状況での GROUP BY 節の選択とは逆です。

昇順または降順のソート順序を指定できます。
ASC
昇順でソートします。これは、< を使用する場合と同じです。これがデフォルトです。
DESC
降順でソートします。これは、> を使用する場合と同じです。
Null データに対してソート順序を指定できます。
NULLS FIRST
NULL 値は、NULL 以外の値より前に置かれます。昇順ソートの場合、出力で NULL が最初に表示されます。降順ソートの場合には、最後に表示されます。これがデフォルトです。
NULLS LAST
NULL 値は、NULL 以外の値の後に配置されます。
LIMIT 照会によって生成される行のサブセットを返します。
<count>
指定された数以下の行を返します。
ALL
すべての行を返します。これはデフォルトです。

LIMIT パラメーターを指定する場合、ORDER BY パラメーターも指定してください。一緒に指定しないと、返される行のサブセットが不確定になり ます。

<join_column_list> 結合列のリスト。例えば、USING (a,b) と指定することは、ON left_table.a = right_table.aON left_table.b = right_table.b を指定することと同じです。
<join_condition> 限定条件。この条件は WHERE 条件に類似していますが、この join 節で結合される 2 つの from_items のみに適用される点が異なります。
<join_type> 以下のいずれかの結合の種類。
  • [inner] 結合
  • 左 [outer] 結合
  • 右 [outer] 結合
  • 全 [outer] 結合
  • クロス結合
内部結合または外部結合タイプの場合、以下のいずれかの節を 1 つだけ含める必要があります。
  • NATURAL
  • ON <join_condition>
  • USING (<join_column_list>)
クロス結合の場合には、これらの節を含めないでください。
<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 つのみを記述する必要があります。
ON <join_condition>
最も一般的です。結合する 2 つの表を含む限定式を記すことができます。
USING <join_column_list>
例えば、USING (a,b) と指定することは、ON left_table.a = right_table.aON left_table.b = right_table.b を指定することと同じです。用語 USING は、結合出力において等価列の各ペアの 1 つのみを含め、両方は含めないことを意味します。
NATURAL
表で名前が類似するすべての列に言及する USING リストを使用します。

出力

SELECT コマンドの出力は以下のとおりです。

表 2. SELECT の出力
出力 説明
ROWS 照会の結果として得られた行セット全体を返します。
COUNT 照会によって返された行数を返します。

特権

admin ユーザー、表の所有者、またはこの表が定義されたデータベースかスキーマの所有者であるか、アカウントがこの表または Table オブジェクト・クラスに対する Select 特権を持っている必要があります。表の値 を読み取るための Select 特権を持っている必要があります。リリース 4.0 以降、外部表のデータを選択するには、 External Table クラスの Select 特権を持っている必要があります。

オブジェクト特権とオブジェクト・クラスについて詳しくは、 「IBM Netezza システム管理者ガイド」を参照してください。

使用方法

以下に使用例を示します。
  • films と表 distributors を結合します。
    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
  • すべての films の len 列の総和を求め、kind 別に結果をグループ化します。
    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
  • すべての films の len 列の総和を求め、kind 別に結果をグループ化し、それらのグループ合計が 5 時間未満のグループを表示します。
    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
  • distributors の内容を 2 番目の列 (name) の内容に応じてソートします。
    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
  • distributors と表 actors の union を取得し、その結果を文字 W で始まる結果に限定します。
    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 キーワードは省略されています。



フィードバック | Copyright IBM Corporation 2014 | 最終更新日: 2014-02-28