고래씌

[Oracle] 5-1. DML(SELECT) - SUBQUERY(서브쿼리) 본문

Database/Oracle

[Oracle] 5-1. DML(SELECT) - SUBQUERY(서브쿼리)

고래씌 2023. 11. 27. 14:37

1. SUBQUERY 서브쿼리

- 하나의 주된 SQL 안에 포함된 또 하나의 SELECT문

- 메인 SQL문을 위해서 보조 역할을 하는 SELECT문
    => 주로 조건절에서 많이 쓰인다.

 

 

▶ 간단 서브쿼리 예시 1)

 - 노옹철 사원과 같은 부서인 사원들

 

① 먼저 노옹철 사원의 부서코드를 조회

 

 

② 부서코드가 D9인 사원들 조회

 

 

③ 위 두단계 합치기

 

 

▶ 간단 서브쿼리 예시 2)

- 전체 사원의 평균 급여보다 더 많은 급여를 받고있는 사원들의 사번, 이름, 직급코드 조회


① 전체 사원의 평균 급여 구하기

 

② 급여가 3047000원 이상인 사원들 조회

 

③ 위 두단계 합치기

 

 


2. 서브쿼리 구분

: 서브쿼리를 수행한 결과값이 몇행 몇열이냐에 따라서 분류

 

- 단일행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때(한칸의 컬럼값으로 나올때)
- 다중행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행일 때
- (단일행) 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 열일 때
- 다중행 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러행 여러 열일때
    
    => 서브쿼리를 수행한 결과가 몇행 몇열이냐에 따라 사용가능한 연산자가 달라짐

 


1) 단일행 단일열 서브쿼리 (SINGLE ROW SUBQUERY)

: 서브쿼리의 주회 결과값이 오로지 1개일때
    
- 사용가능한 연산자 => =, !=, <=, >=, ...

 

EMPLOYEE 테이블

 

DEPARTMENT 테이블

 

 

 

▶ 전 직원이 평균 급여보다 더 적게 받는 사원들의 사원명, 직급코드, 급여 조회

 

=> 파란색 밑줄 친 부분만 따로 실행해보면 ...

 

아래와 같은 값이 출력된다. 이보다 더 적은 급여를 받는 사원이 있다면 출력하게 된다.

 

 

 

최저 급여를 받는 사원의 사번, 사원명, 직급코드, 급여, 입사일 조회

 

 

노옹철 사원의 급여보다 더 많이 받는 사원들의 사번, 이름, 부서코드, 급여 조회

 

- ANSI 구문

 

 

 

부서별 급여 합이 큰 부서 하나만을 조회, 부서코드, 부서명, 급여의 합

(서브쿼리, GROUP BY, JOIN)

 


2) 다중행 서브쿼리(MULTI ROW SUBQUERY)

서브쿼리의 조회 결과값이 여러행일 경우
    - IN(10, 20, 30) 서브쿼리 : 여러개의 결과값 중에서 하나라도 일치하는 것이 있다면
    -> OR < ANY(10, 20, 30) 서브쿼리 : 여러개의 결과값 중에서 "하나라도"  크거나 작을 경우
    -> OR < ALL (10,20,30) : 여러개의 결과값의 모든 값보다 크거나 작을 경우

 

 

각 부서별 최고 급여를 받는 사원의 이름, 직급코드, 급여 조회

① 각 부서별 최고급여 조회 (다중행, 단일열)

 

② 위 급여를 받는 사원들 조회

 

③ 두 쿼리문을 합치기

 

 

선동일 또는 유재식 사원과 같은 부서인 사원들을 조회하시오(사원명, 부서코드, 급여)

 

대리 직급임에도 불구하고 과장 직급의 급여보다 많이 받는 사원들 조회(사번, 이름, 직급명, 급여)

과장 직급들의 급여들 조회

 

② 위의 급여목록들보다 하나라도 높은 급여를 받는 직원들을 조회

 

☞ JOB_NAME = '과장'; -- 220000, 250000, 376000 값보다 하나라도 높은 값이 있다면 반환하라.

 

 

과장 직급임에도 불구하고 모든 차장직급의 급여보다도 더 많이 받는 직원 조회(사번, 이름, 직급명, 급여)

 


3)  (단일행) 다중열 서브쿼리

: 서브쿼리 조회 결과가 값은 한행이지만, 나열된 칼럼은 여러개인 경우

 

▶ 하이유 사원과 같은 부서코드, 같은 직급코드에 해당되는 사원들 조회
(사원명, 부서코드, 직급코드, 고용일)

 

① 하이유 사원의 부서코드, 직급코드 먼저 조회

☞ 부서코드 'D5' 직급코드 'J5' 출력

 

 

② 부서코드가 D5이면서 J5 직급인 사원들 조회

 

 

③ 위 두 쿼리문을 하나의 코드로 합치기

 

☞ 다중열 서브쿼리(비교할 값의 순서를 맞춰서 칼럼값을 나열)

(비교대상칼럼1, 비교대상칼럼2) = (비교할값1, 비교할값2 => 서브쿼리 형식으로 제시해야만 함.)

 

 

④ 다중열 서브쿼리

 

 

▶ 박나라 사원과 같은 직급코드, 같은 사수사번을 가진 사원들의 사번, 이름, 직급코드, 사수사번을 조회
단일행 다중열 서브쿼리 이용하여 작성

 

 


4) 다중행 다중열 서브쿼리

: 서브쿼리 조회 결과가 여러행 여러 컬럼일 경우

 

 

▶ 각 직급별 최소급여를 받는 사원들 조회(사번, 이름, 직급코드, 급여)

① 각 직급별 최소급여를 조회

 

② 위 목록들 중에 일치하는 사원을 찾기

②-1) 조건 나열 (OR)

 

☞ 하지만, 이렇개 OR 연산자를 이용하여 다 쓰기에는 매우 번거롭다. 서브쿼리를 활용하자!

 

-2) 다중행 다중열 서브쿼리

 

 

 

▶ 각 부서별 최고 급여를 받는 사원들 조회(사번, 이름, 부서코드, 급여)
부서가 없을 경우 부서코드는 없음으로 조회하시오.