Me parece que puede hacer lo mismo en una consulta SQL usando NOT EXISTS, NOT IN, o LEFT JOIN WHERE IS NULL. Por ejemplo:
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
No estoy seguro de tener toda la sintaxis correcta, pero estas son las técnicas generales que he visto. ¿Por qué elegiría usar uno sobre el otro? ¿El rendimiento difiere ...? ¿Cuál de estos es el más rápido / más eficiente? (Si depende de la implementación, ¿cuándo usaría cada una?)
EXISTScláusula. Puede regresar *, NULLo lo que sea: todo esto se optimizará.
SELECTy FROM. Y *es más fácil de escribir. Sí, SQLtiene cierto parecido con un lenguaje natural, pero es analizado y ejecutado por una máquina, una máquina programada. No es que alguna vez irrumpirá repentinamente en su cubículo y gritará "¡deje de exigir los campos adicionales en una EXISTSconsulta porque estoy harto de analizarlos y luego tirarlos!". Está bien con una computadora, de verdad.