본문 바로가기

DATABASE/SubQuery : SQL안에 또 다른 SQL

05. FROM절에 사용하는 서브쿼리와 WITH절

앞에 살펴본 서브쿼리는 WHERE절에서 조건식 대상으로 사용했다.

하지만 FROM절에도 서브쿼리를 사용할 수 있다.

FROM절에 사용하는 서브쿼리는 인라인 뷰(INLINE VIEW)라고도 부른다.

인라인뷰는 특정 테이블 전체 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 주어서 사용한다.

 

FROM절에 직접 테이블을 명시하여 사용하기에는 테이블 내 데이터 규모가 너무 크거나, 현재 작업에 불필요한 열이 너무 많아 일부 행과 열만 사용하고자 할 때 유용하다.

 

FROM절에 너무 많은 서브쿼리를 지정하면 가독성이나 성능이 떨어질 수 있기 때문에

경우에 따라 WITH절을 사용한다.

 

WITH 

[별칭1] AS (SELECT문 1),

[별칭2] AS (SELECT문 2), ...

[별칭n] AS (SELECT문 n)

SELECT 

FROM 별칭1,별칭2, ... , 별칭n

 

WITH절은 서브쿼리를 FROM절에 직접 명시하는 방식보다 번거로울 수도 있지만, 여러개의 서브쿼리가 규모가 엄청나게 커질 경우, 실제 수행해야 하는 메인쿼리와 서브쿼리를 분류할 때 유용하게 사용할 수 있다.

 

상호연관 서브쿼리

메인쿼리에 사용한 데이터를 서브쿼리에서 사용하고 서브쿼리의 결과 값을 다시 메인쿼리로 돌려주는 방식인 상호연관 서브쿼리(CORRELATED SUBQUERY)도 존재한다. 다만 성능을 떨어뜨리는 원인이 될 수 있고, 사용빈도가 높지는 않다.

 

SELECT * FROM EMP

WHERE SAL >

(SELECT MIN(SAL) FROM EMP E2 WHERE E2.DEPTNO = E1.DEPTNO)

ORDER BY DEPTNO, SAL;