1. ホーム
  2. sql

[解決済み] NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULLの違いは何ですか?

2022-04-26 12:14:40

質問

SQLクエリでは、NOT EXISTS、NOT IN、LEFT JOIN WHERE IS NULLのいずれかを使用して、同じことを行うことができるようです。例えば

SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)

SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)

SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL

すべての構文が正しいかどうかは分かりませんが、これらは私が見た一般的な手法です。なぜどちらか一方を選ぶのでしょうか?パフォーマンスに違いはあるのでしょうか...?どれが一番速い/効率的なのでしょうか?(実装に依存するのであれば、それぞれをいつ使えばいいのでしょうか?)

どのように解決するのですか?

ひとことで言うと

NOT IN が1つしかない場合は、決してマッチングしません。 NULL を指定します。

  • MySQL , NOT EXISTS は少し効率が悪い

  • SQL Server , LEFT JOIN / IS NULL は効率が悪い

  • PostgreSQL , NOT IN は効率が悪い

  • Oracle のように、3つのメソッドはすべて同じです。