학습 자료

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 포함 여부, 그리고 성능 요구사항에 따라 적절히 선택하는 것이 중요합니다.

Quiz
0 / 1

SQL 문에서 IN과 EXISTS의 주요 차이점 중 하나는 무엇인가요?

IN은 조건을 행 단위로 하나씩 확인합니다.

EXISTS는 서브쿼리의 모든 결과를 먼저 수집한 후 비교합니다.

IN은 서브쿼리의 모든 결과를 먼저 수집한 후 비교합니다.

EXISTS는 NULL 값이 있으면 예기치 않게 실패할 수 있습니다.

학습 자료

AI 튜터

디자인

업로드

수업 노트

즐겨찾기

도움말