SQL EXCEPTのサンプル(差分を抽出する)

SQLのEXCEPT演算子で差分を抽出するサンプルです。

目次

説明 EXCEPT演算子(2つのテーブルの行の差分を抽出する)
サンプル EXCEPTを使用したサンプル
  比較するテーブルの値が異なっていた場合
  比較する項目がnullどうしの場合
列名を指定しての比較

EXCEPT演算子(2つのテーブルの行の差分を抽出する)

select * from テーブルA
EXCEPT
select * from テーブルB
  • テーブルAで取得した行とテーブルBで取得した行を全ての列の値で比較し、列の値がすべて一致する行は抽出しません。
    →テーブルAのみにある行を抽出します。
    →2つのテーブルの列数が同じであることが必要です。列名は異なっていても実行できます。
  • 集合演算子で、差集合を求めます。
  • exceptは、除くという意味です。
  • Oracleは、「EXCEPT」演算子はサポートしていません。「MINUS」演算子を使用します。
    SQL MINUSのサンプル(差分を抽出する:Oracle)

 

EXCEPTを使用したサンプル

EXCEPT演算子で2つのテーブルを比較し、差がある行を表示するサンプルです。

以下、2つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato
employee_beforeテーブル
id name romaji
2 田中 tanaka

 

EXCEPTを使用したSQLを実行します。

select * from employee 
EXCEPT
select * from employee_before

 

結果は、以下のとおりです。

抽出結果
id name romaji
1 鈴木 suzuki
3 佐藤 sato

employeeテーブルのみにあるデータが表示されます。
employeeテーブルとemployee_beforeテーブルで重複する行は表示されません。

 

比較するテーブルの値が異なっていた場合

比較するテーブルの値が異なっていた場合は、同じと見なされません。

以下、2つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 NULL
3 佐藤 sato

2行目は、列のromajiの値がnullです。

employee_beforeテーブル
id name romaji
2 田中 tanaka

 

EXCEPTを使用したSQLを実行します。

select * from employee 
EXCEPT
select * from employee_before

 

結果は、以下のとおりです。

抽出結果
id name romaji
1 鈴木 suzuki
2 田中 NULL
3 佐藤 sato

employeeテーブルのデータが全件表示されます。

 

比較する項目がnullどうしの場合

比較する項目がnullどうしの場合は、同じとみなされます。

以下、2つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 NULL
3 佐藤 sato

2行目のデータにnullがあります。

employee_beforeテーブル
id name romaji
2 田中 NULL

こちらもNULLがあります。

 

EXCEPTを使用したSQLを実行します。

select * from employee 
EXCEPT
select * from employee_before

 

結果は、以下のとおりです。

抽出結果
id name romaji
1 鈴木 suzuki
3 佐藤 sato

1,3行目のみ出力されます。

 

列名を指定しての比較

列名を指定しての比較も可能です。

以下、2つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 null
3 佐藤 sato
employee_beforeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

EXCEPTを使用したSQLを実行します。

select id,name from employee 
EXCEPT
select id,name from employee_before

 

結果は、以下のとおりです。

抽出結果
id name romaji

行の表示なし

項目の「romaji」については、nullありとnullなしで差がありますが、idとnameは同じため、差はなしとなります。

関連の記事

SQL UNIONとUNION ALLのサンプル(結合して抽出)
SQL INTERSECTのサンプル(一致行を抽出する)

△上に戻る