演算子と述語④



演算子と述語④

ここでは、集合演算子の説明をします。集合演算とは、集合としての表に対する演算のことで、和、差、積、直積の4種類が定義されています。これらの演算を実装するためにSQLでは、集合演算子が用意されています。今回はその中で、和、差、積の3つについて説明します。直積については、ここでは取り上げず、以降の表の結合で説明します。今回は、以下の演算子の説明をします。

・UNION演算子
・INTERSECT演算子
・EXCEPT演算子

今回は、”仕入担当”と”売上担当”の2つの表を使って説明していきます。そしてこの2つのテーブルにはどちらも担当している兼務社員が何名かいます。
以下が兼務社員です。

佐々木義男
佐藤正雄
内藤朋美
和田実

データ挿入のInsert文が欲しい方は、第9回を参照願います。

演算子と述語①

 

1.UNION演算子

”仕入担当”と”売上担当”に含まれている社員は全部で何人いるでしょうか?そのようなことを調べたい場合、UNION演算子を使います。UNION演算子は2つのクエリーをつなぎ合わせ重複する行を除きます。SQLは以下のようになります。

SELECT * FROM 仕入担当
UNION
SELECT * FROM 売上担当;

結果は以下のとおりになります。重複する行は除かれています。

重複する行を除かず、全ての行を表示させたい場合は、”UNION ALL”と書きます。

SELECT * FROM 仕入担当
UNION ALL
SELECT * FROM 売上担当;

結果は以下のとおりになります。単純に仕入担当と売上担当の表をつなぎ合わせた結果となります。

 

2.INTERSECT演算子

”仕入担当”と”売上担当”を兼務している社員を抽出する場合は、INTERSECT演算子を使います。SQLは以下のとおりになります。

SELECT * FROM 仕入担当
INTERSECT
SELECT * FROM 売上担当;

※.
MySQLではINTERSECT演算子はサポートされていません。同様の結果を得るために以下のようなSQLを実行しました。LEFT JOIN演算子の説明は以降の記事で説明します。

SELECT * FROM 仕入担当
LEFT JOIN 売上担当 ON 仕入担当.氏名 = 売上担当.氏名
WHERE 売上担当.氏名 IS NOT NULL;

結果は以下のようになります。

 

3.EXCEPT演算子

”仕入担当”に属し、”売上担当”には属していない社員を抽出する場合には、EXCEPT演算子を使用します。SQLは以下のようになります。

SELECT * FROM 仕入担当
EXCEPT
SELECT * FROM 売上担当;

※.
MySQLではEXCEPT演算子はサポートされていません。同様の結果を得るために以下のようなSQLを実行しました。またOracleの場合は、EXCEPTの代わりにMINUS演算子を使用します。

SELECT * FROM 仕入担当
LEFT JOIN 売上担当 ON 仕入担当.氏名 = 売上担当.氏名
WHERE 売上担当.氏名 IS NULL;

結果は以下のようになります。

逆に”売上担当”に属し、”仕入担当”には属していない社員を抽出する場合には以下のようになります。こちらも代替SQLで結果を表示してみます。

SELECT * FROM 売上担当
EXCEPT
SELECT * FROM 仕入担当;

代替SQL

SELECT * FROM 売上担当
LEFT JOIN 仕入担当 ON 売上担当.氏名 = 仕入担当.氏名
WHERE 仕入担当.氏名 IS NULL;

結果は以下のようになります。

和、差、積の3つについての説明はこれで終了です。次回は、関数について説明します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です