> 서브 쿼리
- 서브쿼리란 하나의 SQL문안에 포함되어 있는 또 다른 SQL 문을 말한다. 즉, 서브쿼리가 메인쿼리에 포함되는 종속적인 관계이다.
- 큰 개념의 조인에 포함시킬 수 있으나, 보통은 조인과 구분한다.
- 서브쿼리를 문법적으로 구분하는 가장 쉬운 방법은 SQL문이 괄호로 묶여져 있으면 서브쿼리이다.
- 일반적으로 서브쿼리의 위치에 따라 다음과 같이 나눌 수 있다.
WHERE : NESTED SUBQUERY
FROM : INLINE VIEW
SELECT : SCALAR SUBQUERY
- SCALAR SUBQUERY의 경우 함수적 특성을 가짐
- 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있지만 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.
> 서브 쿼리와 조인
- 조인과 서브쿼리를 논리적으로 구분하는 가장 좋은 방법은 두 개의 테이블 위치를 바꾸어 보는 것이다.
- 조인은 두개의 테이블 위치를 바꾸어 보더라도 같은 결과가 나오며, 서브쿼리의 경우는 주종의 관계이므로 일반적으로 다른 결과가 나오게 된다.
- 만일 서브쿼리에서 두 개의 테이블 위치를 바꾸었는데도 같은 결과가가 나온다면, 조인으로 바꿀 수 있다는 얘기가 되므로 일반적으로 서브쿼리를 집합적 개념을 사용할 수 있는 조인으로 바꾸는 것을 권고
> 서브 쿼리 종류
- 서브 쿼리의 종류는 반환되는 데이터의 형태에 따라 분류 ( NESTED SUBQUERY )
서브 쿼리 종류 | 설명 |
single row | 서브쿼리의 실행 결과가 항상 1건 이하인 서브쿼리를 의미한다. 단일행 서브쿼리는 단일행 비교 연산자와 함께 사용된다. |
multi row | 서브쿼리의 실행 결과가 여러 건인 서브쿼리를 의미한다. 다중행 서브쿼리는 다중행 비교 연산자와 함께 사용된다. |
multi column | 서브쿼리의 실행 결과로 여러 칼럼을 반환한다. 메인쿼리의 조건절에 여러 칼럼을 동시에 비교할 수 있다. |
- 서브 쿼리의 종류는 동작하는 방식에 따라 다음과 같이 분류할 수 있다.
서브 쿼리 종류 | 설명 |
Un-Correlated | 서브 쿼리가 메인 쿼리 칼럼을 가지고 있지 않는 형태의 서브쿼이다. 메인쿼리에 값을 제공하기 위한 목저으로 주로 사용된다 ( NESTED SUBQUERY ) |
Correlated | 서브 쿼리가 메인 쿼리의 칼럼을 사용하는 형태의 서브쿼리이다. 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용된다. |
> EXISTS 서브쿼리
- EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용된다.
- EXISTS 서브쿼리의 특징은 아무리 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 1건만 찾으면 추가적인 검색을 진행하지 않는다.
- 현업에서 조건을 만족하는지 여부를 묻는 로직이 많이 사용되는데, 성능에 부담이 적은 EXISTS 절을 우선적으로 컴토할 필요가 높다.
- EXISTS 연산자의 왼쪽에는 칼럼명이나 상수가 표시되지 않는다.
- 서브쿼리의 데이터가 필요한 경우가 아니라면 1, 'X' 같은 업무적으로 의미없는 상수값을 선택하는 것이 좋다.
> INLINE VIEW
- FROM절에서 사용되는 서브쿼리를 인라인 뷰라고한다. FROM절에는 테이블 명이 오도록 되어 있다. FROM절에 사용된 서브쿼리의 결과가 마치 실행 시에 동적으로 생성된 테이블인 것처럼 사용할 수 있다.
- 인라인 뷰는 SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스 해당 정보가 저장되지 않는다. 그래서 일반적인 뷰를 정적뷰라고 하고 인라인 뷰를 동적 뷰라고도 한다. 인라인 뷰는 테이블 명이 올 수 있는 곳에서 사용할 수 있다.
> VIEW
- 테이블을 실제로 데이터를 가지고 있는 반면 뷰는 실제 데이터를 가지고 있지 않다. 뷰는 단지 뷰 정의만을 가지고 있다. 질의에서 뷰가 사용되면 뷰 정의를 참조해서 DBMS 내부적으로 질의를 재작성하여 질의를 수행한다.
- 뷰는 실제 데이터를 가지고 있지 않지만 테이블이 수행하는 역할을 수행하기 때문에 가상 테이블이라고도 한다.
> 스칼라 서브쿼리
- 스칼라 서브쿼리는 한 행, 한 컬럼만을 반환하는 서브쿼리를 말한다. 스칼라 서브쿼리는 칼럼을 쓸 수 있는 대부분의 곳에서 사용할 수 있다.
- 스칼라 서브쿼리도 일종의 함수이므로 중첩해서 사용하고 OUTPUT이 두개 이상 나오는 경우나 OUTPUT의 데이터 타입이 맞지 않는 경우 SYNTAX 에러가 발생한다.
출처 : 한국데이터산업진흥원 게시자료