제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;
'프로그래밍 > MySQL' 카테고리의 다른 글
| 📊 [SQL] 제33장 - INSERT "이제 데이터를 추가해 볼까요?" (0) | 2026.07.10 |
|---|---|
| 📊 [SQL] 제31장 - 여러 개의 결과를 반환하는 서브쿼리 (0) | 2026.07.09 |
| 📊 [SQL] 제30장 서브쿼리 - SELECT 안에 또 SELECT를 사용할 수 있을까요? (0) | 2026.07.08 |
| 📊 [SQL] 제29장 Alias(별칭) - 이름이 너무 길어요! (0) | 2026.07.08 |
| 📊 [SQL] 제28장 JOIN 선택하기 - 어떤 JOIN을 사용해야 할까요? (0) | 2026.07.08 |