全選択

全選択 (fullselect) は、select ステートメント、 INSERT ステートメント、および CREATE VIEW ステートメントのコンポーネントの 1 つです。 また、これはステートメントのコンポーネントである、特定の述部のコンポーネントともなります。

述部のコンポーネントである全選択は、副照会 (subquery) と呼ばれ、 括弧で囲んだ全選択 (fullselect) も、副照会と呼ばれることがあります。
Read syntax diagramSkip visual syntax diagramsubselect(fullselect)values-clauseUNIONUNION ALLEXCEPTEXCEPT ALLINTERSECTINTERSECT ALLsubselect(fullselect)values-clause order-by-clause offset-clause fetch-clause isolation-clause
values-clause
Read syntax diagramSkip visual syntax diagramVALUES,values-row
values-row
Read syntax diagramSkip visual syntax diagramexpressionNULLrow-expression(,expressionNULL)

セット演算子である UNION、EXCEPT、および INTERSECT は、 関係演算子の合併、差、積に対応しています。

全選択は結果表を指定します。 セット演算子を使用しない全選択の結果は、 指定した副選択または VALUES 節の結果になります。

『SQL 照会』の許可セクションでは、全選択 の許可について取り上げられています。

VALUES 文節
結果表の行の各列ごとに式または行式を使用して実際の値を指定することによって、結果表を派生させます。 複数の行を指定することができます。 複数の行を指定する場合は、DEFAULT および UNASSIGNED の拡張標識変数の値は使用できません (SQLSTATE 22539)。 values-clause 内の式の結果タイプを、行タイプにすることはできません (SQLSTATE 428H2)。

NULL は、単一の列結果表の列値あるいは row-expression の中の値として、複数の values-row でのみ使用することができ、同一列の少なくとも 1 行は NULL 以外でなければなりません (SQLSTATE 42608)。

Values-row は以下によって指定されます。
  • 結果表の単一の列についての単一の式
  • コンマで区切った n 個の式 (または NULL) を括弧で囲んだもの (n は結果表の列の数、または複数の列結果表の行式)

複数行からなる Values-clause には、 各 Values-row に同数の列が必要です (SQLSTATE 42826)。

以下の例に、Values-clause とその意味を示します。
   VALUES (1),(2),(3)          - 3 rows of 1 column
   VALUES 1, 2, 3              - 3 rows of 1 column
   VALUES (1, 2, 3)            - 1 row of 3 columns
   VALUES (1,21),(2,22),(3,23) - 3 rows of 2 columns
values-clause は、n 個の指定の values-row RE1 から REn (n は 2 以上) で構成され、以下と同等です。
   RE1 UNION ALL RE2 ... UNION ALL REn

これは、各 Values-row に対応する列は比較可能でなければなりません (SQLSTATE 42825)。

UNION または UNION ALL
2 つの結果表 (R1 と R2) を組み合わせて、新たな結果表を導きます。 UNION ALL を指定すると、結果は R1 と R2 のすべての行から構成されるものになります。 ALL オプションなしで UNION を指定すると、 結果は R1 または R2 のいずれかの行すべての集合から、 重複行を除去したものになります。 しかしいずれにしても、UNION 表の各行は R1 か R2 のどちらかから取られた行です。
EXCEPT または EXCEPT ALL
2 つの結果表 (R1 と R2) を組み合わせて、新たな結果表を導きます。 EXCEPT ALL を指定すると、結果は、重複行の数を勘定に入れつつ、 R2 の中に対応する行のないすべての行で構成されるものになります。 ALL オプションなしで EXCEPT を指定すると、結果は、 それぞれの重複行を除去してから R1 にのみ存在する行を取り出したもので構成されます。

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

INTERSECT または INTERSECT ALL
2 つの結果表 (R1 と R2) を組み合わせて、新たな結果表を導きます。 INTERSECT ALL を指定すると、 結果は R1 と R2 の両方に入っている行すべてで構成されるものになります。 ALL オプションなしで INTERSECT を指定すると、 結果は、R1 と R2 の両方にある行すべての集合から重複行を除去したものになります。

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

