서브쿼리

  • 쿼리문 안에 들어가는 쿼리문을 서브쿼리라고 한다.
  • 쿼리문 작성시 사용되는 값을 다른 쿼리문을 통해 구해야 할 경우 사용한다.

ex)

-- SCOTT사원이 근무하고 있는 부서의 이름을 가져온다.
select dname
from dept
where deptno = (select deptno
                from emp
                where ename = 'SCOTT');
                
-- join으로도 가능하다.
select a2.dname
from emp a1, dept a2
where a1.deptno = a2.deptno and a1.ename = 'SCOTT';

ex)

-- SMITH와 같은 부서에 근무하고 있는 사원들의 사원번호, 이름, 급여액, 부서이름을 가져온다.
select a1.empno, a1.ename, a1.sal, a2.dname
from emp a1, dept a2
where a1.deptno = a2.deptno and a1.deptno = (select deptno
                                            from emp
                                            where ename = 'SMITH');

ex)

-- MARTIN과 같은 직무를 가지고 있는 사원들의 사원번호, 이름, 직무를 가져온다.
select empno, ename, job
from emp
where job = (select job
            from emp
            where ename = 'MARTIN');

ex)

-- ALLEN과 같은 직속상관을 가진 사원들의 사원번호, 이름, 직속상관이름을 가져온다.
-- a : 사원의 정보
-- b : 직속상관 정보
select a.empno, a.ename, b.ename
from emp a, emp b
where a.mgr = b.empno and a.mgr = (select mgr
                                from emp
                                where ename = 'ALLEN');

ex)

-- WARD와 같은 부서에 근무하고 있는 사원들의 사원번호, 이름, 부서번호를 가져온다.
select a.empno, a.ename, b.deptno
from emp a, dept b
where a.deptno = b.deptno and a.deptno = (select deptno
                                        from emp
                                        where ename = 'WARD');

ex)

-- SALESMAN의 평균 급여보다 많이 받는 사원들의 사원번호, 이름, 급여를 가져온다.
select empno, ename, sal
from emp
where sal > (select avg(sal)
            from emp
            where job = 'SALESMAN');

ex)

-- DALLAS 지역에 근무하는 사원들의 평균급여를 가져온다.
select trunc(avg(sal))
from emp a, dept b
where a.deptno = b.deptno and b.loc = (select loc
                                    from dept
                                    where loc = 'DALLAS');

ex)

-- SALES 부서에 근무하는 사원들의 사원번호, 이름, 근무지역을 가져온다.
select a1.empno, a1.ename, a2.loc
from emp a1, dept a2
where a1.deptno = a2.deptno and a1.deptno = (select deptno
                                            from dept
                                            where dname = 'SALES');

ex)

-- CHICAGO 지역에 근무하는 사원들 중 BLAKE가 직속상관인 사원들의 사원번호, 이름, 직무를 가져온다.
select empno, ename, job
from emp
where deptno = (select deptno
                from dept
                where loc = 'CHICAGO')
                and mgr = (select empno
                        from emp
                        where ename = 'BLAKE');