NOT EXISTS、NOT IN、またはLEFT JOIN WHERE IS NULLのいずれかを使用してSQLクエリで同じことができるように思えます。例えば:
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
すべての構文が正しいかどうかはわかりませんが、これらは私が見た一般的な手法です。なぜどちらか一方を使用することを選択するのですか?パフォーマンスは異なりますか?これらのうちどれが最も速く/最も効率的ですか?(実装に依存する場合、それぞれをいつ使用しますか?)
EXISTS
句内で正確に何が返されるかを気にするデータベースはありません。あなたは返すことがあり*
、NULL
または任意:これはすべて離れて最適化されます。
SELECT
との間に何かを置くことを要求するクエリパーサーに関するものFROM
です。そして*
、単にタイプするのが簡単です。はい、SQL
自然言語に似ていますが、プログラム化されたマシンによって解析および実行されます。それは突然あなたのキュービクルに突然侵入して、「EXISTS
クエリで追加のフィールドを要求するのをやめるので、それらを解析して捨てるのにうんざりしている!」と叫ぶということではありません。本当に、コンピューターで大丈夫です。