It seems to me that you can do the same thing in a SQL query using either NOT EXISTS, NOT IN, or LEFT JOIN WHERE IS NULL. For example:
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
In a nutshell:
NOT IN is a little bit different: it never matches if there is but a single
NULL in the list.
NOT EXISTS is a little bit less efficient
LEFT JOIN / IS NULL is less efficient
NOT IN is less efficient
Oracle, all three methods are the same.