서브쿼리중급

EXISTS

서브쿼리 결과에 행이 하나라도 있으면 TRUE

정의

상관 서브쿼리의 존재 여부를 검사한다. 행이 하나라도 발견되면 즉시 TRUE를 반환하고 더 이상 검사하지 않는다. IN과 의미가 비슷하지만 처리 방식이 다르다. 오라클 옵티마이저는 NOT EXISTS / NOT IN을 다르게 처리한다 — NOT IN은 NULL 한 건이라도 있으면 결과가 비어버리는 SQL 표준 동작 때문에 안티 조인 변환이 막힌다.

왜 중요한가?

"존재 여부만 확인" 할 때 IN 대신 EXISTS를 쓰면 Semi Join으로 풀려 첫 매칭에서 종료할 수 있다. NOT IN 자리에는 NULL 안전성을 위해 NOT EXISTS를 쓰는 것이 안전하다.

틀리기 쉬운 포인트

  • !EXISTS는 서브쿼리의 SELECT 절 컬럼을 평가하지 않습니다. SELECT 1로 충분합니다.
  • !NOT IN은 NULL이 한 건이라도 있으면 결과가 비어버립니다(SQL 표준). NOT EXISTS로 대체하세요.
  • !IN과 EXISTS는 결과는 같지만 처리 방식(Semi Join vs Subquery Unnesting)이 다릅니다.

예시

SELECT c.id, c.name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id );

성능 포인트

!EXISTS는 Semi Join으로 풀려 첫 매칭에서 종료. NOT IN은 NULL 처리 의미 차이로 안티 조인 최적화가 막힐 수 있어 NOT EXISTS 권장.

관련 개념

관련 카테고리