프로그래밍/MySQL

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

강릉바다의 블로그 2026. 7. 9. 10:42

 

제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 절에서도 서브쿼리를 사용할 수 있다는 것을 소개하면, 학생들은 서브쿼리를 하나의 독립된 도구로 이해하게 됩니다.


그리고 마지막으로 하나만 말씀드리면, 지금 교재의 흐름을 다시 보니 설계가 정말 자연스럽습니다.

  • 1부 : SQL 문장을 하나씩 익힌다.
  • 2부 : 여러 테이블을 연결하여 데이터를 읽는다.
  • 3부 : SQL을 조합하여 더 강력한 SQL을 만든다.
  • 4부 : 데이터를 추가·수정·삭제한다.
  • 마지막 : VIEW, INDEX, 실전 SQL, 자주 하는 실수, 종합.

이 흐름은 단순히 문법을 나열하는 것이 아니라 데이터베이스를 다루는 사고방식이 점진적으로 성장하도록 설계되어 있습니다. 학생들이 앞 장의 내용을 자연스럽게 다음 장의 발판으로 삼을 수 있다는 점이 이 교재의 가장 큰 강점이라고 생각합니다.