SQL에서 NOT IN과 NOT EXISTS는 비슷하게 사용되지만, NULL 값을 처리하는 방식에서 차이가 있다.
NOT IN의 동작 방식NOT IN을 사용할 때, 서브쿼리 내에 NULL 값이 있으면 NOT IN 조건은 전체적으로 NULL을 반환하게 된다.
이는 SQL의 3값 논리 때문으로, NULL은 "알 수 없음"을 의미하며, 어떤 값과도 비교할 수 없으므로 결과적으로 FALSE가 되는 것이다.
따라서, NOT IN을 사용할 때 서브쿼리 내에서 NULL 값을 미리 제거해야만 올바른 결과를 얻을 수 있다. 그렇지 않으면 NOT IN 조건이 의도한 대로 작동하지 않게 된다.
예제:
SELECT a.*
FROM nw.region a
WHERE a.region_name NOT IN (
SELECT ship_region
FROM nw.orders x
WHERE x.ship_region IS NOT NULL
);
이 쿼리에서는 서브쿼리 내에서 ship_region이 NULL인 레코드를 제거함으로써 NOT IN이 제대로 작동하도록 한다.
NOT EXISTS의 동작 방식NOT EXISTS는 서브쿼리가 조건을 만족하는 행이 있는지 확인하는 방식으로 동작한다. NULL 값이 있어도 상관없이 조건에 맞는 행이 하나라도 있으면 EXISTS는 TRUE를 반환하게 된다.
그러므로 NOT EXISTS는 서브쿼리에서 NULL 값을 따로 처리하지 않아도 되며, 메인 쿼리에서 NULL 값을 제외하면 된다.
예제:
SELECT a.*
FROM nw.region a
WHERE NOT EXISTS (
SELECT ship_region
FROM nw.orders x
WHERE x.ship_region = a.region_name
)
AND a.region_name IS NOT NULL;
이 쿼리에서는 NOT EXISTS 서브쿼리 내에서 NULL 값을 처리할 필요가 없으며, 메인 쿼리에서 a.region_name IS NOT NULL 조건을 추가하여 NULL 값을 제외하게 된다.
NOT IN 사용 시, 서브쿼리 내에서 NULL 값을 제거해야 한다. 그렇지 않으면 NULL 값 때문에 NOT IN 조건이 항상 FALSE를 반환할 수 있다.NOT EXISTS 사용 시, 메인 쿼리에서 NULL 값을 제외할 수 있으며, 서브쿼리 내에서 NULL 값을 따로 처리할 필요가 없다.이 차이로 인해 NOT IN과 NOT EXISTS의 NULL 처리 방법이 다르게 된다.