集合演算子


結合演算子、交差演算子、集合演算子を使用して複数のデータセットを結合する方法について説明します。 しゅうごうりろん 中学1年生の時に初めて勉強しました。集合について話し合いましょう。 パラレルセット:union演算unionえんざん 着色部分=A union B 交差こうさ:交差演算こうさえんざん 着色部分=AとBが交わる 差セットさーぶ:除外演算さくじょえんざん 着色部分=Aですが、B 集合Aから集合Bと重なる部分を取り除いた結果を表示する. では、次のような対称差セットを作成するにはどうすればいいのでしょうか。 上記3つの演算を用いてもよいし、異なる演算を組み合わせてもよい。 いろいろな方法がありますが。 AとBを含む集合から交差部分を削除することもできます。 (A Union B) except (A intersect B) AからBを減算した差セットとBからAを減算した差セットの和を求めることもできる。 (A except B) union (B except A) 集合演算を使用する際の注意点 実際のデータを処理する場合は、マージするデータセットの構成を表示する必要があります。 たとえば、文字を含む数値列<->日付を含む数値列のように、異なる列ペアをどのように結合するかは明確ではありません。 したがって、マージするデータセット間には共通点が必要です。 以下のルールを適用しましょう。 両方のデータセットに同じ数のカラムが必要です。 2つのデータセットの各カラムのデータ型は同じであるべきです。(または、サーバが互いに変換できる必要がある) 集合演算子 3種類の集合演算子(union,intercept,exception)はそれぞれ2種類に分けられる. 重複バージョンを含む 重複除外バージョン 結合演算子 冗長バージョン含む:ユニオンALL 重複除外バージョン:UNION たとえば、customerテーブルとactorテーブルでは、JDの頭文字を持つすべての人を選びたいと思っています。 SELECT c.first_name , c.last_name FROM customer c WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%' UNION ALL SELECT a.first_name , a.last_name FROM actor a WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%' ; UNIONALL演算子が使用されているため、JENNIFER DAVISが重複しても結果セットが返されます。△どのテーブルの値を表示したいのか、「CUST」と「ACTR」という別名を付けました。 重複行を除外する場合は、次のようにUNION演算子を使用します。 SELECT c.first_name , c.last_name FROM customer c WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%' UNION SELECT a.first_name , a.last_name FROM actor a WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%' ; 結果は、重複する名前を除いて、結果値に含まれる一意の名前が4つしかないことを示します。 セグメント交差演算子 MySQLバージョン8.0ではINTERSECT演算子はサポートされていません。(ANSI SQL仕様サポート)OracleまたはSQL Server 2008を使用する場合は、交差演算子を使用できます。 たとえば,customerテーブルとactorテーブルから同名のJD交差を抽出したい. INTERSECT演算子でエラーが発生しました。 この場合はINNERJOINで同様の結果を選ぶことができます SELECT c.first_name , c.last_name FROM customer c INNER JOIN actor a ON c.first_name = a.first_name AND c.last_name = a.last_name ; 結果値を返します。 除算演算子 MySQLバージョン8.0ではEXCEPT演算子はサポートされていません。 Oracleデータベースを使用する場合は、ANSIと互換性のないマイナス記号演算子を使用する必要があります。 例えば、customer表やactor表では、頭文字がJDの人の車の集合を選びたいと思っています。(条件:actorテーブル) つまり、俳優の机の上にある人を見つけたいのですが、お客様の机の上にアルファベットJDの人はいません。 この場合、LEFTOUTER JOIN(またはRIGHT OUTER JOIN)を用いて同じ結果を得ることができる。 しかし、MINUS集合演算は常にDISTINT的に重複レコードを削除して返すため、SELECTの最終結果にDISTINTを付けなければ、他のDBMSのMINUSと同じ結果が得られない。 SELECT a.first_name , a.last_name FROM customer c RIGHT JOIN actor a ON c.last_name = a.last_name AND c.first_name = a.first_name WHERE c.customer_id IS NULL AND a.first_name LIKE 'J%' AND a.last_name LIKE 'D%' ; 3つの結果値を返します。 注意:配置
  • MySQLでMINUSとINTERSECTセットを計算する
  • RIGHT JOINにおいては,意図した交差結果が出ず,多くの苦しみを味わった.
    上記の例では、WHERE c.customer_id IS NULLと書かないと、交差部分を除外しない結果値が表示されます.このとき条件文にPKを記入しなければならない.

    集合演算規則


    複合クエリーを使用するときに従うべきルールを見てみましょう.
    ここで、複合クエリーとは、複数の独立したクエリーからなるクエリーを指します.

    複合クエリーの結果をソート


    クエリは、最後にorder by節を追加します.カラム名を定義する場合は、複合クエリーの最初のクエリーのカラム名を選択します.
    例:
    SELECT 
    	a.first_name AS fname
    	, a.last_name AS lname
    FROM actor a
    WHERE a.first_name LIKE 'J%'
      AND a.last_name LIKE 'D%'
    UNION ALL 
    SELECT 
    	c.first_name
    	, c.last_name
    FROM customer c
    WHERE c.first_name LIKE 'J%'
      AND c.last_name LIKE 'D%'
    ORDER BY lname, fname ;
    最初のSELECT文では、別名で指定されたfnamelnameの順に並べ替えなければならず、エラーは発生しません.lnameを基準として最初に並べ替えられ、次いでfnameを基準として並べ替えられた結果値が見られる.

    集合演算の順序


    複合クエリーで異なる集合演算子を使用する2つ以上のクエリーを使用する場合は、順序を考慮します.結果は、演算子の配置位置によって異なります.UNIONUNION ALLの順序が異なる場合は、結果がどのように変化したかを以下の例で確認することができる.