今回は、SQLの集合演算子のひとつ『EXCEPT(差集合)』について説明します。
EXCEPTは、1つ目の検索結果を元にして、2つ目の検索結果に存在するデータを差し引くような動作をします。
この記事では、EXCEPT(差集合)のSQL文の書き方と実例を実際のRDBMSの画像も用いて説明します。
EXCEPT(差集合)のおさらい
EXCEPTのSQL文や実例を説明する前に、EXCEPTの概要をおさらいしておきましょう。
EXCEPTとは
EXCEPTは、1つ目の検索結果を元にして、2つ目の検索結果に存在するデータを差し引く場合に使う集合演算子です。

上記のイメージ図で説明します。2つの円は、それぞれ異なるテーブルから抽出された検索結果を表しています。
イメージ図では、左の円からは右の円のすべての箇所が除かれていますので、EXCEPTの結果には、左の円のデータを元に右の円および(右と左の)共通箇所がすべて除かれていることを意味しています。
EXCEPTを使うシーン
EXCEPTは、1つ目の検索結果を元にして、2つ目の検索結果に存在するデータを差し引く場合に使います。たとえば、当月分の売上データを元に、過去の売上データをEXCEPT演算子で集合することで、今月新たに発生した新規顧客(コード)のみを抽出することができます。
検索結果①
- A
 - B
 - C
 
検索結果②
- C
 - D
 - E
 
SELECT * FROM First_table EXCEPT SELECT * FROM Second_tabel;EXCEPT実行後(差集合)
- A
 - B
 
EXCEPT_SQL文の書き方と実例
この章では、EXCEPTのSQL文の書き方と実例を紹介します。
使用する検索結果
使用する検索結果は下記の2つです。この2つの検索結果を元にして、SQLのEXCEPTを実際のRDBMSで実行します。
| id | vege_name | class | 
|---|---|---|
| T001 | ゴーヤ | 野菜 | 
| T002 | さつま芋 | 野菜 | 
| T003 | サラダ菜 | 野菜 | 
| T004 | しめじ | 野菜 | 
| T005 | だいこん | 野菜 | 
| T006 | トマト | 野菜 | 
| id | vege_name | class | 
|---|---|---|
| 0001 | えのきだけ | 野菜 | 
| 0002 | オレンジ | くだもの | 
| 0003 | かぼちゃ | 野菜 | 
| 0004 | キウイフルーツ | くだもの | 
| 0005 | キャベツ | 野菜 | 
| 0006 | きゅうり | 野菜 | 
| 0007 | グレープフルーツ | くだもの | 
| 0008 | ゴーヤ | 野菜 | 
| 0009 | さつま芋 | 野菜 | 
| 0010 | サラダ菜 | 野菜 | 
EXCEPTのSQL文
EXCEPTを使う場合の基本文法と実際のSQL文について説明します。
基本文法
SELECT文1 EXCEPT SELECT文2;
上記SQL文の[EXCEPT]を[EXCEPT ALL]にすることで、重複行を1行にまとめずに抽出することができます。
実際のSQL文
- テーブル1・・Vegetable_202212
 - テーブル2・・Vegetable
 
たとえば、テーブル[Vegetable_202212]を元に、テーブル[Vegetable]に含まれているデータをEXCEPTで除いたうえで、1つにまとめる場合には、下記のようにSQL文を記述します。
SELECT vege_name,class FROM Vegetable_202212 EXCEPT SELECT vege_name,class FROM Vegetable;EXCEPT(差集合)は、イメージがし難い方が多いと思いますので、想定される結果を提示しておきます。(テーブル内の赤字は重複データです)
| id | vege_name | class | 
|---|---|---|
| T001 | ゴーヤ | 野菜 | 
| T002 | さつま芋 | 野菜 | 
| T003 | サラダ菜 | 野菜 | 
| T004 | しめじ | 野菜 | 
| T005 | だいこん | 野菜 | 
| T006 | トマト | 野菜 | 
| id | vege_name | class | 
|---|---|---|
| 0001 | えのきだけ | 野菜 | 
| 0002 | オレンジ | くだもの | 
| 0003 | かぼちゃ | 野菜 | 
| 0004 | キウイフルーツ | くだもの | 
| 0005 | キャベツ | 野菜 | 
| 0006 | きゅうり | 野菜 | 
| 0007 | グレープフルーツ | くだもの | 
| 0008 | ゴーヤ | 野菜 | 
| 0009 | さつま芋 | 野菜 | 
| 0010 | サラダ菜 | 野菜 | 
EXCEPT(差集合)実行後
| vege_name | class | 
|---|---|
| しめじ | 野菜 | 
| だいこん | 野菜 | 
| トマト | 野菜 | 
実例_MySQLのEXCEPT
実際のRDBMS、MySQLでEXCEPTを実行して検索結果を1つにまとめた実画像を紹介します。
EXCEPTの実行

実例_PostgreSQLのEXCEPT
実際のRDBMS、PostgreSQLでEXCEPTを実行して検索結果を1つにまとめた実画像を紹介します。
EXCEPTの実行

あとがき〜EXCEPTは差分の抽出
今回は、SQLの集合演算子のひとつ[EXCEPT(差集合)]について、基本的な概要とSQLの書き方、実例を用いた説明を記事にしました。
EXCEPTは、日常的に使う集合概念とは異なると思いますが、『差分の抽出』と考えるとご理解しやすいかと思います。
そうです。集合演算子のEXCEPTは、『差分の抽出』です。
