본문으로 건너뛰기
실습하기

IN vs EXISTS

INEXISTS는 모두 서브쿼리 결과를 기준으로 행을 필터링하는 데 사용되지만, 내부 동작 방식과 성능 특성이 달라 상황에 따라 적합한 선택이 필요합니다.


IN과 EXISTS 비교

겉보기에 두 연산자는 비슷해 보이지만, 내부 처리 방식에서 중요한 차이가 있습니다.

구분INEXISTS
동작 방식서브쿼리 결과를 한 번에 가져와 비교조건을 만족하는 행을 찾으면 즉시 중단
반환 기준값 집합에 해당 값이 있는지 확인해당 조건을 만족하는 행 존재 여부 확인
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는 조건을 만족하는 첫 번째 행을 찾는 즉시 중단하므로 대규모 데이터셋에서 더 효율적일 수 있습니다.


언제 어떤 것을 사용할까?

INEXISTS는 모두 서브쿼리를 사용하여 행을 필터링하는 데 사용됩니다.

하지만 두 연산자의 동작 방식과 성능 특성에 따라 상황에 따라 적합한 선택이 필요합니다.

IN을 사용하는 경우

  • 서브쿼리가 작고 결과가 고정된 값 목록일 때
  • 단순 값 비교가 필요한 경우

EXISTS를 사용하는 경우

  • 서브쿼리가 큰 테이블을 대상으로 할 때
  • 상관 서브쿼리에서 성능 최적화가 필요할 때
  • NULL 값으로 인한 예외를 피하고 싶을 때

실무에서는 서브쿼리의 크기와 NULL 포함 여부, 그리고 성능 요구사항에 따라 적절히 선택하는 것이 중요합니다.

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!