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