演算子と述語④
ここでは、集合演算子の説明をします。集合演算とは、集合としての表に対する演算のことで、和、差、積、直積の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つについての説明はこれで終了です。次回は、関数について説明します。
コメントを残す