集合演算子
結合演算子、交差演算子、集合演算子を使用して複数のデータセットを結合する方法について説明します。
しゅうごうりろん
中学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セットを計算する
上記の例では、
複合クエリーを使用するときに従うべきルールを見てみましょう.
ここで、複合クエリーとは、複数の独立したクエリーからなるクエリーを指します.
クエリは、最後に
例:
複合クエリーで異なる集合演算子を使用する2つ以上のクエリーを使用する場合は、順序を考慮します.結果は、演算子の配置位置によって異なります.
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
文では、別名で指定されたfname
とlname
の順に並べ替えなければならず、エラーは発生しません.lname
を基準として最初に並べ替えられ、次いでfname
を基準として並べ替えられた結果値が見られる.集合演算の順序
複合クエリーで異なる集合演算子を使用する2つ以上のクエリーを使用する場合は、順序を考慮します.結果は、演算子の配置位置によって異なります.
UNION
とUNION ALL
の順序が異なる場合は、結果がどのように変化したかを以下の例で確認することができる.Reference
この問題について(集合演算子), 我々は、より多くの情報をここで見つけました https://velog.io/@golmori/working-with-setsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol