IN과 EXISTS는 SQL에서 서브쿼리를 사용할 때 자주 비교되는 연산자입니다.
둘 다 특정 조건을 만족하는 데이터를 조회할 때 사용되지만, 작동 방식과 성능 차이가 있습니다.
IN과 EXISTS의 차이| 비교 항목 | IN | EXISTS |
|---|---|---|
| 작동 방식 | 서브쿼리 결과를 리스트 형태로 가져와 비교 | 서브쿼리가 조건을 만족하는지 여부만 판단 |
| 검사 방식 | 메인쿼리의 각 행을 서브쿼리 결과와 비교 | 서브쿼리가 만족하는 데이터가 있으면 즉시 TRUE 반환 |
| NULL 처리 | IN에서 NULL이 포함되면 예기치 않은 결과 발생 가능 | EXISTS는 NULL 값의 영향을 받지 않음 |
| 일반적인 성능 | 서브쿼리 결과가 적을 때 유리 | 서브쿼리 결과가 많을 때 유리 |
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을 사용해야 할까?
NULL을 포함하지 않는 경우 JOIN보다 가독성이 좋은 경우 🚨 주의점
IN의 서브쿼리에 NULL이 포함되면 비교 연산이 실패할 수 있음 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를 사용해야 할까?
🚀 성능 차이
EXISTS는 첫 번째로 조건을 만족하는 행이 나오면 즉시 종료 IN은 전체 리스트를 만들어서 비교해야 하므로 더 느릴 수 있음 IN vs EXISTS 성능 비교IN이 더 유리)SELECT *
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'Seoul');
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가 훨씬 빠름 IN과 EXISTS를 사용해야 할까?| 상황 | IN 사용 | EXISTS 사용 |
|---|---|---|
| 서브쿼리 결과가 적음 (100개 이하) | ✅ | ❌ |
| 서브쿼리 결과가 많음 (수천 개 이상) | ❌ | ✅ |
NULL 값이 포함될 가능성이 있음 | ❌ | ✅ |
| 단순한 조건 비교가 필요함 | ✅ | ❌ |
| 조인 형태로 최적화될 가능성이 있음 | ✅ | ❌ |
| 빠르게 조건 만족 여부만 확인해야 함 | ❌ | ✅ |
IN EXISTSEXISTS를 사용하라.EXPLAIN)을 확인하고 최적의 방법을 선택하라.➡ 결론적으로 데이터가 많을수록 EXISTS가 더 효율적이며, 데이터가 적을 때는 IN이 더 직관적이고 성능 차이가 거의 없음. 🚀