본문 바로가기

공부/데이터베이스

[오라클로 배우는 데이터베이스 입문] 09. SQL문 속 또 다른 SQL문, 서브쿼리

1. 서브쿼리

SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문

- 메인쿼리: 서브쿼리의 결과 값을 사용하여 기능을 수행하는 영역

서브쿼리로 JONES의 급여보다 높은 급여 받는 사원 정보 출력하기

- 서브쿼리의 특징

1. 서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호()로 묶어서 사용한다.
2. 특수한몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY절을 사용할 수 없다.
3. 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 한다. 즉 메인쿼리의 비교 대상 데이터가 하나라면 서브쿼리의 SELECT절 역시 같은 자료형인 열을 하나 지정해야 한다.
4. 서브쿼리에 있는 SELECT문의 결과 행 수는 함께 사용하는 메인쿼리의 연산자 종류와 호환 가능해야 한다. 예를 들어 메인쿼리에 사용한 연산자가 단 하나의 데이터로만 연산이 가능한 연산자라면 서브쿼리의 결과 행 수는 반드시 하나여야 함.

2. 실행 결과가 하나인 단일행 서브쿼리

단일행 연산자
> >= = <= < <> ^= !=
초과 이상 같음 이하 미만 같지 않음

※ 단일행 연산자를 사용할 땐 같은 데이터가 여러 개 존재하는 열을 주의해야 함

- 단일행 서브쿼리와 날짜형 데이터

서브쿼리의 결과값이 날짜인 경우

- 단일형 서브쿼리와 함수

 EX) 20번 부서에 속한 사원 중 전체 사원의 평균 급여보다 높은 급여를 받는 사원 정보와 소속 부서 정보를 함께 조회하는 경우 - EMP테이블과 DEPT테이블 조인 후 SELECT문에 서브쿼리 적용

서브쿼리 안에서 함수를 사용한 경우

3. 실행 결과가 여러 개인 다중행 서브쿼리

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true
ANY, SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true
ALL 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true
EXISTS 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true

- IN 연산자

각 부서별 최고 급여와 동일한 급여를 받는 사원 정보 출력하기

- ANY, SOME 연산자 

등가 연산자(=)와 쓰면 IN연산자와 같은 기능 수행

<ANY 연산자를 사용한 경우 서브쿼리에 MAX함수를 사용한 경우
SELECT *
FROM EMP
WHERE SAL<ANY
(SELECT SAL FROM EMP WHERE DEPTNO=30)
ORDER BY SAL, EMPNO;
SELECT *
FROM EMP
WHERE SAL<
(SELECT MAX(SAL) FROM EMP WHERE DEPTNO=30)
ORDER BY SAL, EMPNO;

>ANY 연산으로 30번 부서 사원들의 최소 급여보다 많은 급여 받는 사원 정보 출력하기

- ALL 연산자

30번 부서 사원들의 최소 급여보다 더 적은 급여 받는 사원 출력하기
30번 부서 사원들의 최대 급여보다 더 많은 급여를 받는 사원 출력하기

- EXISTS 연산자

서브쿼리 결과 값이 존재하는 경우
서브 쿼리 결과 값이 존재하지 않는 경우

4. 비교할 열이 여러 개인 다중열 서브쿼리 - 서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정하는 방식

메인쿼리에 비교할 열을 괄호로 묶어 명시하고, 서브쿼리에서 괄호로 묶은 데이터와 같은 자료형 데이터를 SELECT절에 명시하여 사용

5. FROM절에 사용하는 서브쿼리와 WITH절

WHERE절뿐만 아니라 FROM절에서도 서브쿼리 사용가능

인라인 뷰(inline view): FROM절에 사용하는 서브쿼리, 특정 테이블 전체 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 주어 사용

- FROM절에 직접 테이블을 명시하기에는 테이블 규모가 너무 클 때 필요한 행과 열만 사용하고자 할 때 유용하며 경우에 따라 WITH절을 사용하기도 함

WITH절의 기본 형식
WITH
[별칭1] AS (SELECT문1),
[별칭2] AS (SELECT문2),
...
[별칭n] AS (SELECT문n)
SELECT FROM 별칭1, 별칭2, ...

6.  SELECT절에 사용하는 서브쿼리
스칼라 서브쿼리(scalar subquerry)라고 부르며 SELECT절에 하나의 열 영역으로 결과를 출력할 수 있음