0Pricing
Coding Interview Prep · レッスン

比較に使うINTERSECTとEXCEPT

2つのデータセット間で共通する行と異なる行を見つけます。

「比較に使うINTERSECTとEXCEPT」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding 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 years

EXCEPTが返すもの

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 identical

NULLの扱い

集合演算の内部では、マッチングの目的上、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チューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。

「比較に使うINTERSECTとEXCEPT」で何を学びますか?

2つのデータセット間で共通する行と異なる行を見つけます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Coding Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「比較に使うINTERSECTとEXCEPT」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCoding Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. UNIONとUNION ALLの違い
  2. 列数とデータ型の互換性
  3. 比較に使うINTERSECTとEXCEPT
  4. JOINで集合演算を再現する
← Coding Interview Prepに戻る