セット演算を使用すると、重複行の除去は R1 と R2 のマスクされていない値に基づいて行われます。 すべての行は R1 または R2 から得られたものであるため、以下の状態が 1 つ以上生じると、セット演算の結果表の出力値が変わる可能性があります。
  • R1 の n 番目の列に対応する式は列マスクがある列を参照しているが、R2 の n 番目の列に対応する式はそれを参照していない。 その逆も同じである。
  • R1 と R2 の n 番目の列に対応する式が、異なる列マスクがある列を参照している。
  • 列マスクの定義対象と同じターゲット列ではない列を列マスク定義が参照し、それらの参照列がセット演算の一部ではない。 列マスク定義ではターゲット表の他の列を参照しないようにすることをお勧めします。

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

order-by-clause
order-by-clauseの詳細については、 副選択 を参照してください。 ORDER BY 節の入った全選択は、以下では指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
注: 全選択の ORDER BY 節は、照会によって戻される行の順序には影響しません。 ORDER BY 節は、最外部の全選択で指定した場合に限り、戻される行の順序に影響を与えます。 offset-clause または fetch-clause を指定する場合は、全選択から戻される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。
オフセット文節
offset-clauseの詳細については、 副選択 を参照してください。 以下の場合は、OFFSET 節を組み込んだ全選択を指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
フェッチ節
fetch-clauseの詳細については、 副選択 を参照してください。 以下の場合は、FETCH 節を組み込んだ全選択を指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
ISOLATION 文節
isolation-clauseの詳細については、 副選択 を参照してください。 全選択に isolation-clause が指定され、全選択の副選択にも等しく適用できる場合、isolation-clause は全選択に適用されます。 例えば、以下の照会を考慮してください。
   SELECT NAME FROM PRODUCT
   UNION
   SELECT NAME FROM CATALOG
   WITH UR
分離節 WITH UR が副選択 SELECT NAME FROM CATALOG のみに適用できる場合でも、全選択の全体に適用されます。

結果表 R1 の中の列の数と R2 の中の列の数は、 同じでなければなりません (SQLSTATE 42826)。 ALL キーワードを指定していない場合、CLOB、DBCLOB のデータ・タイプ、BLOB のデータ・タイプ、これらの型の特殊タイプ、または構造化タイプを持つ列を R1 および R2 に組み入れることはできません (SQLSTATE 42907)。

R1 の n 番目の列に名前が付いている場合、その名前が結果表の n 番目の列の列名になります。 そうでない場合、結果表の n 番目の列には名前が付きません。 全選択を select ステートメントとして使用する場合は、ステートメントが記述される際に、生成された名前が設定されます。 生成された名前は、ORDER BY 節や UPDATE 節といった SQL ステートメントの他の部分に使用できません。 生成された名前を調べるには、SQL ステートメントの DESCRIBE を実行して、 SQLNAME フィールドを参照します。

重複した行: 2 つの行が重複していると言えるのは、 最初の行の各値が 2 番目の行の対応する値に等しい場合です。 重複を判別する場合、2 つの NULL 値は等しいものと見なされ、同じ数値の 2 つの 10 進浮動小数点表記は等しいものと見なされます。 例えば、2.00 と 2.0 とは同じ値を持っています (2.00 と 2.0 は等しいものとして比較される) が、異なる指数を持っていて、2.00 と 2.0 の両方の表記が可能になります。 したがって、例えば、UNION 演算の結果表に 10 進浮動小数点列と、同じ数値の複数の表記が存在する場合、戻されるもの (例えば 2.00 か 2.0 か) は予測不能です。 詳しくは、 数値の比較を参照してください。

複数の演算を 1 つの式の中に結合した場合は、括弧内の演算が先に実行されます。 括弧がない場合、演算は左から右に実行されますが、例外として、 すべての INTERSECT 演算は UNION または EXCEPT の演算の前に実行されます。

次の例では、表 R1 と R2 の値を左端に示しています。 他にリストされている見出しは、R1 と R2 の種々のセット演算の結果の値を示しています。

R1 R2 UNION ALL UNION EXCEPT ALL EXCEPT INTER- SECT ALL INTER- SECT
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