본문 바로가기
프로그래밍/MySQL

📊 [SQL] 제32장 - FROM절에서 사용하는 서브쿼리

by 강릉바다의 블로그 2026. 7. 10.

제32장. FROM절에서 사용하는 서브쿼리

"임시 테이블을 만들어 사용할 수 있을까요?"


학습 목표

이번 장을 학습하면 다음 내용을 할 수 있습니다.

  • FROM절에서도 서브쿼리를 사용할 수 있다.
  • 서브쿼리의 결과를 하나의 테이블처럼 사용할 수 있다.
  • Derived Table(파생 테이블)의 개념을 이해할 수 있다.
  • 복잡한 SQL을 단계별로 작성할 수 있다.

지난 시간을 떠올려 봅시다.

우리는

WHERE절에서

서브쿼리를 사용했습니다.

SELECT ProductName,
       Price
FROM Products
WHERE Price >
(
    SELECT AVG(Price)
    FROM Products
);

이번에는

조금 다른 질문을 해보겠습니다.


이런 결과를 하나의 테이블처럼 사용할 수 없을까요?

다음 SQL을 실행합니다.

SELECT CategoryID,
       AVG(Price) AS AvgPrice
FROM Products
GROUP BY CategoryID;

실행 결과

CategoryID AvgPrice
1 37.98
2 23.06
3 25.16
... ...

이 결과도

하나의 테이블처럼 사용할 수 있으면 좋겠습니다.


가능합니다.

바로

FROM절 서브쿼리입니다.


예제 1

SELECT *
FROM
(
    SELECT CategoryID,
           AVG(Price) AS AvgPrice
    FROM Products
    GROUP BY CategoryID
) AS AvgTable;

실행 결과

CategoryID AvgPrice
1 37.98
2 23.06
3 25.16

겉으로 보기에는

평범한 테이블처럼 보입니다.

하지만

실제로는

SQL가 만든

임시 테이블입니다.


SQL는 어떻게 실행될까요?

먼저

괄호 안 SQL을 실행합니다.

Products
↓
GROUP BY
↓
평균 계산
↓
새로운 결과 생성

그 다음

그 결과를

AvgTable이라는

이름의 테이블처럼 사용합니다.


그림으로 이해하기

Products
↓
GROUP BY
↓
┌─────────────┐
AvgTable
└─────────────┘
↓
SELECT

즉,

SQL가

잠시 테이블 하나를

만들어 주는 것입니다.


왜 Alias가 필요할까요?

다음 SQL은

오류가 발생합니다.

SELECT *
FROM
(
    SELECT CategoryID,
           AVG(Price)
    FROM Products
    GROUP BY CategoryID
);

왜일까요?

FROM절의 서브쿼리는

반드시

이름이 있어야 합니다.

그래서

AS AvgTable

을 붙입니다.


기억해 두세요!

우리가 지난 장에서 배운

Alias가

여기서 다시 등장합니다.

Alias는

테이블뿐 아니라

서브쿼리에도 반드시 사용할 수 있습니다.

"아! 그래서 Alias를 배웠구나!"

를 느끼게 되는 순간입니다.


실제 업무에서는?

예를 들어

부서별 평균 급여를 먼저 계산한 뒤,

그 평균을 이용하여

다른 조회를 수행하는 경우가 많습니다.

또는

국가별 고객 수를 먼저 계산하여

보고서를 만드는 경우도 있습니다.

복잡한 SQL을

여러 단계로 나누어

생각할 수 있게 해 줍니다.


많이 하는 실수

실수 ①

Alias를 생략한다.

FROM
(
   SELECT ...
)

오류가 발생합니다.


실수 ②

FROM절 서브쿼리를

영구적인 테이블이라고 생각한다.

SQL가 실행되는 동안만

잠시 존재합니다.


실수 ③

서브쿼리와 VIEW를

같은 것으로 생각한다.

FROM절 서브쿼리는

실행할 때마다

새로 만들어집니다.

VIEW는

데이터베이스 안에

저장되는 객체입니다.

VIEW는

제42장에서 자세히 배웁니다.


한눈에 정리

안쪽 SQL
↓
임시 테이블 생성
↓
바깥 SQL 실행

이번 장 핵심 정리

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

✅ 서브쿼리 결과는 임시 테이블처럼 사용할 수 있다.

✅ FROM절 서브쿼리에는 Alias가 반드시 필요하다.

✅ 복잡한 SQL을 단계별로 작성할 수 있다.


연습 문제

기본 문제

① 상품의 카테고리별 평균 가격을 구하는 FROM절 서브쿼리를 작성하시오.

② FROM절 서브쿼리에 PriceTable이라는 Alias를 지정하시오.


응용 문제

① 국가별 고객 수를 구하는 FROM절 서브쿼리를 작성하시오.

② 주문 연도별 주문 건수를 구하는 FROM절 서브쿼리를 작성하시오.


도전 문제

상품의 카테고리별 평균 가격을 먼저 계산한 뒤,

평균 가격이 30 이상인 카테고리만 출력하는 SQL을 작성하시오.

SELECT *
FROM
(
    SELECT CategoryID,
           AVG(Price) AS AvgPrice
    FROM Products
    GROUP BY CategoryID
) AS AvgTable
WHERE AvgPrice >= 30;