9.EXCEPT-SQL経験者のためのR入門

SQLの EXCEPT 演算子について解説します。


➖ EXCEPT 演算子による差分抽出

SELECT FIELD1 FROM TABLE1 
EXCEPT 
SELECT FIELD1 FROM TABLE2 

のような EXCEPT 演算子は、最初の SELECT クエリの結果セットには存在するが、二番目の SELECT クエリの結果セットには存在しない行を抽出するために使用されます。

EXCEPT は、集合論でいう差集合(Set Difference)の操作に相当します。

1. 動作の仕組み

EXCEPT 演算子は、以下の処理を行います。

  1. 結果セットの比較: 最初のクエリ結果 (TABLE1 のデータ) と二番目のクエリ結果 (TABLE2 のデータ) を比較します。
  2. 差分の抽出と重複の排除:TABLE1 の結果セットの中から、TABLE2 の結果セットに一つでも一致する行があるものをすべて除外します。
    • 最終的な結果は、自動的にユニークな行(重複を排除したもの)になります。

2. 利用条件(ルール)

EXCEPT を使用するためには、UNIONINTERSECT と同様に厳格なルールを満たす必要があります。

  • 列の数、順序、データ型: すべての SELECT クエリで、選択する列の数、並び順、およびデータ型が互換性を持っている必要があります。

3. 利用シーン

EXCEPT は、「Aのリストにはあるが、Bのリストにはない項目」を知りたい場合に非常に有効です。

  • 例: 「過去にウェブサイトを訪問したことがある顧客の中で、まだ一度も商品を購入していない顧客リスト」の抽出。

4. R言語 (dplyr) での対応方法

R言語では、dplyr パッケージの setdiff() 関数が、SQLの EXCEPT 演算子と完全に同じ機能(差集合の抽出)を提供します。

🚀 Rコードの対応

R

# SQL: SELECT FIELD1 FROM TABLE1 EXCEPT SELECT FIELD1 FROM TABLE2

# R言語:
library(dplyr)

# 1. 結合前に、両方のデータフレームでFIELD1だけを選択する
table1_data <- TABLE1 %>% select(FIELD1)
table2_data <- TABLE2 %>% select(FIELD1)

# 2. EXCEPT (差集合の抽出) を実行
setdiff(table1_data, table2_data)

この操作により、TABLE1 には存在するが TABLE2 には存在しない FIELD1 の値だけが抽出された結果が得られます。

SQL演算子目的R言語の対応関数
EXCEPT差分(AにはあってBにはない行)を抽出setdiff()
INTERSECT共通部分(AとBの両方にある行)を抽出intersect()
UNION和集合(AまたはBにあるユニークな行)を結合union()