IN 과 EXISTS 의 차이

SQL 공부

목록 보기
7/11

INEXISTS는 SQL에서 서브쿼리를 사용할 때 자주 비교되는 연산자입니다.
둘 다 특정 조건을 만족하는 데이터를 조회할 때 사용되지만, 작동 방식과 성능 차이가 있습니다.


1. INEXISTS의 차이

비교 항목INEXISTS
작동 방식서브쿼리 결과를 리스트 형태로 가져와 비교서브쿼리가 조건을 만족하는지 여부만 판단
검사 방식메인쿼리의 각 행을 서브쿼리 결과와 비교서브쿼리가 만족하는 데이터가 있으면 즉시 TRUE 반환
NULL 처리IN에서 NULL이 포함되면 예기치 않은 결과 발생 가능EXISTSNULL 값의 영향을 받지 않음
일반적인 성능서브쿼리 결과가 적을 때 유리서브쿼리 결과가 많을 때 유리

2. IN 사용 예제

SELECT *
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'Seoul');

🔹 departments 테이블에서 서울에 있는 부서 ID를 조회한 후, employees 테이블에서 해당 부서에 속한 직원들을 찾음

실행 방식:
1. departments 테이블에서 id 값을 리스트로 가져옴 ((10, 20, 30))
2. employees 테이블에서 department_id가 이 리스트에 포함된 행을 찾음

언제 IN을 사용해야 할까?

  • 서브쿼리의 결과가 소수의 값(예: 100개 미만)일 때
  • 비교 대상이 NULL을 포함하지 않는 경우
  • 간단한 서브쿼리라서 JOIN보다 가독성이 좋은 경우

🚨 주의점

  • IN의 서브쿼리에 NULL이 포함되면 비교 연산이 실패할 수 있음
  • 서브쿼리 결과가 너무 많으면 성능이 저하될 수 있음

3. EXISTS 사용 예제

SELECT *
FROM employees e
WHERE EXISTS (
    SELECT 1 
    FROM departments d
    WHERE d.id = e.department_id
    AND d.location = 'Seoul'
);

🔹 departments 테이블에서 서울에 있는 부서 ID가 존재하는지 확인한 후, employees 테이블에서 해당 부서에 속한 직원들을 찾음

실행 방식:
1. employees 테이블에서 각 행에 대해 EXISTS 서브쿼리를 실행
2. 최초로 조건을 만족하는 행이 발견되면 즉시 TRUE 반환(전체 리스트를 가져오지 않음)
3. 만족하는 행이 없으면 FALSE

언제 EXISTS를 사용해야 할까?

  • 서브쿼리의 결과가 많을 때 (예: 수천 개 이상)
  • 메인쿼리의 조건을 만족하는지 여부만 확인할 때
  • NULL 값을 포함한 비교를 피하고 싶을 때

🚀 성능 차이

  • EXISTS첫 번째로 조건을 만족하는 행이 나오면 즉시 종료
  • 반면 IN은 전체 리스트를 만들어서 비교해야 하므로 더 느릴 수 있음

4. IN vs EXISTS 성능 비교

🔥 데이터가 적을 때 (IN이 더 유리)

SELECT * 
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'Seoul');
  • 서브쿼리의 결과가 10~100개 이하라면 IN이 빠름
  • 옵티마이저가 내부적으로 JOIN으로 변환할 수도 있음

🔥 데이터가 많을 때 (EXISTS가 더 유리)

SELECT * 
FROM employees e
WHERE EXISTS (
    SELECT 1 
    FROM departments d
    WHERE d.id = e.department_id
    AND d.location = 'Seoul'
);
  • 서브쿼리 결과가 많으면 첫 번째로 조건을 만족하는 순간 즉시 종료
  • 서브쿼리 결과가 크면 IN보다 EXISTS가 훨씬 빠름

📌 결론: 언제 INEXISTS를 사용해야 할까?

상황IN 사용EXISTS 사용
서브쿼리 결과가 적음 (100개 이하)
서브쿼리 결과가 많음 (수천 개 이상)
NULL 값이 포함될 가능성이 있음
단순한 조건 비교가 필요함
조인 형태로 최적화될 가능성이 있음
빠르게 조건 만족 여부만 확인해야 함

🔹 최적의 선택법

  1. 서브쿼리의 결과 개수를 예상하라!
    • 적으면 IN
    • 많으면 EXISTS
  2. NULL 값이 있다면 EXISTS를 사용하라.
  3. 실제로 실행 계획(EXPLAIN)을 확인하고 최적의 방법을 선택하라.

➡ 결론적으로 데이터가 많을수록 EXISTS가 더 효율적이며, 데이터가 적을 때는 IN이 더 직관적이고 성능 차이가 거의 없음. 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글