2008. 8. 20. 16:06

Chap 8. 서브쿼리

서브쿼리란 하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 경우에 사용하는 기능이다.

서브퀴리에 기술되는 select 문은 괄호()로 묶어주어야 하며, 서브쿼리가 실행이 된 후,
메인쿼리가 실행 된다.

단일행 서브쿼리
하나의 행만 검색하여 그 결과를 메인쿼리에 보내는 것
// 존스의 deptno를 emp 테이블에서 검색하고 dept테이블에 적용시켜 dname을 검색
select dname
from dept
where deptno=(select deptno
                      from emp
                      where ename='JONES');
서브쿼리에서는 그룹함수의 사용이 가능하다.
// emp 테이블에서 평균급여보다 높은 직원의 이름과 급여를 출력하라.
select ename, sal
from emp
where sal > (select avg(sal)
                   from emp);

다중행 서브쿼리
서브쿼리에서 반환되는 결과가 하나 이상의 행일 때 사용한다.

종류

의미

IN

메인 쿼리의 비교 조건(‘=’ 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라도 일치하면 참입니다.

ANY, SOME

메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참입니다.

ALL

메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참입니다.

EXIST

메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참입니다.

================================================================================
1.SMITH와 동일한 직급을 가진 사원의 이름과 직급을 출력하라.(단일행 서브 쿼리 이용)
select ename, job
from emp
where job=(select job
                 from emp
                 where ename='SMITH')
/
2. 부서별로 가장 급여를 많이 받는 사원의 정보를 출력하라.(IN 연산자 이용)
select *
from emp
where sal in(select max(sal)
                   from emp
                   group by deptno)
/
3. 직급이 'SALESMAN'인 사원이 받는 급여들의 최대 급여보다 많이 받는 사원들의 이름과 급여를 출력하되
   부서번호가 20번인 사원은 제외한다.(ALL 연산자 이용)
select ename, sal
from emp
where sal > all (select max(sal)
                        from emp
                        where job='SALESMAN')
/
4. 직급이 'SALESMAN'인 사원이 받는 급여들의 최소 급여보다 많이 받는 사원들의 이름과 급여를 출력하되
부서번호가 20번인 사원은 제외한다.(ANY 연산자 이용)
select ename, sal
from emp
where sal > any (select min(sal)
                  from emp
                  where job='SALESMAN'
                  and deptno not in(20))
================================================================================

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
Chap 6. 그룹함수  (0) 2008.08.14
Chap 5. SQL 주요 함수  (0) 2008.08.13