프로그래밍/MySQL

📊 [SQL] 제30장 서브쿼리 - SELECT 안에 또 SELECT를 사용할 수 있을까요?

강릉바다의 블로그 2026. 7. 8. 14:03

제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
);