본문 바로가기

DB/ORACLE

220829_ORACLE_국비_JOIN/SUB Query

<상사가 king인 사원들의 이름과 직급 출력>

Self Join : 자기 자신과 조인하는 경우에 사용 (같은 컬럼명이 아니어도 사용가능)

 

 

<사원들의 부서명 출력>

Outer Join : 2개 이상의 테이블을 조인 할 때 어느 한쪽 테이블에는 해당하는 데이터가 존재하지 않는데
                   다른쪽의 테이블에는 존재하는 경우 그 데이터는 출력되지 않는 문제를 해결하기 위해 사용

                   모든 데이터를 다 가지고 올때 full scan을 하기 때문에 DB에 부담이 될 수 있음

사용법 : 없는 쪽에 (+)표시

 


SUB Query

  • 서브쿼리는 하나의 select문장의 절 안에 포함된 또 하나의 select 문
  • 서브쿼리는 비교 연산자의 오른쪽에 기술하며 괄호안에 삽입
  • 메인 쿼리가 실행되기 전에 1번만 실행

 

<'JONES'의 부서명 출력>

방법1)

방법2_Join)

방법3_SUB Query)

 

 

1. 단일행 SUB Query

  • 서브쿼리를 수행한 결과가 1건만 나오고 이 결과를 메인쿼리로 전달해 메인쿼리 수행
  •  수행결과가 오직 하나의 row로만 반환하는 SUB Query를 갖는것 / Where절에 비교연산자 사용가능

 

<자산의 직속 상사가 'KING'인 사원의 이름과, 급여 출력>

방법1_SELF JOIN)

방법2_SUB Query)

 

 

2. 다중행 SUB Query

  • 반환되는 결과가 1개 이상의 행일때 사용
  • Multiple Row Operator(다중행 연산자)와 함께 필수 사용
종류 의미
IN 메인 쿼리의 비교 조건이 서브쿼리의 결과 중에서
1개이상 일치하면 참
ANY, SOME 메인 쿼리의 비교 조건이 서브쿼리의 검색 결과와
1개 이상 일치하면 참
ALL 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와
모든 값이 일치하면 참
EXISTS 메인 쿼리의 비교조건이 서브쿼리의 결과 중에서
1개라도 일치하면 참
검색결과가 1개이상 존재하면 참

 

 

<IN연산자를 사용해 부서 별로 가장 급여를 많이 받는 사원의 이름, 급여, 부서 번호 출력>

 

 

<30번 소속 사원들 중에서 급여를 가장 많이 받는 사원보다

더 많이 받는 사원의 이름, 급여 출력>

방법1_단일행 sub query)

방법2_다중행 sub query)

 > ALL : 최댓값 보다 큰것 출력

 <  ALL : 최솟값보다 작은것 출력

 

 

<30번 소속 사워들 중에 급여를 가장 적게 받는 사원보다

더 많은 급여를 받는 사원의 이름, 급여 출력>

방법1_단일행 sub query)

방법2_다중행 sub query)

> ANY : 최솟값보다 큰것 출력

< ANY : 최대값보다 작은것 출력

 

 

 


<예제>

<self join/JONES와 동일한 근무지에서 근무하는 사원의 이름, 월급, 근무지를 출력/단, JONES는 제외할것>

 

 

<self join/'SMITH' 사원의 매니저 이름 출력>

 

 

<self join/emp테이블에서 사원의 이름과 그 매니저 이름 출력>

mgr컬럼이 null값인 컬럼은 제외하고 출력됨

 

outer join을 사용해서 null값도 출력가능

 

 

<사원이름에 'T'가 들어가는 사원들의 이름과 부서명 출력>

방법1_ORACLE JOIN)

방법2_ANSI JOIN)

 

 

<사원이름과 직급, 급여, 급여등급 출력>

방법1_ Non Equi Join)

방법2_비교연산자)

방법3_ANSI JOIN)

 

 

<'DALLAS'에서 근무하는 사원들의 이름, 직급, 부서번호, 부서이름 출력>

방법1_Equi Join)

방법2_ANSI JOIN)

 

 

<self join/'SMITH'의 이름, 부서번호와 같은 부서에 있는 사원 이름 출력

/ 해당사원과 같은 부서에 있는 사원을 '동료'라고 표시할것>

 

 

- SUB Query -

<'CLARK'과 같은 부서에서 근무하는 사원의 이름, 부서번호 출력

/단, 'CLARK'은 제외>

 

 

<'WARD'와 동일한 JOB을 가진 사원의 이름과 월급을 출력>

 

 

<평균 급여보다 많이 받는 사원의 이름, 급여, 부서번호를 출력하되, 급여가 많은 순서로 출력>

 

 

<부서번호가 10번인 사원중 최대급여를 받는 사원의 이름, 월급, 직급,부서번호 출력>

 

 

<'DALLAS'에서 근무하는 사원의 이름, 부서번호, 근무지 출력>

 

 

<'CLARK'보다 먼저 입사한 사원의 이름, 월급, 입사일 출력>

방법1_JOIN)

방법2_SUB Query)

 

 

<job이 'MANAGER'인 사원이 속한 부서의 부서번호, 부서명, 지역 출력>

 

 

<급여를 3000이상 받는 사원이 속한 부서의 모든 사원을 출력>

distinct를 사용하지 않아도 동일한 결과가 출력되지만 사용하면 효율이 높아짐