Developer

【SQL基礎】積集合
2021.03.31
Lv1

【SQL基礎】積集合

本項は積集合ついて説明していきます。


INTERSECT演算子

標準SQLでは、集合演算子のINTERSECTを使用すると、ある検索結果とある検索結果の重複する部分を求めることができます。
差集合と同じく、MySQLではサポートされていません。

書式は下記になります。

SELECT文
INTERSECT
SELECT文

MySQLで積集合を求める

MySQLではINTERSECTがサポートされていないので、少し工夫をして上げる必要があります。
方法は以下のようなものがあります。
使用するテーブルは以下のようなteachersテーブルを使用します。

1.INを使用する

以下のように、INを使用するとINTERSECTと同じ結果が得られます。

SELECT t1.*
FROM teachers t1
WHERE t1.address = "東京都" AND t1.id IN (
	SELECT t2.id
	FROM teachers t2
	WHERE t2.age < 30
);

 

2.EXISTSを使用する

以下のように、EXISTSを使用すると同じくINTERSECTと同じ結果が得られます。

SELECT t1.*
FROM teachers t1
WHERE t1.address = "東京都" AND EXISTS (
	SELECT t2.*
	FROM teachers t2
	WHERE t2.age < 30 AND t1.id = t2.id
);

 

3.INNER JOIN を使用する

以下のように、LEFT JOINを使用しても同じくINTERSECTと同じ結果が得られます。

SELECT t2.*
FROM (SELECT t1.*
      FROM teachers t1
      WHERE t1.address = "東京都") t2
INNER JOIN (SELECT * 
           FROM teachers t3 
           WHERE t3.age < 30) t4 ON t2.id = t4.id;


今回の学習ポイント

・MySQLでは、INTERSECTはサポートしていない。
・内部結合など別の手段で積集合を求めることができる


練習問題

問題として使用するデータは「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未満の選手の検索結果との積集合を内部結合を使用して抽出してください。

答え
[sql] SELECT p1.*
FROM (SELECT p2.*
FROM players p2
WHERE p2.height >= 190) p1
INNER JOIN (SELECT p3.*
FROM players p3
WHERE p3.weight < 70) p4 ON p4.id = p1.id;
[/sql]

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

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

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