2021.03.31
【SQL基礎】差集合
本項は差集合ついて説明していきます。
EXCEPT演算子
標準SQLでは、集合演算子のEXCEPTを使用すると、ある検索結果からある検索結果と重複する部分を取り除いた差集合を求めることができます。
MySQLではサポートされていません。
書式は下記になります。
SELECT文 EXCEPT SELECT文
MySQLで差集合を求める
MySQLではEXCEPTがサポートされていないので、少し工夫をして上げる必要があります。
方法は以下のようなものがあります。
使用するテーブルは以下のようなteachersテーブルを使用します。
1.NOT INを使用する
以下のように、NOT INを使用するとEXCEPTと同じ結果が得られます。
SELECT t1.* FROM teachers t1 WHERE t1.address = "東京都" AND t1.id NOT IN ( SELECT t2.id FROM teachers t2 WHERE t2.age < 30 );
2.NOT EXISTSを使用する
以下のように、NOT EXISTSを使用すると同じくEXCEPTと同じ結果が得られます。
SELECT t1.* FROM teachers t1 WHERE t1.address = "東京都" AND NOT EXISTS ( SELECT t2.* FROM teachers t2 WHERE t2.age < 30 AND t1.id = t2.id );
3.LEFT JOIN を使用する
以下のように、LEFT JOINを使用しても同じくEXCEPTと同じ結果が得られます。
SELECT t2.* FROM (SELECT t1.* FROM teachers t1 WHERE t1.address = "東京都") t2 LEFT JOIN (SELECT * FROM teachers t3 WHERE t3.age < 30) t4 ON t2.id = t4.id WHERE t4.id IS NULL;
今回の学習ポイント
・MySQLでは、EXCEPTはサポートしていない。
・外部結合など別の手段で差集合を求めることができる
練習問題
問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。 [sql] CREATE DATABASE worldcup2014;
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。 [sql] CREATE DATABASE worldcup2014;
use worldcup2014
source C:\worldcup2014.sql
[/sql]