📊 [SQL] 제30장 서브쿼리 - SELECT 안에 또 SELECT를 사용할 수 있을까요?
제30장. 서브쿼리(Subquery)
"SELECT 안에 또 SELECT를 사용할 수 있을까요?"
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- 서브쿼리(Subquery)의 의미를 이해할 수 있다.
- SQL 안에 또 다른 SQL을 사용할 수 있다.
- 먼저 실행되는 SQL과 나중에 실행되는 SQL을 구분할 수 있다.
- 하나의 SQL로 복잡한 문제를 해결할 수 있다.
왜 서브쿼리가 필요할까요?
다음과 같은 질문을 받았다고 생각해 봅시다.
"가장 비싼 상품을 찾아 주세요."
이 질문을 어떻게 해결할까요?
먼저
가장 비싼 가격을 알아야 합니다.
그 다음
그 가격을 가진 상품을 찾아야 합니다.
즉,
두 번의 조회가 필요합니다.
첫 번째 SQL
가장 비싼 가격을 찾습니다.
SELECT MAX(Price)
FROM Products;
실행 결과
| MAX(Price) |
| 263.50 |
두 번째 SQL
이제
가격이 263.50인 상품을 찾습니다.
SELECT ProductName,
Price
FROM Products
WHERE Price = 263.50;
그런데 문제가 있습니다.
가격을
직접 입력했습니다.
만약
가장 비싼 가격이
내일 바뀐다면
SQL도 수정해야 합니다.
좋은 SQL일까요?
아닙니다.
더 좋은 방법은 없을까요?
생각해 보면
첫 번째 SQL이
가격을 알려주고 있습니다.
그렇다면
그 결과를
두 번째 SQL 안에서
바로 사용할 수 있지 않을까요?
바로 이것이
서브쿼리(Subquery)입니다.
예제 1. 가장 비싼 상품 찾기
SELECT ProductName,
Price
FROM Products
WHERE Price =
(
SELECT MAX(Price)
FROM Products
);
실행 결과
| 상품명 | 가격 |
| Côte de Blaye | 263.50 |
SQL은 하나뿐이지만
안에는
SELECT가 두 개 있습니다.
SQL는 어떤 순서로 실행될까요?
학생들이 가장 궁금해하는 부분입니다.
많은 학생들은
위에서 아래로 실행된다고 생각합니다.
하지만
실제로는
①
SELECT MAX(Price)
↓
263.50
↓
②
WHERE Price = 263.50
↓
결과 출력
즉,
괄호 안의 SQL이
먼저 실행됩니다.
그래서 이름이 Subquery입니다.
Sub는
"안쪽"
"보조"
라는 의미입니다.
즉,
메인 SQL을
도와주는 SQL입니다.
그림으로 이해하기
큰 SQL
┌────────────────────┐
WHERE Price = (
작은 SQL
)
└────────────────────┘
작은 SQL이
먼저 실행됩니다.
실제 업무에서는?
예를 들어
가장 최근 주문을 조회한다고 합시다.
먼저
가장 최근 날짜를 찾고,
그 날짜의 주문을 조회하면 됩니다.
SELECT *
FROM Orders
WHERE OrderDate =
(
SELECT MAX(OrderDate)
FROM Orders
);
가격뿐 아니라
날짜,
번호,
평균,
개수 등
다양하게 사용할 수 있습니다.
많이 하는 실수
실수 ①
괄호를 빼먹는다.
WHERE Price =
SELECT MAX(Price)
❌ 오류 발생
반드시
괄호가 필요합니다.
실수 ②
안쪽 SQL을
먼저 실행된다는 사실을 잊는다.
항상
안쪽부터 실행됩니다.
실수 ③
안쪽 SQL이
여러 개의 값을 반환하는데
= 을 사용한다.
이 부분은
다음 장에서 자세히 배웁니다.
한눈에 정리
안쪽 SELECT
↓
결과 생성
↓
바깥쪽 SELECT
↓
최종 결과
이번 장 핵심 정리
✅ 서브쿼리는 SQL 안에 있는 또 다른 SQL이다.
✅ 괄호 안의 SQL이 먼저 실행된다.
✅ 실행 결과를 바깥 SQL에서 사용할 수 있다.
✅ 두 번 작성하던 SQL을 한 번에 작성할 수 있다.
연습 문제
기본 문제
① 가장 비싼 상품의 가격을 구하는 SQL을 작성하시오.
② 가장 비싼 상품의 이름을 조회하는 서브쿼리를 작성하시오.
응용 문제
① 가장 최근 주문일의 주문을 조회하시오.
② 가장 저렴한 상품을 조회하시오.
도전 문제
평균 가격보다 비싼 상품을 조회하는 SQL을 작성해 보시오.
(힌트: AVG() 함수를 활용해 보세요.)
정답
기본 문제
SELECT ProductName,
Price
FROM Products
WHERE Price =
(
SELECT MAX(Price)
FROM Products
);
응용 문제
SELECT *
FROM Orders
WHERE OrderDate =
(
SELECT MAX(OrderDate)
FROM Orders
);
도전 문제
SELECT ProductName,
Price
FROM Products
WHERE Price >
(
SELECT AVG(Price)
FROM Products
);