개발 수업/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