全選択

フルセレクトは 、SELECT文、マテリアライズド・クエリ・テーブルの定義のためのALTER TABLE文、CREATE TABLE文、CREATE VIEW文、DECLARE GLOBAL TEMPORARY TABLE文、INSERT文、UPDATE文、およびMERGE文の構成要素です。

フルセレクトの承認

問い合わせの承認を参照してください。

フルセレクトの構文

構文図を参照するビジュアルシンタックスダイアグラムをスキップする副選択( 全選択)values-clause1UNIONEXCEPTINTERSECTDISTINCTALL副選択( 全選択)order-by-clauseoffset-clausefetch-clause
values-clause
構文図を参照するビジュアルシンタックスダイアグラムをスキップする VALUES sequence-reference(, sequence-reference)
注:
  • 1 values-clauseが指定されている場合、UNION、EXCEPT、INTERSECT、 order-by-clause、または fetch-clauseも指定してはならない。 fullselectに values-clauseが含まれている場合、fullselectは、PREPARE文の statement-nameで参照される select-statementでのみ指定されなければならない。

説明

括弧で囲まれた全選択は、副照会と呼ばれます。 例えば、副照会は検索条件の中で使用できます。

スカラー全選択 とは全選択の一種であり、括弧で囲 まれ、単一結果行と単一結果列を戻します。 全選択の結果となる行が何もない場合は、NULL 値が戻されます。 結果に複数の行がある場合は、エラーが返されます。 例えば、DELETE ステートメント、UPDATE ステートメント、および MERGE ステートメントの代入節でスカラー全選択を使用できます。

行全選択は、単一行を戻す全選択です。 結果に複数の行がある場合は、エラーが返されます。 例えば、DELETE ステートメントおよび UPDATE ステートメントの代入節で行全選択を使用できます。

UNIONEXCEPTまたは INTERSECT
セット演算子、UNION、EXCEPT、および INTERSECT は、関係演算子の結合、差、および論理積に対応します。 全選択 は結果表を指定します。 セット演算子が使用されていない場合、全選択の結果は、指定された副選択の結果となります。 セット演算子が使用されている場合は、結果表は、指定されたセット演算子に従って他の 2 つの結果表 (R1 と R2) の組み合わせから導き出されます。
UNION DISTINCT または UNION ALL
UNION ALL を指定すると、結果は R1 と R2 のすべての行から構成されるものになります。 UNION DISTINCT を使用すると、結果は R1 または R2 のいずれかの中の全行の集合から、冗長な重複行を除去したものになります。 いずれの場合も、UNION の結果表の各行は R1 の行または R2 の行のどちらかから取り出された行です。

R1 および R2 内の n 番目の列に対応する式は、列マスクがある列を参照できます。 和集合の結果の n 番目の列は、R1 または R2 のマスクされた値から導き出すことができます。

UNION DISTINCT を使用すると、R1 と R2 の重複行の除去はマスクされない値に基づいて行われます。 すべての行は R1 または R2 から得られたものであるため、以下の状態が 1 つ以上生じると、和集合の結果表の出力値が変わる可能性があります。

  • R1 の n 番目の列に対応する式は列マスクがある列を参照しているが、R2 の n 番目の列に対応する式はそれを参照していない (またはその逆)。
  • R1 と R2 の n 番目の列に対応する式が、異なる列マスクがある列を参照している。
  • 列マスク定義が、列マスクの定義対象と同じターゲット列ではない列を参照し、それらの列が UNION DISTINCT 操作の一部ではない。 列マスク定義ではターゲット表の他の列を参照しないようにすることをお勧めします。

例えば、R1 の行はマスクされた値から導き出され、R2 の行はマスクされていない値から導き出されます。 結果表の行が R1 から得られたものである場合は、マスクされた値が返されます。 結果表の行が R2 から得られたものである場合は、マスクされていない値が返されます。

EXCEPTおよびINTERSECTの R1 および R2 の行が列マスクのある列を参照していない場合、EXCEPTおよびINTERSECTをUNIONと混在させることができます。

他の SQL インプリメンテーションとの互換性のため、DISTINCT の同義語として UNIQUE を指定できます。

EXCEPT DISTINCT または EXCEPT ALL
EXCEPT ALL を指定した場合の結果は、R1 のすべての行 (意味のある冗長な重複行を含む) から構成されます。 EXCEPT DISTINCT を指定すると、その結果は、R1 にのみ存在するすべての行 (冗長な重複行を除く) から構成されます。 いずれの場合も、DIFFERENCE の結果表の各行は、R1 に存在するが R2 には存在しない行です。

最終結果表を派生するために使用されるセット演算子のいずれかが EXCEPT ALL または EXCEPT DISTINCT である場合、列マスクはセット演算の最終結果表を派生させる選択リストには適用できません。

