코딩하는 도로시

코딩 교육, 코딩 과학, 코딩 동화, 코딩 게임 등등! 아이부터 어른까지 모두 가능한 코딩! 함께 해보아요~~

개발메모장

SQL 서브쿼리

dorosy 2014. 12. 18. 17:09

<서브쿼리>  

:  select 문 안에 기술된 select 문


- 서브쿼리가 먼저 실행된 다음 메인 쿼리가 실행
- 서브쿼리의 분류
  * 위치에 따라
      --select 다음 : scalar 서브 쿼리
      --from 다음 : inline view
      --where 다음 : 서브쿼리
  * 유형에 따라
      -- 단일행 : 하나의 행을 리턴
      -- 다중행 : 여러 개의 행을 리턴, 다중행 연상자 in, all, any, exists 를 사용
      -- 다중열
      

 

1) 단일행 서브쿼리 : where 절의 조건에 사용.
  -- SMITH의 관리자 이름을 출력
  select mgr from emp where ename='SMITH'; -- 의 실행결과 mgr 번호 7902를 얻은 다음
  select ename from emp where empno=7902;  -- 7902에 해당하는 사원의 이름을 출력.
  --> 한문장으로 합치면
  select ename from emp where empno=(select mgr from emp where ename='SMITH');
-- 셀프조인으로 할 수 있잖아.
  -- 소량의 데이터를 처리할 때는 취향
  -- 대량의 데이터를 처리할 때는 조인이 유리
  -- 일부의 데이터를 처리할 때는 서브쿼리가 유리

 

 

 

 

-- ex>
-- 1 SMITH 보다 급여가 높은 사원들의 이름과 급여
select ename, sal from emp where sal > (select sal from emp where ename='SMITH'); 

 

-- 2 평균급여보다 많은 급여를 받느 사원들의 이름과 급여를 출력
select ename, sal from emp where sal > (select avg(sal) from emp); 

 

-- 3 전체 평균 급여보다 높은 평균 급여를 받는 부서의 부서번호와 평균급여를 출력
select deptno, avg(sal) from emp group by deptno having avg(sal) > (select avg(sal) from emp);

 

 

-- 연습문제.
 -- 0. JONES의 부서명을 출력
 select dname from dept where deptno = (select deptno from emp where ename='JONES');
 
 -- 1. 인사테이블에서 9월 22일 입사자보다 높은 급여를 받는 직원 출력
 select * from insa where basicpay > ( select basicpay from insa where to_char(ibsadate,'mm/dd') = '09/22');
 
 -- 2. 총무부의 평균 급여보다 많은 급여를 받는 직원들의 이름, 부서명, 급여 출력
 select name, buseo, basicpay from insa where basicpay > (select avg(basicpay) from insa where buseo='총무부');
 
 -- 3. 총무부 직원들보다 더 많은 급여를 받는 직원 정보
  select * from insa where basicpay > (select max(basicpay) from insa where buseo='총무부');
 
 -- 4. 직원 전체 평균 급여보다 많은 급여를 받는 부서별 직원의 수를 인원수대로 정렬
 select count(*) from insa where basicpay > (select avg(basicpay) from insa) group by buseo order by count(*);
 
 -- 5. '홍길동' 직원과 같은 부서의 직원 정보(홍길동 제외)
 select * from insa where buseo = (select buseo from insa where name='홍길동') and name != '홍길동';
 
 -- 6. emp에서 부서번호가 10인 사원 중에서 최대 급여를 받는 사원과 동일한 급여를 받는 사람의 사번과 이름, 급여를 출력
 select ename, sal from emp where sal = (select max(sal) from emp where deptno=10);
 
 -- 7. KING에게 보고하는 모든 사원의 이름과 급여를 출력
 select ename, sal from emp where mgr = (select empno from emp where ename='KING');
 
 -- 8. emp테이블에서 최고 급여자의 이름과 급여를 출력하시오
 select ename, sal from emp where sal = (select max(sal) from emp);
 
 -- 9. 부서 10에서 부서 30에서 comm을 받는 사원과 같은 업무를 맡고 있는 사원의 부서명, 이름, 직책, 급여등급을 출력
 select dname, ename, job, grade from dept d, emp e, salgrade s
 where d.deptno = e.DEPTNO and sal between losal and hisal and d.deptno=10
 and job = (select distinct(job) from emp where deptno=30 and comm>0);
 
 -- 10. 최고급여자의 이름과 부서명을 출력하시오
 select ename, dname from emp e, dept d where e.deptno = d.deptno and sal = (select max(sal) from emp);
 
 -- 11. 30번 부서의 최저 급여보다 높은 급여를 받는 사원을 출력
 select * from emp where sal > (select min(sal) from emp where deptno=30);
 
 -- 12. emp에서 BLAKE와 같은 부서에서 근무하는 사원의 이름과 입사일자를 출력
 select ename, hiredate from emp where deptno = (select deptno from emp where ename='BLAKE');
 
 -- 13. 20번 부서의 평균급여보다 높은 급여를 받는 사원의 부서명, 이름, 급여를 출력
 select dname, ename, sal from emp e, dept d where e.deptno = d.deptno
 and sal > (select avg(sal) from emp where deptno=20);
 
 -- 14. 20번 부서의 평균급여보다 높은 급여를 받는 사원들을 대상으로 부서명, 평균급여를 부서명 오름차순으로 출력
 select dname, avg(sal) from emp e, dept d where e.deptno=d.deptno
 and sal > (select avg(sal) from emp where deptno=20) group by dname order by dname;
 
 -- 15. 20번 부서의 평균급여보다 높은 급여를 받는 사원들이 2명이상 있는 부서의 부서명, 평균급여를 부서명 오름차순으로 출력
 select dname, avg(sal) from emp e, dept d where e.deptno=d.deptno
 and sal>(select avg(sal) from emp where deptno=20) group by dname having count(*)>=2 order by dname;
 
 -- 16. ALLEN과 같은 입사년도에 입사한 사원들의 부서위치, 사원명, 이름, 급여를 이름, 급여 내림차순으로 출력
 select loc, ename, dname, sal from emp e, dept d where e.deptno=d.deptno
 and hiredate = (select hiredate from emp where ename='ALLEN') order by ename desc, sal desc;
 

'개발메모장' 카테고리의 다른 글

다중컬럼 서브쿼리  (0) 2014.12.18
상관관계 서브쿼리, 복수행 서브쿼리  (0) 2014.12.18
SQL Join  (0) 2014.12.18
SQL 예제2  (0) 2014.12.18
SQL 날짜 관련 명령어, 그룹함수, 조건명령문  (0) 2014.12.18