라일락 꽃이 피는 날

[Oracle] exists 를 활용한 서브 쿼리 본문

프로그래밍/Oracle

[Oracle] exists 를 활용한 서브 쿼리

eunki 2022. 6. 2. 17:50
728x90

예제 1. 부서 테이블에서 부서 번호, 부서명, 부서 위치를 출력하는데, 사원 테이블에 존재하는 부서 번호에 대한 것만 출력

-- 1. exists 문을 사용하지 않고 수행
select *
    from dept
    where deptno in (select deptno
                        from emp);

서브 쿼리를 수행했을 때, 부서 번호 14개가 메인 쿼리로 리턴된다.

부서 번호의 종류가 3가지밖에 없지만 emp 테이블이 1억 건이라면,

위의 SQL 은 수행 시간이 불필요하게 오래 걸릴 것이다.

 

 

-- 2. exists 문은 사용해서 수행
select *
    from dept d
    where exists (select 'X'
                    from emp e
                    where e.deptno = d.deptno);

in 이 아니라 위와 같이 exists 문을 사용하게 되면 메인 쿼리부터 작동된다.

exists 문은 메인 쿼리의 테이블 건수가 몇 건 안 되고 서브 쿼리의 건수가 많을 때 유용한 SQL 문이다.

dept 테이블이 4건 밖에 없으므로 부서 번호가 emp 테이블에 존재하기만 하면 끝까지 스캔하지 않고 멈춰버린다.

 

 

 

예제 2. 부서 테이블에는 존재하는 부서 번호이나, 사원 테이블에는 존재하지 않는 부서 번호를 출력

select deptno
    from dept d
    where not exists (select 'X'
                        from emp e
                        where e.deptno = d.deptno);
728x90