Developer

【SQL基礎】差集合
2021.03.31
Lv1

【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ドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.身長(players.height)が190cm以上の検索結果から、体重(players.weight)が70kg未満の選手の検索結果との差集合をEXISTSを使用して抽出してください。

答え
[sql] SELECT p1.*
FROM
players p1
WHERE p1.height >= 190 AND NOT EXISTS (
SELECT p2.*
FROM players p2
WHERE p2.weight < 70 AND p1.id = p2.id
);
[/sql]

※検索結果は一部分のみ表示しています。

両方の検索結果で共通の「id = 354」の選手のレコード取り除かれたものが抽出されます。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