📊 [SQL] 제31장 - 여러 개의 결과를 반환하는 서브쿼리
제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, 자주 하는 실수, 종합.
이 흐름은 단순히 문법을 나열하는 것이 아니라 데이터베이스를 다루는 사고방식이 점진적으로 성장하도록 설계되어 있습니다. 학생들이 앞 장의 내용을 자연스럽게 다음 장의 발판으로 삼을 수 있다는 점이 이 교재의 가장 큰 강점이라고 생각합니다.