他の SQL インプリメンテーションとの互換性のため、EXCEPT のシノニムとして MINUS を指定し、DISTINCT のシノニムとして UNIQUE を指定できます。

INTERSECT DISTINCT または INTERSECT ALL
INTERSECT ALL を指定した場合の結果は、R1 と R2 両方のすべての行 (意味のある冗長な重複行を含む) から構成されます。 INTERSECT DISTINCT を使用すると、その結果は、R1 と R2 両方に存在するすべての行 (冗長な重複行を除く) から構成されます。 いずれの場合も、INTERSECTION の結果表の行はそれぞれ R1 と R2 両方に存在する行です。

最終結果表を派生するために使用されるセット演算子のいずれかが INTERSECT ALL または INTERSECT DISTINCT である場合、列マスクはセット演算の最終結果表を派生させる選択リストには適用できません。

他の SQL インプリメンテーションとの互換性のため、DISTINCT の同義語として UNIQUE を指定できます。

values-clause
結果表の行の列ごとにシーケンス式を使用して実際の値を指定することによって、結果表を派生させます。

values-clause は以下によって指定されます。

  • 単一列の結果表に対する単一のシーケンス式。
  • 括弧で囲んだ n 個のシーケンス式 (コンマで区切り)。 n は結果表内の列数です。

values-clause 内のすべての結果列には名前が付けられません。

変更の開始values-clauseは、PREPARE文のselect-statement の外側のfullselect のみで指定する必要があります。 変更の終わり

変更の開始順序指定節変更の終わり
変更の開始FL 500 order-by 句の詳細については、 サブセレクトを参照してください。 order-by-clause を含む全選択は、以下のコンテキストで指定することはできません。
  • ビューの最外部の全選択
    注意 : SELECT 内の ORDER BY 節は、クエリが返す行の順序に影響しない場合があります。 ORDER BY 文節は最外部の全選択で指定された場合に、照会で戻される行の順序のみに影響します。 offset-clause または fetch-clause を指定する場合は、全選択から戻される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。
  • SQL 表関数の RETURN ステートメントの外部全選択
変更の終わり
変更の開始オフセット条項変更の終わり
変更の開始FL 500 offset-clause の詳細については offset-clause を参照してください。 offset-clause を含む全選択は、以下のコンテキストで指定することはできません。
  • ビューの定義
  • マテリアライズ照会表の定義
  • SQL 表関数の RETURN ステートメント
  • 行の許可の定義
  • 列マスクの定義
  • SENSITIVE DYNAMIC カーソルの最外部の全選択
変更の終わり
変更の開始取得節変更の終わり
変更の開始FL 500 fetch-clause の詳細については、 fetch-clause を参照してください。 fetch-clause を含む全選択は、以下のコンテキストで指定することはできません。
  • マテリアライズ照会表の定義
  • ビューの定義の最外部の全選択
  • SQL 表関数の RETURN ステートメントの外部全選択
  • SENSITIVE DYNAMIC カーソルの最外部の全選択
変更の終わり
列の規則
  • R1 と R2 は同じ数の列を持っていなければなりません。また、 R1 の n 番目の列のデータ・タイプに、R2 の n 番目の列のデータ・タイプと互換性がなければなりません。
  • セット演算子の結果の n 番目の列は、R1 および R2 の n 番目の列から派生します。 結果列の属性は、結果列の規則を使用して決定されます。
  • R1 と R2 には、CLOB、BLOB、DBCLOB、XML データ・タイプの列、またはこれらのタイプのいずれかに基づく特殊タイプの列を含めることはできません。 ただし、この規則は、UNION ALL がセット演算子で使用される場合には適用されません。
  • R1 の n 番目の列と R2 の n 番目の列が同じ結果列名である場合、セット演算の結果表の n 番目の列も 同じ結果列名となります。 それ以外の場合は、セット演算の結果表の n 番目の列は名前が付けられません。
  • セット演算子が指定されている場合には、修飾列名を ORDER BY 文節で使用することはできません。

オペランド列の有効な組み合わせと結果列のデータ型に関する情報は、「結果データ型のルール」 を参照してください。

重複行

最初の行の各列の値が 2 番目の行の対応する値と等しい場合、2 つの行は重複しています。 重複の判別にあたっては、2 つの NULL 値は等しいものと見なされます。

DECFLOAT データ・タイプは、同じ数値の複数のビット表記を可能にします。 例えば、2.00 と 2.0 は同じ係数の 2 つの数値ですが、その指数値は異なります。 詳細は、 数値比較のセクションをご覧ください。 よって、UNION の結果表に DECFLOAT 列が含まれ、同じ数値の複数のビット表記が存在する場合、戻される値は予測不能です。

