본문 바로가기

데이터베이스/SQL & PL/SQL

[SQL] WHERE 절을 활용하자, EXISTS!


EXISTS는 IN과 유사한 개념입니다. 하지만 적용되는 범위가 다른데요.

IN의 괄호( ) 사이에는 특정값이나, 서브쿼리가 올 수 있는 반면에
EXISTS의 () 사이에는 서브쿼리만 올 수 있습니다.

그리고 IN는 ( ) 안에 있는 특정값이나 서브쿼리의 결과값이 포함이 되는지만 체크를 하지만
EXISTS는 () 안의 서브쿼리로 부터 해당 컬럼의 값이 존재 유무만 체크를 합니다.
서브쿼리에 관한 것은 다른글을 참조하면 되겠습니다.

우선 IN을 통해서 부서아이디가 100 또는 110인 부서를 조회해봅시다.
IN을 이용한 방법 2가지와 EXIST 문을 작성하겠습니다. 참고로 셋다 같은 결과를 반환하도록 작성할 것이구요.

1. IN에 특정값을 명시해줬습니다.
SELECT department_id, employee_id, first_name, salary
FROM hr.employees
WHERE department_id IN (100, 110);

2. IN에 서브쿼리를 넣어줬습니다.(그냥 의미없는거에요. 보시라고.. 이렇게도 할 수 있다.)
SELECT department_id, employee_id, first_name, salary
FROM hr.employees
WHERE department_id IN
           (SELECT department_id
            FROM departments
            WHERE department_id IN(100, 110));

3. 서브쿼리를 이용한 EXISTS 입니다. 
SELECT department_id, employee_id, first_name, salary
FROM hr.employees emp
WHERE EXISTS
           (SELECT department_id
            FROM departments dep
            WHERE department_id IN(100, 110)
            AND emp.department_id=dep.department_id);

왜 이렇게 하냐구요?
IN과 EXISTS는 동일한 결과를 보여줌에도 불구하고 EXISTS가 더 좋은 성능을 보여주기 때문이죠.
이해는 안가실테지만 SQL 실행계획을 보시면 EXISTS가 더 좋다라는 것을 알게 될거에요.
그래서 단순히 특정 컬럼의 값을 이용할때는 IN을 이용하구요 서브쿼리를 이용할때는 EXISTS를 이용하는 것이 성능이 좋습니다.

서브쿼리는 EXISTS! 꼭 기억하세요!


도움 되셨다면 댓글 부탁드립니다.