본문 바로가기
BigData TIL/Database

[Oracle] 서브쿼리

by xxub 2022. 1. 3.
반응형

많은 데이터를 불러오기 위해서는 모든 테이블을 각각 생성하여 가져오면 메모리도 부족과 물론 시간도 소비가 많이 된다. 필자는 이러한 이유로 서브 쿼리를 자주 이용한다.

서브 쿼리란? 

  • 하나의 SQL문 내부에 존재하는 또 다른 SELECT문을 말한다.
  • 비교 연산자의 오른쪽에 기술해야 하며 반드시 괄호 안에 넣어야 한다.
  • 메인 쿼리가 실행되기 이전에 한 번만 실행이 된다.
  • 단일 행 또는 다중 행 비교 연산자와 함께 사용 가능하다.
  • 서브 쿼리는 메인 쿼리와의 연관성이나 위치하는 곳에 따라 다른 이름으로 불려진다.

 

서브 쿼리의 분류

  • 단일 행 서브 쿼리
  • 다중 행 서브 쿼리
  • 위치에 따른 서브 쿼리

 

1. 단일 행 서브 쿼리

  • 서브 쿼리의 수행 결과가 오직 하나의 ROW(행)만을 반환한다.
  • 이 하나의 결과를 가지고 메인 쿼리는 비교 연산자를 통해 쿼리를 수행한다.
  • 비교 연사자는 단일 행 비교 연산자를 사용한다.(ex. > , >= , < , <= , =,...) 
  • 비교 연산자를 사용할 경우 서브 쿼리의 결과 건수가 반드시 1건 이하여야 한다. (2건 이상일 경우 오류 발생)
SELECT 컬럼A, 컬럼B, 컬럼C
FROM 테이블 A
WHERE 컬럼A = (SELECT AVG(컬럼A)
               FROM 테이블 B
               WHERE 컬럼B = '1')
ORDER BY 컬럼A, 컬럼B, 컬럼C ;

 

2. 다중 행 서브 쿼리

  • 단일 행에서 결과 건수가 2건 이상 반환될 수 있다면 다중 행 서브 쿼리를 사용한다.
  • 비교 연사자는 다중 행 비교 연산자를 사용한다. (ex. IN, ANY, SOME, ALL, EXISTS)

- IN : 메인쿼리의 비교 조건이 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미한다.

- ALL : 메인쿼리의 비교 조건이 서브 쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미한다.

- ANY : 메인쿼리의 비교 조건이 서브 쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미한다.

- EXIST :  메인쿼리의 비교 조건이  서브 쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미한다.

 

3. 위치에 따른 서브 쿼리 

아래의 그림을 보고 위치에 따른 서브 쿼리의 명칭을 알 수 있다. 필자가 가장 많이 사용하는 서브 쿼리의 종류이며 어떻게 사용하느냐에 따라 쿼리의 실행 속도 차이가 많이 난다. 비교를 해가며 최적화하는 과정은 튜닝의 하나라고 볼 수 있다. 

- 스칼라 서브쿼리 : 단일 행, 단일 컬럼만을 반환하는 서브 쿼리를 말한다. sum, count 등의 집계 함수를 거친 단일 값으로 리턴되어야 한다. 그 이유는 서브 쿼리를 끝마친 값 하나를 메인 쿼리에서 select 하기 때문이다.

- 인라인 뷰: 기본적으로 from 절에는 테이블 명이 오도록 되어 있는데 from절에 서브 쿼리를 사용하게 되면 동적으로 생성된 테이블인 것처럼 사용할 수 있다. 동적인 테이블이란 것은 sql 문이 실행되었을 때만 임시적으로 생성되며 데이터베이스에 해당 정보가 저장되지 않는다. 

- 중첩 서브 쿼리(서브 쿼리): 단일 행과 다중 행 둘 다 리턴이 가능하다. 서브 쿼리를 마친 값들을 메인 쿼리의 조건절을 통해 비교 등을 하기 때문이다. 

반응형

'BigData TIL > Database' 카테고리의 다른 글

[Oracle] NVL, NVL2  (0) 2022.01.07
[Oracle] case when, decode  (0) 2022.01.06
[Oracle] JOIN 정리  (0) 2022.01.05
[Oracle] UNION , UNION ALL - SELECT 합치기  (0) 2022.01.04
[Oracle] SQL 쿼리 문 정리 1  (0) 2021.06.30