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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | NULL |
3 | 佐藤 | sato |
2行目は、列のromajiの値がnullです。
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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | NULL |
3 | 佐藤 | sato |
2行目のデータにnullがあります。
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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | null |
3 | 佐藤 | sato |
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のサンプル(一致行を抽出する)