날짜 : 2021-06-30

태그 : SQL 서브쿼리

메모

아래에 설명된 모든 예제는 oracle 기준으로 작성되었습니다.

1. 서브쿼리

서브쿼리는 하나의 select 문으로만으로 원하는데이터를 조회할수 없을때 사용하며 여러개의 select 문장을 하나로 합쳐서 실행가능한 SQL 문으로 만든다.

select sal
 
from emp
 
where ename='SMITH';
 
--smith 의 sal 값인 800을 먼저 출력하고 스미스의 연봉보다 큰 사원의 이름과 연봉을 알고싶을때 이렇게
 
두번의 셀렉을 거쳐야만한다. 하지만 이것을 하나에 처리할 수 있게하는게 서브쿼리개념이다.
 

 
select sal , ename
 
from emp
 
where sal > 800;
 

 
select sal , ename
 
from emp
 
where sal > (select sal from emp where ename='SMITH');
 
--여기서 바깥의 select를 메인쿼리 , ( )괄호안쪽을 서브쿼리라 부르며 서브쿼리가 먼저실행된다.
 
-- 서브쿼리포함 SQL을 만들땐 서브쿼리를 먼저 만들어서 작동확인한후 괄호를 씌우고 메인쿼리를 만드는순으로 하는게 편하고 정확하다.
 
-- where 절의 의미를생각해보자 sal > 800 이 된다.

서브쿼리 예제1

 
select sal , ename
 
from emp
 
where sal >
 
(select sal
 
from emp
 
where ename='CLARK'); --여기서 의미는 where sal > 2450 이 된다.
 
-- CLARK 의 연봉보다 / 큰 값의 사원이름과 연봉을 조회하고싶을때.
 

 
select dname
 
from dept
 
where deptno =
 
(select deptno
 
from emp
 
where ename = 'SMITH');
 
-- join 을 이용하지않고 서브쿼리를 이용한 데이터출력
 

 
select ename
 
from emp
 
where deptno=
 
(select deptno
 
from dept
 
where dname = 'RESEARCH');
 
--리써치부서에 근무하는 사원들의 이름을 출력

서브쿼리 예제 2

select empno,ename,job ,hiredate , sal
 
from emp
 
where job = (select job
 
from emp
 
where empno = '7521')
 
and
 
sal > (select sal
 
from emp
 
where empno = 7934) ;
 
-- 사원번호 7521의 업무(job)와 같고 / 급여가 사원번호 7934 보다 많은 / 사원의 정보들을 출력하라.

서브쿼리 예제 3

 
select empno , ename , job , sal , deptno
 
from emp
 
where sal < (select avg(sal)
 
from emp);
 
--서브쿼리에서의 그룹함수 사용
 
-- sal 값의 평균보다 작은 sal 값의 직원정보를 출력하라.

서브쿼리 예제 4

 
select deptno, min(sal)
 
from emp
 
group by deptno
 
having min(sal) >
 
(select min(sal)
 
from emp
 
where deptno = 20);
 
-- having 절에서 서브쿼리 사용 . 20번 부서중에 최소급여보다 / 많이받는 최소급여 대상자들의 / 모든부서번호와 연봉 최소값을 출력

서브쿼리 예제 5


select job , avg(sal)
 
from emp
 
group by job
 
having avg(sal) =
 
(select min(avg(sal))
 
from emp
 
group by job ); --서브쿼리절은 결과가 1016임.
 
--좀 어려운데. 서브쿼리절뜻 : job별로 sal평균중에 가장작은값min
 
--메인쿼리절 : job별로 sal평균을 검색하는데 / sal평균과 같은 서브쿼리절인것 / (sal평균중 가장작은값).
 

 
select ename ,sal
 
from emp
 
where sal >
 
(select avg(sal)
 
from emp);
 
--사원들의 평균월급보다 / 월급이 높은 사람들의 이름과 월급출력

생각 (질문)

출처 (문헌)

학원에서 준 바인딩 책임

연결 (이유)

참고문헌


에이콘아카데미 출판사