[ Oracle ] 서브쿼리(SubQuery) | 서브쿼리 예제

2021. 4. 5. 17:20·Archive/Develop
728x90
반응형

 

Oracle SubQuery 특징

 

 

  • () 안에 작성한다.
  • 외부쿼리(=메인쿼리)와 비교할 때 알맞은 연산자를 사용한다. (단일행/복수행, 단일 컬럼/복수 컬럼)
  • 연관성이 있는 쿼리(correlated subquery) 또는 없는 쿼리
  • group by, order by 절을 제외하고 모든 절에 사용 가능하다.

 

복수행이 리턴될 때

 

 

  • < any : 서브 쿼리 리턴 값 중 최대값
  • < any : 서브 쿼리 리턴 값 중 최소값
  • < all : 서브 쿼리 리턴값 중 최소값
  • > all : 서브 쿼리 리턴 값 중 최대값

 

 

Scott 스키마를 활용한 Subquery 활용

 

 

< DEPT 테이블 구조 >

 

 

 

 

 

 

< EMP 테이블 구조 >

 

 

 

 

 

문제 :  부서명이 'SALES' 인 사원의 사번과 이름은?

 

 

< join 을 이용한 경우 >

 

select empno, ename from emp e

join dept d on d.deptno=d.deptno

where d.dname='SALES';

 

 

 

< SubQuery 를 이용한 경우 >

 

 

select empno, ename from emp
where deptno in (select deptno
from dept
where dname='SALES');

 

 

 

 

문제 : 사번이 '7844'인 사원의 job 과 동일한 job 인 사원의 사번, 이름, job 을 출력!

 

 

select empno,ename,job
from emp 
where job in (select job from emp where empno='7844');

 

 

 

 

 

 

 

문제 : 사번이 '7521' 인 사원의 job 과 동일하고

'7900' 인 사번의 급여보다 많은 급여를 받는 사원의 사번, 이름, job, 급여를 출력하라

 

 

select empno, ename, job, sal
from emp
where job in (select job from emp where empno='7521') and
sal > (select sal from emp where empno='7900');

 

 

 

 

 

 

문제 : 가장 적은 급여를 받는 사원의 사번, 이름, 급여를 출력!

 

 

 

select empno, ename, sal from emp
where sal = (select min(sal) from emp);

 

 

 

 

문제 : 부서별 최소 급여 중에서 30번 부서의 최소급여보다는 큰 최소급여인 부서의

부서번호, 최소 급여를 출력하라

 

 

select deptno,min(sal) 
from emp 
group by deptno
having min(sal)>(select min(sal) from emp where deptno='30');

 

 

 

 

 

문제 : job이 CLERK 인 사원이 2명 이상 있는 부서의 부서번호, 부서명을 출력하라

 

 

< Join 으로 풀기 >

 

 

select d.deptno, d.dname
from emp e join dept d on e.deptno=d.deptno
where e.job='CLERK'
group by d.deptno,d.dname
having count(*)>=2;

 

 

 

 

<SubQuery 로 풀기>

 

 

 

select deptno, dname
from dept
where deptno = (
select deptno from emp 
where job='CLERK'
group by deptno
having count(*)>=2
);

 

 

 

 

 

 

<correlated subquery 로 풀기>

 

 

select deptno,dname
from dept d
where 2 <=(select count(*)
            from emp
            where job='CLERK' and d.deptno=deptno);

 

 

 

 

 

 

문제 : job 이 'CLERK' 인 사원이 한명이라도 있는 부서의 부서명만 출력하라

 

 

exists : 존재하냐를 묻는 키워드이다.

 

 

select dname
from dept d
where exists (select *
              from emp e
              where job='CLERK' and
              d.deptno=e.deptno);

 

 

 

 

 

문제 : 각 부서별로 최소 급여를 받는 사원의 부서번호, 부서명, 사번, 이름, 급여를 출력하라

 

 

select d.deptno,d.dname, e.empno, e.ename, e.sal
from dept d join emp e on d.deptno=e.deptno
where (d.deptno,e.sal) in 
(select deptno,min(sal) from emp group by deptno);

 

 

 

 

이런식으로 풀어도 된다.

 

 

 

select deptno, (select dname from dept where e.deptno=deptno),
empno, ename, sal
from emp e
where (deptno,sal) in (select deptno, min(sal)
from emp group by deptno);

 

 

문제 : 직속상사가 없는 사원을 포함해서

부하직원사번, 부하직원명, 직속상사사번, 직속상사명을  출력하라

 

 

select empno, ename, mgr, 
(select ename from emp where e.mgr=empno)
from emp e;

 

 

 

 

 

 

문제 : 평균 급여보다 많거나 같고 최대 급여보다는 적은 급여를 받는 사원의

사번, 이름, 급여를 출력하라

 

 

select empno, ename, sal
from emp
where 
sal>=(select avg(sal) from emp) 
and
sal < (select max(sal) from emp);

 

 

 

 

 

 

select empno, ename, sal
from emp e
join
(select avg(sal) a,max(sal) m from emp) i
on e.sal >= i.a and e.sal < i.m

 

 

이런 식으로 풀어도 된다.

 

 

 

 

 

 

* rownum : 쿼리의 결과로 반환되는 로우에 붙혀지는 일련번호로 의사컬럼이다.

 

 

 

 

 

문제 : 월급이 높은 순으로 사번, 이름, 월급을 상위 5명만 출력하라

 

 

select empno, ename, sal 
from (select * from emp order by 3 desc)
where rownum <=5
order by 3 desc;

 

 

 

728x90
반응형

'Archive > Develop' 카테고리의 다른 글

[ C++ ] C++ 동적 메모리 할당 및 반환  (0) 2021.04.06
[ Django ] Django Mobile Debugging | 장고 서버 모바일 | Django IP 지정  (0) 2021.04.05
[ Django ] Django Tutorial 001 | DjangoProject 환경 구축  (0) 2021.03.31
[ CodeUp ] 1차원 배열 | 1420 번 풀이  (0) 2021.03.31
[ CodeUp ] 1차원 배열 | 1416 번 풀이  (0) 2021.03.31
'Archive/Develop' 카테고리의 다른 글
  • [ C++ ] C++ 동적 메모리 할당 및 반환
  • [ Django ] Django Mobile Debugging | 장고 서버 모바일 | Django IP 지정
  • [ Django ] Django Tutorial 001 | DjangoProject 환경 구축
  • [ CodeUp ] 1차원 배열 | 1420 번 풀이
코뮤(commu)
코뮤(commu)
코딩으로 커뮤니케이션하는 코뮤입니다 😎
  • 코뮤(commu)
    코뮤(COMMU)
    코뮤(commu)
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Archive
        • Hacking
        • Develop
        • ETC
      • Algorithm
      • DB&Infra
      • ETC
      • Node
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • IT지식보따리
    • IT가 맛있다
    • IT 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

    javascript
    파이썬 백준
    자바스크립트 객체
    코드업 파이썬 기초 100제
    코드업
    파이썬
    장고
    파이썬 기초 문제
    백준
    파이썬 기초
    Oracle
    비박스
    파이썬 문제
    Codeup
    백준 파이썬
    백준 풀이
    oracle db
    docker
    자바스크립트
    Django
    파이썬 알고리즘
    카카오 100일 프로젝트
    백준 문제풀이
    오라클
    보안뉴스
    Git
    자바스크립트 API
    코드업 기초
    C++
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮤(commu)
[ Oracle ] 서브쿼리(SubQuery) | 서브쿼리 예제
상단으로

티스토리툴바