서브쿼리

: sql문장 내부에 또 다른 sql이 나오는 형태

서브쿼리의 종류

- 단일행 서브쿼리 : 실행결과 행이 한 개

연산자(>, <, >=, <=, =) 사용

- 다중행 서브쿼리: 실행결과 행이 두 개 이상

연산자(in, any, all,,,) 사용

서브쿼리의 활용

: 튜닝기법

테이블 조인 시, 테이블의 필드 갯수,데이터가 많은 경우 검색 속도가 느려진다.

서브쿼리를 적절히 활용하여 실행속도를 빠르게 할 수 있다.

 


- where 조건문에서의 서브쿼리(select)

//scott의 sal보다 더 많이 받는 사원 정보
select empno, ename, job, sal from emp
where sal >(select sal from emp where ename='SCOTT');

//입사일이 가장 오래된 사원 정보 
select ename, hiredate from emp
where hiredate=(select min(hiredate) from emp);

//조건 두개
select empno, ename, job, sal from emp
where job=(select job from emp where empno=7521)
and sal> (select sal from emp where empno=7934);

 

- from ~ where 사이의 서브쿼리(사용 빈도 높음)

조인 시 테이블의 모든 필드를 메모리에 올려서 작업하는 것은 검색 속도를 느리게 한다.

조건에 만족하는 필드만 메모리에 올려 작업하여 실행속도를 빠르게 할 수 있다.

//업무가 manager인 사원의 정보 출력
select e.ename, e.job, d.loc
from (select ename,job from emp where job='MANAGER') e, dept d
where e.deptno=d.deptno;

 

- select ~ from 사이의 서브쿼리(사용 빈도 낮음)

//loc가 뉴욕이면 중앙, 나머지는 주변 출력
select dname, loc, (case when deptno=
(select deptno from dept where loc='NEW YORK')
then '뉴욕' else '그외' end) "부서위치" 
from dept;

DNAME          LOC           부서위치
-------------- ------------- -------
ACCOUNTING     NEW YORK      뉴욕
RESEARCH       DALLAS        그외
SALES          CHICAGO       그외
OPERATIONS     BOSTON        그외

 

- insert into ~ values 사이의 서브쿼리(사용 빈도 낮음)

insert into (select empno,ename,sal,hiredate,job,deptno from b_emp 
where deptno=40)                               
values (7777,‘JANG’,4000,to_date('20-12-21', 'rr-mm-dd'),‘MANAGER’, 40);
//현재 b_emp에는 deptno가 40인 데이터가 존재하지 않지만 
//select문 안에 조건으로 넣어주는 이유는 where deptno=40 을 넣을 필드를 찾는 것이기 때문.

 

- update 테이블명 set ~ where 사이의 서브쿼리

update 수정할테이블명
       set 필드명1=수정값1, 필드명2=수정값2, ..
       set (필드명1,필드명2,..) = (서브쿼리)
where 조건식;
//scott의 업무와 급여가 일치하도록 jones의 정보를 수정
update b_emp set (job,sal) = (select job,sal from b_emp where ename='SCOTT')
where ename='JONES';

 

- where 조건문에서의 서브쿼리(delete)

//부서명이 sales인 사원의 정보 삭제
delete from b_emp where deptno=(select deptno from dept
where dname='SALES');

 

- 그룹함수와 함께 사용

//부서별 최소급여가 20번 부서의 최소급여보다 많이 받는 부서의 정보  
select deptno, min(sal) from emp
group by deptno 
having min(sal)>(select min(sal) from emp where deptno=20)

 

 

--다음 포스팅에 이어서 정리할 예정입니다.

 

+ Recent posts