演算子優先順位
複数のセット演算を 1 つの式に結合すると、括弧内のセット演算が最初に実行されます。 括弧によって順序を指定していない場合、セット演算は左から右に行われますが、例外として、すべての INTERSECT 演算は UNION 演算や EXCEPT 演算の前に実行されます。
セット演算子の結果
以下の表は、すべてのセット演算の結果を示しています。最初の 2 列は結果表 R1 および R2 の行、対応する列見出しの下の R1 および R2 に対する各演算の結果です。
表 1. 結果表 R1 および R2 の UNION、EXCEPT、および INTERSECT セット演算の例
R1 の行 R2 の行 UNION ALL の結果 UNION DISTINCT の結果 EXCEPT ALL の結果 EXCEPT DISTINCT の結果 INTERSECT ALL の結果 INTERSECT DISTINCT の結果
1 1 1 1 1 2 1 1
1 1 1 2 2 5 1 3
1 3 1 3 2   3 4
2 3 1 4 2   4  
2 3 1 5 4      
2 3 2   5      
3 4 2          
4   2          
4   3          
5   3          
    3          
    3          
    3          
    4          
    4          
    4          
    5          

全選択 の例

  • 例 1: 照会で結果表 R1 と R2 の合併 を指定したものとします。 R1 の列のデータ・タイプは CHAR(10)、サブタイプは BIT です。 R2 の対応する列の データ・タイプは CHAR(15)、サブタイプは SBCS です。 この場合、 合併した列のデータ・タイプは CHAR(15)、サブタイプは BIT です。 最初の列に入っていた値は、末尾ブランクを 5 つ付け加える ことにより、CHAR(15) に変換されます。

  • 例 2:

    DSN8C10.EMPのすべての行を表示します。

       SELECT * FROM DSN8C10.EMP;
  • 例 3: サンプル表 DSN8C10.EMP および DSN8C10.EMPPROJACT を使用して、次のいずれかの条件に該当するすべての従業員の従業員番号をリストします。

    • 部門番号が「D」で始まる。
    • プロジェクト番号が「AD」で始まるプロジェクトに割り当てられている。
       SELECT EMPNO FROM DSN8C10.EMP
         WHERE WORKDEPT LIKE 'D%'
         UNION
       SELECT EMPNO FROM DSN8C10.EMPPROJACT
         WHERE PROJNO LIKE 'AD%';

    結果は、2つの結果テーブルの結合です。1つはサンプルテーブルDSN8C10.EMP から形成され、もう1つはサンプルテーブルDSN8C10.EMPPROJACT から形成されます。 結果 (1 列の表) は従業員番号のリストです。 UNION ALL ではなく UNION を使ったため、リスト内の項目は すべて違ったものになります。 この代わりに UNION ALL を使うと、ある一定の従業員番号は リストに複数回現れることになります。 これらは、「D」で始まる部門の従業員で、 そのプロジェクトが「AD」で始まる人の番号です。

  • 例 4: 一連の結合を指定し、最終結果表の第 1 列に従って、結果を並べます。

    SELECT * FROM T1
    UNION
    SELECT * FROM T2
    UNION 
    SELECT * FROM T3
    ORDER BY 1;
  • 例 5 一連の結合を指定し、最終結果表の第 1 列に従って、結果を並べます。 最初の ORDER BY 文節は、結果表の第 1 列に従って、最初の結合の結果の行を並べます。 2 番目の ORDER BY 文節は、外部全選択の 一部として適用され、最終結果表の行が最終結果表の第 1 列に従って並べられます。

    (SELECT * FROM T1
     UNION 
     SELECT * FROM T2
     ORDER BY 1)
    UNION
    SELECT * FROM T3
    ORDER BY 1;
  • 例 6 表 T1 と T2 があり、それぞれに C1、C2 という名前の同じ数の列が含まれているものとします。 この例の EXCEPT 演算子は、表 T1 にはあるが T2 にはない行をすべて生成し、 重複行は除去します。

    (SELECT * FROM T1)
      EXCEPT DISTINCT 
    (SELECT * FROM T2);
  • 例 7: 表 T1 と T2 があり、それぞれに C1、C2 という名前の同じ数の列が含まれているものとします。 この例の INTERSECT 演算子は、表 T1 と表 T2 の両方にある行をすべて生成し、 重複行は除去します。

    (SELECT * FROM T1)
      INTERSECT DISTINCT 
    (SELECT * FROM T2);
  • 例 8: シーケンス MYSEQ1 の最も新しく生成された値を取得します。

    VALUES PREVIOUS VALUE FOR MYSEQ1;
  • 例 9: シーケンス MYSEQ1 において次に出現する値を取得します。
    VALUES NEXT VALUE FOR MYSEQ1;