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

📊 [SQL] 제31장 - 여러 개의 결과를 반환하는 서브쿼리

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

제31장. 여러 개의 결과를 반환하는 서브쿼리

"결과가 하나가 아니라 여러 개라면?"


학습 목표

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

  • 여러 개의 값을 반환하는 서브쿼리를 이해할 수 있다.
  • IN과 서브쿼리를 함께 사용할 수 있다.
  • =와 IN의 차이를 설명할 수 있다.
  • 다중 행 서브쿼리를 작성할 수 있다.

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

지난 장에서는

SELECT ProductName
FROM Products
WHERE Price =
(
    SELECT MAX(Price)
    FROM Products
);

를 배웠습니다.

왜 =를 사용할 수 있었을까요?

그 이유는

안쪽 SQL의 결과가

263.50

단 하나였기 때문입니다.


그런데 이번에는?

다음 문제를 보겠습니다.

"독일(Germany)의 고객이 주문한 주문번호를 조회하시오."

 

먼저

독일 고객의 번호를 찾아야 합니다.

SELECT CustomerID
FROM Customers
WHERE Country = 'Germany';

실행 결과

CustomerID
1
6
11
32
...

이번에는

결과가 하나가 아닙니다.


그러면 어떻게 될까요?

다음 SQL을 작성하면 어떨까요?

SELECT *
FROM Orders
WHERE CustomerID =
(
    SELECT CustomerID
    FROM Customers
    WHERE Country='Germany'
);

실행하면

오류가 발생합니다.

왜일까요?


이유는 간단합니다.

=는

하나의 값만 비교할 수 있기 때문입니다.

하지만

안쪽 SQL은

여러 개의 값을 반환했습니다.

1
6
11
32

이것을

하나의 값과 비교할 수는 없습니다.


해결 방법은?

바로

IN입니다.


예제 1. 독일 고객의 주문 조회

SELECT *
FROM Orders
WHERE CustomerID IN
(
    SELECT CustomerID
    FROM Customers
    WHERE Country='Germany'
);

실행 순서

먼저

SELECT CustomerID
FROM Customers
WHERE Country='Germany'

실행

1
6
11
32

바깥 SQL 실행

CustomerID가
1 또는
6 또는
11 또는
32

인 주문을 찾습니다.


그림으로 이해하기

안쪽 SQL
↓
1
6
11
32
↓
IN
↓
Orders 검색

"=" 와 "IN" 비교하기

결과 개수 사용하는 연산자
하나 =
여러 개 IN

학생들이 반드시 기억해야 하는 표입니다.


실제 업무에서는?

예를 들어

서울 지점에 근무하는 직원들의

주문 내역을 조회한다고 합시다.

먼저

서울 직원 번호를 찾고,

그 번호를 이용하여

주문을 조회합니다.

이처럼

다중 행 서브쿼리는

실무에서도 매우 자주 사용됩니다.


많이 하는 실수

실수 ①

결과가 여러 개인데

=를 사용한다.

오류가 발생합니다.


실수 ②

IN 대신

OR를 계속 작성한다.

WHERE CustomerID=1
OR CustomerID=6
OR CustomerID=11
OR CustomerID=32

가능은 하지만

비효율적입니다.


실수 ③

안쪽 SQL의 결과 개수를 확인하지 않는다.

서브쿼리를 만들 때는

먼저

안쪽 SQL만 실행해 보는 습관이 좋습니다.

이것은 실무에서도 매우 많이 사용하는 방법입니다.


한눈에 정리

안쪽 SQL 결과 사용
1개 =
여러 개 IN

이번 장 핵심 정리

✅ 결과가 하나면 =를 사용한다.

✅ 결과가 여러 개면 IN을 사용한다.

✅ 먼저 안쪽 SQL을 실행해 보면 이해하기 쉽다.

✅ 다중 행 서브쿼리는 실무에서도 매우 많이 사용된다.


연습 문제

기본 문제

① 영국(UK) 고객의 주문을 조회하시오.

② 미국(USA) 고객의 주문을 조회하시오.


응용 문제

① 음료(Beverages) 카테고리 상품을 조회하시오.

(힌트: Categories와 Products를 활용하세요.)

② 공급업체가 독일에 있는 상품을 조회하시오.


도전 문제

고객이 한 번이라도 주문한 적이 있는 고객만 조회하는 SQL을 작성하시오.

(힌트: Orders 테이블의 CustomerID를 활용하세요.)


💡 제32장 예고

제31장까지 오면 학생들은 자연스럽게 이런 의문을 갖게 됩니다.

"서브쿼리는 WHERE에서만 사용할 수 있나요?"

 

바로 이 질문이 제32장의 시작이 됩니다.

제32장에서는 SELECT 절과 FROM 절에서도 서브쿼리를 사용할 수 있다는 것을 소개하면, 학생들은 서브쿼리를 하나의 독립된 도구로 이해하게 됩니다.