全選択

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

述部のコンポーネントである全選択は、副照会 (subquery) と呼ばれ、 括弧で囲んだ全選択 (fullselect) も、副照会と呼ばれることがあります。
構文図を読む構文図をスキップするsubselect(fullselect)values-clauseUNIONUNION ALLEXCEPTEXCEPT ALLINTERSECTINTERSECT ALLsubselect(fullselect)values-clause order-by-clause offset-clausefetch-clause isolation-clause
values-clause
構文図を読む構文図をスキップするVALUES,values-row
values-row
構文図を読む構文図をスキップするexpressionNULLrow-expression(,expressionNULL)

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

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

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

values-clause
結果表の行の各列ごとに式または行式を使用して実際の値を指定することによって、結果表を派生させます。複数の行を指定することができます。 複数の行を指定する場合は、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)          - 1 つの列の 3 つの行
   VALUES 1, 2, 3              - 1 つの列の 3 つの行
   VALUES (1, 2, 3)            - 3 つの列の 1 つの行
   VALUES (1,21),(2,22),(3,23) - 2 つの列の 3 つの行
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 のどちらかから取られた行です。

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

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

例えば、R1 の行はマスクされた値から派生し、R2 の行はマスクされていない値から派生します。結果表の行が R1 からのものである場合、マスク値が戻されます。結果表の行が R2 からのものである場合、マスクされない値が戻されます。

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

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

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

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

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

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

order-by-clause
order-by-clause について詳しくは、副選択を参照してください。ORDER BY 節の入った全選択は、以下では指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
注: 全選択内の ORDER BY 節は、照会によって戻される行の順序には影響を与えません。ORDER BY 節は、最外部の全選択で指定した場合に限り、戻される行の順序に影響を与えます。 offset-clause または fetch-clause を指定する場合は、全選択から戻される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。
offset-clause
offset-clause の詳細については、副選択を参照してください。以下の場合は、OFFSET 節を組み込んだ全選択を指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
fetch-clause
fetch-clause について詳しくは、副選択を参照してください。以下の場合は、FETCH 節を組み込んだ全選択を指定できません (SQLSTATE 428FJ)。
  • マテリアライズ照会表
  • ビューの最外部の全選択
isolation-clause
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