6. 서브쿼리
6.1 정의
하나의 SQL 문장 내부에 존재하는 또 다른 SELECT문
(비교) 메인쿼리: 서브쿼리를 포함하고 있는 SQL문
(목적) 메인쿼리 내부에서 추가적인 정보 제공
6.2 구분
6.2.1 메인쿼리와의 연관성에 따라
6.2.1.1 연관성이 없는 서브쿼리: 서브쿼리로 산출된 ROW들은 메인 쿼리와 독립적인 서브쿼리
(문제) Emp 테이블에서 월급을 가장 많이 받는 사원정보를 조회하시오.
(문제) 사원들의 평균 월급보다 많은 급여를 받는 사원의 이름, 부서명, 급여를 조회하시오(단일행 서브쿼리).
SELECT e.ename, d.dname, e.sal
FROM Emp e, Dept d
WHERE e.deptno = d.deptno
AND e.sal > ( 사원들의 평균월급 );
(문제) 부서코드:30 에 속한 사원 중 최고급여보다 높은 월급을 받는 사원의 이름, 성, 직책명을 조회하시오(복수행 서브쿼리 : any, all).
select sal from emp
where deptno = 30;
select e2.ename, d.dname
from emp e2, dept d
where e2.deptno = d.deptno
and e2.salary > (구매부서에 근무하는 사원들의 급여)
select e.ename, d.dname, e.sal
from emp e, dept d
where e.deptno = d.deptno
and e.sal > any(select sal from emp where deptno = 30)
order by e.ename, d.dname, e.sal desc;→ any: 서브쿼리의 결과값들 중의 최소값을 의미함(문제) 본인이 받는 급여가 본인이 속한 부서의 평균 급여보다 적은 급여를 받는 직원에 대하여 이름, 급여, 부서번호를 출력하시오.
6.2.2 서브쿼리가 위치하는 곳에 따라 분류
6.2.2.1 일반 서브쿼리
6.2.2.2 인라인 뷰(inline view): from절에 위치
** from절에는 테이블이나 뷰가 위치하는데 이것과 비교해서 서브쿼리에 의해 결과값들에 대해서 부르는 명칭. 인라인 뷰와 비교해서 정식으로 만들어진 뷰를 out of line view라고도 함.
(문제) 사원들의 평균 급여보다는 높고 최대 급여보다는 낮은 월급을 받는 사원들을 조회하시오.
SELECT e.empno, e.ename, e.sal, round(e2.avgs), e2.maxs
FROM emp e,
(select avg(sal) avgs, max(sal) maxs from emp) e2
WHERE e.sal > e2.avgs and e.sal < e2.maxs
ORDER BY e.sal DESC;
(문제) 직책(job)이 "사원"인 사람들이 어떤 부서에 근무하고 있는지 사원의 이름, 직책, 부서 이름을 나타내시오. 단 from절에 서브쿼리문을 사용하여 문장을 완성하시오.
SELECT e.ename, e.job, d.dname
FROM (SELECT ename, job, deptno FROM Emp
WHERE job = '사원' e, dept d
WHERE e.deptno = d.deptno;
6.2.3 scalar 서브쿼리
서브쿼리에 의해 하나의 행, 하나의 컬럼값을 반환하는 서브쿼리. 9i부터 지원
(문제) 각 사원의 이름, 급여, 전 사원의 평균급여를 출력하시오.
SELECT ename, sal, (select avg(sal) from emp) avg_sal
FROM Emp;