比較に使うINTERSECTとEXCEPT
2つのデータセット間で共通する行と異なる行を見つけます。
「比較に使うINTERSECTとEXCEPT」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
比較のための演算子
INTERSECT と EXCEPT は、結果セットを結合するのではなく、2つの結果セットを比較するための集合演算子です。面接では、「両方のリストに含まれる顧客」や「AにはあるがBにはない行」のような質問で使われます。
INTERSECT= 両方のクエリに存在する行。EXCEPT= 最初のクエリには存在するが、2つ目には存在しない行。
INTERSECTが返すもの
INTERSECT は、両方の結果セットに現れる重複のない行だけを返します。共通の行とみなされるには、すべての列が一致する必要があります。
UNIONと同様に、通常のINTERSECTは重複を削除し、共通する各行を1回だけ返します。
SELECT customer_id FROM orders_2023
INTERSECT
SELECT customer_id FROM orders_2024;
-- customers who ordered in BOTH yearsEXCEPTが返すもの
EXCEPT(Oracleでは MINUS と呼ばれます)は、最初のクエリには存在するが、2つ目には存在しない重複のない行を返します。これは方向性を持つ演算子です。A EXCEPT BとB EXCEPT Aは異なる結果になります。
2つ目のデータセットに存在しないレコードを見つけるには、これが自然な方法です。
SELECT customer_id FROM orders_2023
EXCEPT
SELECT customer_id FROM orders_2024;
-- ordered in 2023 but NOT in 2024 (churned)EXCEPTには対称性がない
面接でよく確認されるポイントは、EXCEPTには方向性があることです。2つのクエリを入れ替えると、別の問いに答えることになります。
A EXCEPT B= Aにはあるが、Bにはない。B EXCEPT A= Bにはあるが、Aにはない。
一方、INTERSECTには対称性があります。A INTERSECT BとB INTERSECT Aは等しくなります。
-- new customers in 2024 (not seen in 2023):
SELECT customer_id FROM orders_2024
EXCEPT
SELECT customer_id FROM orders_2023;重複とDISTINCTのデフォルト動作
標準の INTERSECT と EXCEPT は、UNIONと同様に重複のない行を対象に処理します。入力に含まれる重複行は、比較前にまとめられます。
一部のデータベースでは、重複数を保持する INTERSECT ALL や EXCEPT ALL をサポートしていますが、これらはあまり一般的ではありません。面接官がALLと明示していない場合は、重複を除く動作だと考えてください。
SELECT city FROM a
INTERSECT ALL
SELECT city FROM b;
-- multiplicity-aware (Postgres supports this; MySQL 8+ too)行全体を比較して等価性を判定する
どちらの演算子も、選択されたすべての列を使って行全体を比較します。すべての列が一致した場合に限り、2つの行は等しいとみなされます。そのため、2つのテーブルが同一のデータを保持しているかを確認するのに適しています。
比較に意味を持たせるため、比較対象にしたい列をすべて選択してください。
SELECT id, name, email FROM prod_users
EXCEPT
SELECT id, name, email FROM staging_users;
-- rows in prod that differ from / are missing in staging双方向のテーブル差分パターン
2つのテーブルが同一か確認するには、EXCEPTを両方向に実行し、その差分を結合します。結合した結果が空なら、テーブルは完全に一致しています。
これは、移行や照合の確認で使われる、データ検証に関する面接の定番回答です。
(SELECT * FROM table_a EXCEPT SELECT * FROM table_b)
UNION ALL
(SELECT * FROM table_b EXCEPT SELECT * FROM table_a);
-- empty result => tables are identicalNULLの扱い
集合演算の内部では、マッチングの目的上、2つの NULL 値は互いに等しいものとして扱われます。これは、通常の NULL = NULL がUNKNOWNになる動作とは異なります。
そのため、ある列にNULLを含む行は、同じ位置にNULLを含む別の行と一致します。これは通常の比較ルールに反するため、面接官がよく確認するポイントです。
-- (1, NULL) INTERSECT (1, NULL) -> returns (1, NULL)
SELECT id, region FROM a
INTERSECT
SELECT id, region FROM b;集合演算子間の優先順位
演算子を混在させる場合、SQL標準では通常、INTERSECT は UNION や EXCEPT より優先順位が高くなります。曖昧さを避けるため、各分岐を括弧で囲んでください。
評価順序を明確にするために括弧を付ける、と説明できれば、面接で成熟した判断力を示せます。
(SELECT id FROM a EXCEPT SELECT id FROM b)
UNION
(SELECT id FROM c);INTERSECT/EXCEPTとJOINの使い分け
INTERSECTとEXCEPTは簡潔で、組み込みの重複排除を使って行全体を比較できます。JOINのほうが柔軟で、追加の列を返したり、重複の扱い方を選んだりできます。
問いが純粋に「共通する行/存在しない行はどれか」という内容なら、集合演算子を優先してください。両側の列が必要な場合や、使用する方言がこれらの演算子に対応していない場合は、JOINに切り替えます。
全体をつなげて理解する
次のように要約して答えられます。「INTERSECTは両方のクエリに存在する行を返し、対称性があります。EXCEPTは最初のクエリにはあるが2つ目にはない行を返し、方向性があります。どちらも行全体を比較し、NULLを等しいものとして扱い、デフォルトでは重複のない結果を返します。」
データ照合に関する追加質問には、EXCEPTを双方向に使って差分を調べる方法も加えれば、このテーマを十分に説明できます。
クイックチェック
2023年に注文したものの、2024年には注文していない顧客(離反顧客)を求めたいとします。
復習
重要なポイント:
INTERSECT= 両方のクエリに存在する行。対称性があります。EXCEPT(OracleではMINUS)= 最初のクエリにはあるが、2つ目にはない行。方向性があります。- どちらも行全体を比較し、デフォルトでは重複のない結果を返します。
- マッチングではNULLを等しいものとして扱います。
- 双方向に
EXCEPTを使うと、テーブル全体の差分を確認できます。
よくある質問
「比較に使うINTERSECTとEXCEPT」レッスンは無料ですか?
はい。「比較に使うINTERSECTとEXCEPT」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「比較に使うINTERSECTとEXCEPT」で何を学びますか?
2つのデータセット間で共通する行と異なる行を見つけます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「比較に使うINTERSECTとEXCEPT」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- UNIONとUNION ALLの違い
- 列数とデータ型の互換性
- 比較に使うINTERSECTとEXCEPT
- JOINで集合演算を再現する