“비존재 검사(non-existence check) 패턴”은 SQL에서 어떤 테이블에는 존재하지만 다른 테이블에는 존재하지 않는 행을 찾는 패턴이다.
예를 들어:
이런 것을 찾을 때 사용하는 전형적인 기법이다.
가장 널리 쓰는 3가지는 아래다.
가장 흔한 방식.
SELECT t.*
FROM T t
LEFT JOIN U u ON u.userId = t.userId
WHERE u.userId IS NULL;
의미: T에는 있는데 U에 없는 행만 가져와라.
이게 흔히 “anti-join”이라고 부른다.
T 테이블의 row를 기준으로 한다. (LEFT JOIN)
T.userId = U.userId 가 매칭되면 u 값이 채워진다.
매칭이 안 된 row는 u.*가 전부 NULL이 된다.
WHERE u.userId IS NULL 은 매칭되지 않은 row만 남겨라, 즉
T에는 있지만 U에는 없는 row만 가져와라.
정확한 비존재 검사이며 의미적으로 안전하다.
SELECT t.*
FROM T t
WHERE NOT EXISTS (
SELECT 1
FROM U u
WHERE u.userId = t.userId
);
대부분의 DB 옵티마이저는 이 패턴을 가장 잘 최적화한다.