Oracle/개념

10장. Sub Query (서브 쿼리)

2024. 6. 14. 17:03
728x90

1. Sub Query란?

 

서브쿼리는 SQL에서 하나의 쿼리 내에 포함된 또 다른 쿼리이다. WHERE 문 줄에 있는 괄호 속에 또 다른 SELECT 문이 결과를 산출한다. 그 결과를 WHERE 문이 조건 연산자와 결과물을 사용한다. 이 조건문을 SELECT 문을 사용한다.

 결과가 한 건만 나온다면 ORDER BY를 사용하는 의미가 없다. 주쿼리와 조건을 다시 비교해야 한다. ORDER BY를 사용한다고 해서 도움이 될 만한 것은 없다.

 단일 행이 나오는 경우가 있고, 여러 행이 나오는 경우도 있다.

 

SELECT select_list
FROM 테이블_또는_뷰
WHERE 조건-연산자 ( SELECT select_list
                   FROM 테이블
                   WHERE 조건 );
  • Sub Query 부분은 WHERE 절에 연산자 오른쪽에 위치해야 하며 반드시 괄호로 묶어야 한다.
  • 특별한 경우(Top-n 분석 등)를 제외하고는 Sub Query 절에 Order By 절이 올 수 없다.
  • 단일 행 Sub Query와 다중 행 Sub Query에 따라 연산자를 잘 선택해야 한다.

 

 

 

 

 


 

 

 

 

 

2. Sub Query의 종류

 

1) 단일 행 Sub Query (Single Row Sub Query)

연산자 의미
= 같다(Equal to)
<> 같지 않다(Not Equal to)
> 크다(Greater Than)
>= 크거나 같다(Greater Than or Equal to)
< 작다(Less Than)
<= 작거나 같다(Less Than or Equal to)

 

 

 

2) 다중 행 Sub Query (Multi Row Sub Query)

여러 결과가 나온다.

연산자 의미
IN 서브 쿼리 결과와 같은 값을 찾는다.
EXISTS Sub Query의 값이 있을 경우 메인 쿼리를 수행한다.
>ANY 서브 쿼리 결과 중에서 최솟값을 반환한다.
<ANY 서브 쿼리 결과 중에서 최댓값을 반환한다.
<ALL 서브 쿼리 결과 중에서 최솟값을 반환한다.
>ALL 서브 쿼리 결과 중에서 최댓값을 반환한다.

 

 

 

3) 다중 컬럼 Sub Query (Multi Column Sub Query)

컬럼이 여러 결과값으로 나올 수 있게 한다.

WHERE 컬럼 IN (Sub Query)

 

 

 

4) 상호 연관 Sub Query

 상호 연관이 되어 있다는 것은 주쿼리가 서브 쿼리가 연관되어 있다는 것이다. 이때를 상호 연관 Sub Query라 한다. 연관이 없는 쿼리는 결과가 연관이 되어 있지 않다.

 

 

 

 

 


 

 

 

 

 

3. Scalar Sub Query (스칼라 서브 쿼리)

 

 WHERE 절에 나오는 Sub Query는 Sub Query(보통 붙여 쓴다)가 온다(라고 부른다). FROM 절에는 원래 Table이 나온다. 여기에 쓰는 것은 Inline View이다.

 SELECT 문에 나오는 Sub Query 중에서 1행만 나오는 것을 Scalar Sub Query라고 한다.

 

 

**참고

Sub Query는 오는 위치에 따라서 그 이름이 다르다.

# Scalar Sub Query (스칼라 서브 쿼리)
# 1행만 반환할 경우
SELECT (Sub Query)

# Inline View (인라인 뷰)
FROM (Sub Query)

# Sub Query
WHERE (Sub Query)

 

 

 

1) Scalar Sub Query란?

 

SELECT 절 : 결과 출력

FROM 절 : 테이블에서 코드가 사용자가 원하는 값이라면

WHERE 절 : 그 값에 해당하는 정보 데이터를 출력한다.

 

 

 

Scalar Sub Query 동작 원리

  1. Main Query를 한 건씩 수행한 후 Scalar Sub Query에 필요한 값을 제공한다.
  2. Scalar Sub Query를 수행하기 위해 필요한 데이터가 들어있는 블록을 메모리로 로딩한다.
  3. 제공하는 값을 WHERE 절에 작성한다. 즉, Main Query에서 주어진 가지고 필요한 값을 찾는다. 그리고 이 결과를 메모리에 입력값과 출력값으로 메모리 내의 Query execution cache라는 곳에 저장해둔다.
     여기서 입력값은 Main Query에서 주어진 값이고 출력값은 Scalar Sub Query를 수행 후 나온 결과값이다. 이 값을 저장하는 캐쉬값을 지정하는 파라미터는 _query_execution_cache_max_size이다.
  4. 다음 조건이 Main Query에서 Scalar Sub Query로 들어오면 해쉬 함수를 이용해서 해당 값이 캐쉬에 존재하는지 찾고, 있으면 즉시 결과값을 출력하고 없으면 다시 블록을 엑세스해서 값을 찾은 후 다시 메모리에 캐쉬해둔다.
     다음같은 상황이 나오는 경우 캐시를 쓴다.
       - 빨리 접근하기 위해
       - 결과값이 있으면 출력하고 없으면 다시 찾는다.
  5. Main Query가 끝날 때까지 반복한다.

 

 

 

2) Scalar Sub Query 테스트

 

Test 1) 2건 이상의 데이터 반환을 요청하는 경우 에러 발생. 값이 같으면 테스트할 수 없다.

Test 2) 2개 이상의 컬럼을 조회할 경우 에러 발생. 비교하는 값이 다르면 비교 자체를 할 수 없다.

'Oracle > 개념' 카테고리의 다른 글

11장. SEQUENCE(시퀀스)와 SYNONYM(동의어)  (0) 2024.06.15
9장. VIEW(뷰)  (0) 2024.06.14
8장. INDEX (인덱스)  (1) 2024.06.14
7장. Constraint(제약조건)  (0) 2024.06.13
6장. DML 데이터 관리  (0) 2024.06.13