[Oracle] Subquery 개념 및 실습

목차

  1. Introduction
  2. Single Row Subquery
  3. Multiple Rows Subquery
  4. Multiple Columns Subquery


※ Oracle 기준

※ 예제로 사용할 테이블 설명은 여기를 참고하세요

※ DB 이론 관련 모든 포스팅 목록도 여기를 참고하세요


Introduction

SELECT, INSERT, UPDATE, DELETE 같은 하나의 SQL문(Main query) 안에 중첩된 SELECT문을 Subquery라고 합니다. Main query 이전에 실행된 Subquery의 결과가 Main query에서 사용됩니다. 앞으로 유형을 세 가지로 나눠 설명할텐데 공식적으로 사용하는 용어는 아니고 설명을 돕기 위해 사람들이 편의 상 나눈 것으로 참고만 해주세요.



Single Row Subquery

Subquery가 오직 하나의 row를 반환하는 경우입니다. Single row operator(=,>,>=,<,<=,<>,!=)만 사용할 수 있습니다.

예제

‘SMITH’와 같은 직위를 갖는 사원의 이름과 사원 번호, 업무를 출력하시오.



Multiple Rows Subquery

Subquery가 하나 이상의 row를 반환하는 경우입니다. Multiple row operator(IN, NOT IN, ANY, ALL, EXISTS)도 사용할 수 있습니다.

예제

부서별로 가장 급여를 많이 받는 사원의 정보를 출력하시오. 1(group by)


※ 아래와 같이 query를 작성할 경우 잘못된 결과를 출력할 수 있습니다.

각 부서별 MAX(sal)이 2850, 3000, 5000이므로 다른 부서에서 2850 또는 3000 sal을 가지는 row가 있다면 그 row를 포함해서 출력합니다. 위의 예제에서는 john은 10번 부서의 3000을 받습니다. 비록 10번 부서의 최대 급여는 5000이지만 20번 부서의 최대 급여가 3000이므로 john을 포함하여 결과를 출력하게 됩니다. 부서별로 최대 급여를 출력할 수 있도록 만들어야 합니다.

예제

30번 부서의 최소 급여를 받는 사원보다 많은 급여를 받는 사원의 정보를 출력하시오. (30번 제외 사원만!) 2(ANY)

예제

30번 부서의 최고 급여를 받는 사원보다 많은 급여를 받는 사원의 정보를 출력하시오. (30번 제외 사원만!) 3(ALL)

1: MAX 함수 같은 Aggregate Function(집계 함수)는 single row가 아니라 row group을 기준으로 single row를 반환합니다. 이 때 group by절에서 row group을 지정할 수 있습니다. 자세한 내용은 아래 출처 3번 참고.

2: any는 범위 안의 어떤 operation 중 하나라도 true이면 true를 반환합니다. 위의 예시를 참고하면 이해가 쉬울 것 같습니다. 예시에서 subquery의 결과는 deptno=30인 row의 sal 값을 가진 row들입니다. main query에서는 subquery의 결과 중 하나라도 sal > (subquery) 를 만족한다면 true를 반환하여 결과를 출력합니다. 이해가 안 된다면 5번 출처 참고.

3: all은 범위 안의 모든 operation이 true이면 true를 반환합니다. any의 반대의 경우를 생각하면 쉬울 것 같습니다. 위의 예시에서 모든 subquerysal > (subquery)를 만족하면 true를 반환하여 결과를 출력합니다. 이해가 안 된다면 5번 출처 참고.



Multiple Columns Subquery

Subquery가 둘 이상의 columns를 반환하는 경우입니다.

예제

급여와 보너스가 30번 부서에 있는 어떤 사원의 보너스와 급여에 일치하는 사원의 정보를 출력하시오.4(NVL)

예제

업무별로 최소 급여를 받는 사원의 정보를 출력하시오.

4: NVL(expr1, expr2)

만약 expr1이 null이 아니라면 expr1 반환. expr1이 null이면, expr2 반환. 이 때 expr1, expr2의 data type이 다르면 expr2이 expr1의 data type으로 변환됩니다.



출처

  1. www.oracletutorial.com
  2. oracle docs - Aggregate function
  3. oracle docs 페이지에서 NVL 검색
  4. any, all operation