서브쿼리(Subquery)와 인라인 뷰(Inline View)


1. 서브쿼리 (Subquery)

서브쿼리는 말 그대로 부(sub)쿼리 라는 뜻이다. 내부 쿼리, 혹은 하위 쿼리라고 부르기도 한다. SQL 쿼리의 내부에 액자구조로 또 다른 쿼리가 위치할 경우 내부의 쿼리를 서브쿼리라고 한다. 서브쿼리를 포함한 쿼리에서 서브쿼리를 뺀 바깥쪽 부분은 외부 쿼리(Outer Query) 혹은 상위 쿼리라고 한다. 

서브쿼리는 SELECT 문, INSERT/UPDATE/DELETE 문, 그리고 다른 서브쿼리 내부에서 사용될 수 있으며, 복합적 쿼리를 위해 사용된다는 점에서 조인과 유사하다. 같은 내용의 쿼리를 서브쿼리 방식이나 조인 방식 중 선택하여 구현할 수 있는 경우도 있다.

모든 절이 서브쿼리를 포함할 수 있는 것은 아니며, 서브쿼리가 들어갈 수 있는 위치에는 SELECT절/FROM절/WHERE절/HAVING절/ORDER BY절과 INSERT 문의 VALUES절, UPDATE문의 SET절이 있다.

서브쿼리에는 단일 행 서브쿼리, 다중 행 서브쿼리, 그리고 다중 컬럼 서브쿼리가 있다. 


1.1. 단일 행 서브쿼리(Single Row Subquery)

서브쿼리의 결과가 1행 혹은 0행인 경우를 말한다. 예를 들어 '기본키 = 101인 컬럼의 DATE값' 등의 쿼리를 생각할 수 있다. 

쿼리의 결과가 단일값이므로 외부 쿼리와 '=','<','>' 등의 연산자로 연결될 수 있다.


1.2. 다중 행 서브쿼리(Multi Row Subquery)

서브쿼리의 결과가 2개 이상일 수 있는 경우를 말한다. 예를 들어 '직위 = 과장인 모든 직원의 이름' 등을 생각할 수 있다.

쿼리의 결과가 여러개일 수 있으므로 외부 쿼리와 '='등의 연산자로 연결하면 에러가 나게 된다. 따라서 다중 행 비교 연산자를 사용해야 한다. 다중 행 비교 연산자에는 IN, ALL, ANY, SOME, EXISTS 등이 있으며, 쿼리 결과 전체 중 특정 조건을 만족하는 값이 존재하는지를 연산하게 된다.


1.3. 다중 컬럼 서브쿼리(Multi Column Subquery)

서브쿼리의 결과로 여러 컬럼이 반환되는 경우이다. 다중 행 서브쿼리에 포함된다고도 생각할 수 있다. 예를 들어 '직위 = 과장인 모든 직원의 나이 및 근속년수' 등을 생각할 수 있다.

서브쿼리의 컬럼 순서와 외부쿼리의 컬럼 순서가 서로 맞도록 주의해야 한다.



2. 인라인 뷰 (Inline View)

서브쿼리가 FROM 절 안에서 사용될 경우, 해당 서브쿼리를 '인라인 뷰'라고 일컫는다. 서브쿼리의 결과가 하나의 테이블에 대한 뷰처럼 사용되기에 이렇게 부르는 것이다. 

MSSQL에서 인라인 뷰를 사용할 때에는 서브쿼리의 결과에 대해 앨리어스(Alias), 즉 가명을 지정해 주어야 한다.


AND