IN vs EXISTS
IN
과 EXISTS
는 모두 서브쿼리 결과를 기준으로 행을 필터링하는 데 사용되지만, 내부 동작 방식과 성능 특성이 달라 상황에 따라 적합한 선택이 필요합니다.
IN과 EXISTS 비교
겉보기에 두 연산자는 비슷해 보이지만, 내부 처리 방식에서 중요한 차이가 있습니다.
구분 | IN | EXISTS |
---|---|---|
동작 방식 | 서브쿼리 결과를 한 번에 가져와 비교 | 조건을 만족하는 행을 찾으면 즉시 중단 |
반환 기준 | 값 집합에 해당 값이 있는지 확인 | 해당 조건을 만족하는 행 존재 여부 확인 |
NULL 처리 | NULL이 포함되면 예상치 못한 결과 발생 가능 | NULL과 무관하게 안정적으로 동작 |
최적화 방식 | 작은 서브쿼리에 유리 | 상관 서브쿼리에서 성능상 유리 |
핵심 차이점
IN
: 조회(lookup) 방식 서브쿼리의 결과를 먼저 전부 모아, 메인 쿼리 값이 그 집합에 있는지 비 교합니다.EXISTS
: 존재 여부 확인 조건을 만족하는 행을 찾으면 바로 멈추므로, 대용량 테이블에서 효율적입니다.
예시: 파이썬 강좌를 듣는 사용자 찾기
다음 두 개의 테이블이 있다고 가정합니다.
users
: 사용자 ID와 이름 저장user_courses
: 각 사용자가 선택한 강좌 기록
파이썬 강좌를 듣는 사용자를 찾는 예시는 다음과 같습니다.
IN
사용
IN 예시
SELECT name
FROM users
WHERE user_id IN (
SELECT user_id
FROM user_courses
WHERE course = 'Python'
);
EXISTS
사용
EXISTS 예시
SELECT name
FROM users u
WHERE EXISTS (
SELECT 1
FROM user_courses uc
WHERE uc.user_id = u.user_id
AND uc.course = 'Python'
);
두 쿼리 모두 동일한 결과를 반환하지만, EXISTS
는 조건을 만족하는 첫 번째 행을 찾는 즉시 중단하므로 대규모 데이터셋에서 더 효율적일 수 있습니다.
언제 어떤 것을 사용할까?
IN
과 EXISTS
는 모두 서브쿼리를 사용하여 행을 필터링하는 데 사용됩니다.
하지만 두 연산자의 동작 방식과 성능 특성에 따라 상황에 따라 적합한 선택이 필요합니다.
IN
을 사용하는 경우
- 서브쿼리가 작고 결과가 고정된 값 목록일 때
- 단순 값 비교가 필요한 경우
EXISTS
를 사용하는 경우
- 서브쿼리가 큰 테이블을 대상으로 할 때
- 상관 서브쿼리에서 성능 최적화가 필요할 때
- NULL 값으로 인한 예외를 피하고 싶을 때
실무에서는 서브쿼리의 크기와 NULL 포함 여부, 그리고 성능 요구사항에 따라 적절히 선택하는 것이 중요합니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!