서브쿼리
: 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)
--다음 포스팅에 이어서 정리할 예정입니다.
'DB(ORACLE)' 카테고리의 다른 글
트랜잭션 인덱스 시퀀스 (0) | 2021.06.15 |
---|---|
[Oracle]오라클 서브쿼리 / 다중행 서브쿼리 비교 연산자-IN, ANY, SOME, ALL, EXISTS (0) | 2021.06.13 |
[Oracle]오라클 조인, outer join, self join, ansi join (0) | 2021.06.10 |
[Oracle]오라클 조인개념, cross join, inner join (0) | 2021.06.08 |
[Oracle]데이터 타입, varchar2 char 차이점, 자료형 변경 (0) | 2021.05.31 |