서브쿼리 종류와 개념 정리(스칼라 서브쿼리, 인라인 뷰, 일반 서브쿼리)
서브쿼리와 조인에 대해 공부하던 중 서브쿼리가 사용되는 위치 및 유형에 따라 각각 다른 명칭을 가지고 있다는 것을 알게 되었는데요.
해당 포스팅에서는 서브쿼리의 유형인 '스칼라 서브쿼리(Scalar subquery)', '인라인 뷰(Inline view)', '일반 서브쿼리' 등 각각의 개념 및 예시를 정리하여 보았습니다.
***
내용을 정리하는 과정에서 중첩 서브쿼리에 대한 개념이 좀 애매하다고 느꼈는데요.
우선 내부적으로 서브쿼리가 사용되는 SQL 구문 자체를 '중첩 질의(Nested query)'라고 하며, '중첩 서브쿼리(Nested subquery)'는 말 그대로 서브쿼리 안에 서브쿼리가 중첩된 구조를 말한다고 판단하였습니다.
때문에 스칼라 서브쿼리, 인라인 뷰 외 서브쿼리는 크게 '일반 서브쿼리'로 분류하여 아래 내용을 이어가도록 하겠습니다.
서브쿼리(Subquery)란?
서브쿼리는 SQL 쿼리 내부에 포함되어 있는 또 다른 SELECT 쿼리를 의미하는데요.
서브쿼리를 포함하고 있는 외부 쿼리(Outer query) 또는 메인 쿼리(Main query)라고 부르며, 서브쿼리는 내부 쿼리(Inner query)라고도 부릅니다.
서브쿼리는 메인 쿼리의 조건을 생성하거나, 대상 테이블을 만들 수 있으며, 데이터를 필터링하거나 계산하는데도 사용되는데요.
서브쿼리에서는 메인 쿼리의 컬럼을 사용할 수 있지만, 메인 쿼리에서는 서브쿼리의 컬럼을 사용할 수 없다는 특징이 있습니다.
또한 서브쿼리를 구성하는 SELECT 문은 괄호로 쌓여있으며 SELECT, FROM, WHERE, HAVING 등 다양한 위치에서 사용될 수 있습니다.
서브쿼리는 사용되는 위치, 반환 값의 형태, 사용 용도에 따라 '스칼라 서브쿼리', '인라인 뷰', '일반 서브쿼리'로 나뉘게 되며, 외부 쿼리와의 의존성에 따라 '연관 서브쿼리', '비연관 서브쿼리'로도 나눠지는데요.
아래 내용을 통해 각각에 대한 개념과 예시를 살펴보도록 하겠습니다.
스칼라 서브쿼리(Scalar subquery)
'스칼라 서브쿼리'는 단일 행의 단일 컬럼(= 하나의 값)을 반환하는 서브쿼리를 의미합니다.
SELECT 절에서 '하나의 열(컬럼)'처럼 사용되거나 WHERE 절 메인 쿼리의 결과를 필터링하는 역할로도 사용될 수 있습니다.
(오라클에서는 다중 행 값이 조회되는 경우 'single-row subquery returns more then one row' 오류가 발생합니다.)
SELECT 절에서 사용되는 스칼라 서브쿼리의 경우 메인 쿼리의 결과 건수만큼 서브쿼리가 반복되는 구조이기 때문에 메인 쿼리에서 조회되는 데이터가 많아질수록 성능이 떨어진다는 단점이 있습니다.
일치하는 값이 없는 경우 NULL을 반환하며, WHERE 절에서 사용되는 스칼라 서브쿼리의 경우 단일 행 비교 연산자(=, <>, >, >=, <, <=)를 사용할 수 있습니다.
인라인 뷰(Inline View)
FROM 절에서 사용되는 서브쿼리를 '인라인 뷰'라고 하며, 인라인 뷰는 여러 행과 여러 열을 반환하는 테이블 형태의 결과를 생성하는데요.
이렇게 반환된 결과는 메인 쿼리에서 가상의 테이블처럼 사용됩니다.
인라인 뷰의 경우 중간 결과를 생성하여 복잡한 쿼리를 단순화할 수 있다는 장점이 있습니다.
또한 스칼라 서브쿼리는 메인 쿼리의 각 행마다 독립적으로 실행되는 반면, 인라인 뷰는 메인 쿼리가 실행되기 전에 먼저 실행된다는 차이점이 있습니다.
다중 행 서브쿼리(Multi Row subquery), 다중 컬럼 서브쿼리(Multi Column subquery)
WHERE 절에서는 하나의 값을 반환하는 스칼라 서브쿼리 외에도 '다중 행 서브쿼리', '다중 컬럼 서브쿼리'를 사용할 수 있는데요.
다중 행 서브쿼리의 경우 IN, NOT IN, ANY, ALL, SOME, EXISTS, NOT EXISTS와 같은 다중 행 비교 연산자와 함께 사용되어 서브쿼리를 통해 반환된 여러 개의 값을 특정 값과 비교할 수 있게 합니다.
다중 컬럼 서브쿼리의 경우 서브쿼리의 실행 결과로 여러 컬럼을 반환하는데요.
메인 쿼리의 조건절에 여러 컬럼을 동시에 비교할 수 있으며, 이때 메인 쿼리와 서브쿼리에서 비교하고자 하는 컬럼의 위치와 개수가 동일해야 한다는 특징이 있습니다.
연관 서브쿼리(Correlated subquery)와 비연관 서브쿼리(Un-Correlated subquery)
위 내용에서는 각 서브쿼리를 사용되는 위치, 반환 값의 형태, 사용 용도에 따라 나눴다면, 메인 쿼리와의 의존성 여부에 따라 '연관 서브쿼리'와 '비연관 서브쿼리'로도 분류할 수 있는데요.
연관 서브쿼리의 경우 말 그대로 메인 쿼리와 서브쿼리 간의 관계성이 있는 경우를 말하며, 메인 쿼리에서 참조된 값을 사용하여 실행되기 때문에 메인 쿼리의 각 행에 의존한다고 볼 수 있습니다.
비연관 서브쿼리의 경우 메인 쿼리와 서브쿼리 간의 관계성이 없는 경우를 말하며, 서브쿼리가 메인쿼리와 상관없이 독립적으로 실행될 수 있습니다.
또한 비연관 서브쿼리는 메인 쿼리와 관계없이 한 번만 실행되어 그 결과를 메인 쿼리에 제공하기 때문에 메인 쿼리보다 먼저 실행되어야 한다는 특징이 있습니다.
< 함께 볼만한 자료 >
2024.10.09 - [Programming/Database] - 동일한 테이블을 여러 번 조인하는 방법과 서브쿼리를 사용하는 방법의 차이
2024.05.09 - [Programming/Database] - SQL SELECT 쿼리 실행 순서 및 처리 과정 정리
'Programming > Oracle' 카테고리의 다른 글
LISTAGG 함수 사용 방법 및 예시(여러 행의 값을 하나의 문자열로 결합할 때) (0) | 2024.09.15 |
---|---|
CLOB, BLOB 데이터 타입과 mybatis에서 CLOB, BLOB 사용 방법 (0) | 2024.08.15 |
오라클 NULL 치환 함수 정리 (NVL, NVL2, COALESCE, NULLIF) (0) | 2024.06.06 |
Oracle INSTR 특정 문자를 찾을 때 사용하는 함수 (1) | 2024.05.15 |
oracle 반복문(LOOP, FOR LOOP, WHILE LOOP) 사용 방법 및 예시 (0) | 2024.05.06 |