SQLにおける集合演算は、複数のクエリの結果を単一の結果セットに結合することを可能にする演算の一種です。[ 1 ]
SQL の集合演算子にはUNION、、、、INTERSECTがありEXCEPT、これらは数学的には和集合、積集合、差集合の概念に対応します。
SQLでは、このUNION句は 2 つの SQL クエリの結果を、一致するすべての行を含む単一のテーブルに結合します。結合するには、2 つのクエリの結果が同じ列数と互換性のあるデータ型である必要があります。重複するレコードは、が使用されない限り自動的に削除されます。UNION ALL
UNIONテーブルが完全に正規化されていないデータウェアハウスアプリケーションで役立つことがあります。[ 2 ] 簡単な例としては、パフォーマンス上の理由から分離されているが同一の構造を持つテーブルとを持つデータベースが挙げられます。クエリは両方のテーブルの結果を組み合わせることができます。sales2005sales2006UNION
行の順序は保証されないことに注意してくださいUNION ALL。2番目のオペランドからの行は、1番目のオペランドからの行の前、後、または混在して表示される可能性があります。特定の順序が必要な場合は、ORDER BYを使用する必要があります。
これはUNION ALL通常のよりもはるかに高速になる可能性があることに注意してくださいUNION。
以下の2つの表を前提とします。
このステートメントを実行します:
SELECT * FROM sales2005 UNION SELECT * FROM sales2006 ;ORDER BY句が指定されていないため、行の順序は異なる場合がありますが、以下の結果セットが得られます。
ジョーについては、行が2つあります。これは、それらの行が列ごとに異なるためです。アレックスについては、行が1つしかありません。これは、それらの行が両方の列で異なるわけではないためです。
UNION ALL重複を削除しないため、異なる結果になります。このステートメントを実行すると次のようになります。
SELECT * FROM sales2005 UNION ALL SELECT * FROM sales2006 ;ステートメントの欠如によるばらつきを考慮すると、以下の結果が得られるでしょうORDER BY。
フル外部結合の説明には、 を使用する例も含まれていますUNION。
SQLINTERSECT演算子は2つのクエリの結果を取得し、両方の結果セットに現れる行のみを返します。重複削除の目的で、このINTERSECT演算子は を区別しませんNULLs。このINTERSECT演算子は、最終結果セットから重複行を削除します。このINTERSECT ALL演算子は最終結果セットから重複行を削除しませんが、行が最初のクエリでX回、2番目のクエリでY回現れる場合、それは表示されます。結果セットに何回出現するか。
次のクエリINTERSECT例は、Orders テーブルから Quantity が 50 から 100 の間のすべての行を返します。
SELECT * FROM Orders WHERE Quantity BETWEEN 1 AND 100交差するSELECT * FROM Orders WHERE Quantity BETWEEN 50 AND 200 ;SQLEXCEPT演算子は、1つのクエリの一意の行を取得し、2番目の結果セットに現れない行を返します。行の削除と重複の除去の目的で、このEXCEPT演算子は を区別しませんNULLs。このEXCEPT ALL演算子は重複を削除しませんが、行が最初のクエリでX回、2番目のクエリでY回出現する場合、それは表示されます。結果セットに何回出現するか。
特に、OracleプラットフォームはSQL標準MINUS演算子と機能的に同等の演算子を提供している。[ 3 ]EXCEPT DISTINCT
次のクエリEXCEPT例は、Orders テーブルから、Quantity が 1 ~ 49 の範囲にある行と、Quantity が 76 ~ 100 の範囲にある行をすべて返します。
別の言い方をすれば、このクエリは数量が1から100の間のすべての行を返しますが、数量が50から75の間の行は除外します。
SELECT * FROM Orders WHERE Quantity BETWEEN 1 AND 100を除外するSELECT * FROM Orders WHERE Quantity BETWEEN 50 AND 75 ;以下の例は、EXCEPT演算子を使用しない点を除けば、上記の例と同等です。
SELECT o1 . * FROM ( SELECT * FROM Orders WHERE Quantity BETWEEN 1 AND 100 ) o1 LEFT JOIN ( SELECT * FROM Orders WHERE Quantity BETWEEN 50 AND 75 ) o2 ON o1.id = o2.id WHERE o2.id IS NULLUNION ALLUNION ALL」テラバイトデータウェアハウスのテーブル設計の選択肢 - パート2(2006年7月25日アクセス)EXCEPT DISTINCTテーブル演算子:"MINUSの代わりに" "Oracle Compliance To Core SQL:2003"を使用してください。Docs.oracle.com 。 2022年7月7日取得。EXCEPT DISTINCT