IN은 조건에 만족하는 row를 찾는 것이고 EXISTS는 EXISTS이하 절이 true인지 아닌지를 체크합니다. 둘의 차이점은 Null 값을 처리하는 부분에서 발생합니다. NOT IN은 Null 값이 WHERE 절의 조건을 만족하더라도 결과에서 제외됩니다. NOT EXISTS는 NOT IN과 달리 Null 값을 가진 Row들도 결과에 포함됩니다. 이는 연결고리 값이 Null 값을 가질 때 NOT IN은 조인 연산을 하지 않기 때문에 결과에서 제외되며 NOT EXISTS는 EXISTS 이하의 절이 False를 리턴하고 거기에 대한 NOT이므로 true가 되어 결과에 포함된다.
SELECT * FROM a WHERE a.key NOT IN (SELECT b.key FROM b)
SELECT * FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.key = b.key)