개발 수업/DB
[Oracle/SQL] 서브쿼리
오늘 하루s
2023. 6. 12. 21:03
728x90
더보기
Day30. 230613
서브쿼리
SQL문장 안에서 보조로 사용되는 또 다른 SELECT문.
1) 단일행 서브쿼리
CLARK와 같은 부서근무자들의 사원번호, 사원명, 부서번호를 조회
1
2
3
4
5
6
|
select empno, ename, deptno --스칼라서브쿼리
from emp --인라인뷰
where deptno = (select deptno
from emp
where ename='CLARK')
and sal>2500;
|
cs |
-- 전제 사원평균급여보다 많이 받는 사원번호,이름,부서번호,급여
-- 고액급여자부터
1
2
3
4
5
|
select empno, ename, deptno, sal
from emp
where sal> (select avg(sal)
from emp)
order by sal desc;
|
cs |
7369사원과 같은 일을 하는 사원정보 조회
1
2
3
4
5
|
select empno, job, ename, deptno, sal
from emp
where job = (select job
from emp
where empno='7369');
|
cs |

급여를 제일 많이 받는 사원의 정보
1
2
3
4
|
select *
from emp
where sal = (select max(sal)
from emp);
|
cs |
2) 다중행 서브쿼리
- 다중행 서브쿼리연산자 : in(서브쿼리), any(서브쿼리), all(서브쿼리),exists(서브쿼리)
in(서브쿼리)
10번부서에 근무하는 사원들과 동일업무에 종사하는 사원정보 조회
(=MANAGER,PRESIDENT,CLERK과 동일업무에 종사하는 사원정보 조회)
1
2
3
4
5
6
7
8
|
select *
from emp
where job in ('MANAGER', 'PRESIDENT', 'CLERK');
select *
from emp
where job = 'MANAGER' or job = 'PRESIDENT' or job = 'CLERK';
|
cs |
10번부서에 근무하는 사원들과 동일급여를 받는 사원정보 조회
(= 1300,2450,5000를 받는 사원정보 조회)
1
2
3
4
5
|
select *
from emp
where sal in (select sal
from emp
where deptno = 10);
|
cs |
all(서브쿼리)
모든 10번부서에 근무하는 사원들보다 이상 받는 사원정보 조회
1
2
3
4
5
|
select *
from emp
where sal >= all(select sal
from emp
where deptno = 10);
|
cs |

모든 slaesman 직업급여보다 많이 받는 사원정보를 조회
1
2
3
4
5
|
select *
from emp
where sal>all(select sal
from emp
where job='SALESMAN');
|
cs |
any(서브쿼리)
10번부서에 근무하는 사원들보다 이상 받는 사원정보 조회
1
2
3
4
5
|
select *
from emp
where sal >= any(select sal
from emp
where deptno = 10);
|
cs |

slaesman 직업급여보다 많이 받는 사원정보를 조회
1
2
3
4
5
|
select *
from emp
where sal>any(select sal
from emp
where job='SALESMAN');
|
cs |
exists(서브쿼리)
1
2
3
4
5
|
select *
from emp
where exists(select 1
from emp
where job='PRESIDENT');
|
cs |
1
2
3
4
5
|
select *
from emp
where exists(select count(*)
from emp
where job='PRESIDENT');
|
cs |
연관성이 있는 서브쿼리
: 메인쿼리의 테이블과 조인 조건이 걸린 서브쿼리를 말한다.
부하직원이 있는 상사의 정보를 조회
1
2
3
4
5
|
select empno, ename, sal
from emp e
where exists (select empno
from emp
where e.empno=mgr);
|
cs |
스칼라 서브쿼리
: 서브쿼리가 메인쿼리의 select절, 서브쿼리의 실행결과가 단일행만 반환하는 서브쿼리
1
2
3
4
5
6
7
8
9
10
11
12
|
select dname,
(select count(*) AS empCNT
from emp
where deptno=dept.deptno)
from dept;
select dname,
(select count(*)
from emp
where deptno=dept.deptno)AS empCNT
from dept;
|
cs |
728x90