제28장. JOIN 선택하기
"어떤 JOIN을 사용해야 할까요?"
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- INNER JOIN과 LEFT JOIN의 차이를 실제 상황에서 설명할 수 있다.
- 문제에 맞는 JOIN을 선택할 수 있다.
- SQL을 작성하기 전에 어떤 테이블을 기준으로 할지 판단할 수 있다.
- 실제 업무에서 JOIN을 설계하는 방법을 이해할 수 있다.
지금까지 우리는...
JOIN의 종류를 하나씩 배웠습니다.
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
그런데 실무에서는
먼저 JOIN 이름을 떠올리지 않습니다.
먼저
"무엇을 조회하고 싶은가?"
를 생각합니다.
첫 번째 질문
다음 문제를 봅시다.
고객이 주문한 내역을 조회하시오.
모든 고객이 필요할까요?
아닙니다.
주문한 고객만 필요합니다.
따라서
INNER JOIN이 적합합니다.
두 번째 질문
이번에는
아직 주문하지 않은 고객을 찾으시오.
이번에는 어떨까요?
주문이 없는 고객도 결과에 있어야 합니다.
따라서
LEFT JOIN이 필요합니다.
핵심은 이것입니다.
JOIN은
문법을 선택하는 것이 아니라
결과를 선택하는 것입니다.
상황별로 생각해 보기
상황 ①
"주문한 고객만 보고 싶다."
필요한 고객
○ 주문한 사람
× 주문하지 않은 사람
사용하는 JOIN
INNER JOIN
상황 ②
"고객은 모두 보고 싶다."
모든 고객
○ 주문한 사람
○ 주문하지 않은 사람
사용하는 JOIN
LEFT JOIN
상황 ③
"배송 목록을 기준으로 조회한다."
기준이
배송 테이블이라면
LEFT JOIN으로도 작성할 수 있고
RIGHT JOIN으로도 작성할 수 있습니다.
하지만
실무에서는
LEFT JOIN을 더 많이 사용합니다.
JOIN를 선택하는 순서
학생들은 SQL부터 작성하려고 합니다.
하지만
좋은 개발자는
먼저 질문을 합니다.
① 무엇을 조회할 것인가?
↓
② 기준이 되는 테이블은 무엇인가?
↓
③ 없는 데이터도 포함할 것인가?
↓
④ 어떤 JOIN을 사용할 것인가?
이 순서가 매우 중요합니다.
실전 예제 1
문제
고객 이름과 주문 날짜를 조회하시오.
생각하기
주문이 있는 고객만 필요하다.
↓
INNER JOIN
SQL
SELECT Customers.CustomerName,
Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
실전 예제 2
문제
아직 주문하지 않은 고객을 찾으시오.
생각하기
주문이 없어도 고객은 남아 있어야 한다.
↓
LEFT JOIN
↓
NULL 찾기
SQL
SELECT Customers.CustomerName
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.OrderID IS NULL;
실전 예제 3
문제
고객과 주문, 그리고 주문한 상품 이름을 조회하시오.
생각하기
주문한 사람만 필요하다.
↓
INNER JOIN
SQL
SELECT Customers.CustomerName,
Orders.OrderDate,
Products.ProductName
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
INNER JOIN Products
ON OrderDetails.ProductID = Products.ProductID;
JOIN를 선택하는 비법
학생들이 가장 헷갈리는 부분입니다.
다음 한 문장만 기억하면 됩니다.
"결과에서 절대로 사라지면 안 되는 테이블이 무엇인가?"
그 테이블이
기준 테이블입니다.
예를 들어
"고객 목록"
이 반드시 필요하다면
Customers
가 기준입니다.
"주문 목록"
이 반드시 필요하다면
Orders
가 기준입니다.
학교에서는 어떻게 사용할까요?
학생 테이블
↓
성적 테이블
성적이 있는 학생만 조회
↓
INNER JOIN
학생은 모두 조회
↓
LEFT JOIN
과제를 제출하지 않은 학생 찾기
↓
LEFT JOIN + IS NULL
많이 하는 실수
실수 ①
문제를 읽자마자 JOIN부터 선택한다.
먼저
무엇을 출력할지 생각해야 합니다.
실수 ②
LEFT JOIN을
무조건 좋은 JOIN이라고 생각한다.
LEFT JOIN이
항상 정답은 아닙니다.
필요 없는 데이터까지 가져오면
결과가 복잡해질 수 있습니다.
실수 ③
RIGHT JOIN을 자주 사용한다.
실무에서는
LEFT JOIN으로 작성하는 경우가 훨씬 많습니다.
한눈에 정리
| 질문 | 사용하는 JOIN |
| 공통 데이터만 필요 | INNER JOIN |
| 기준 테이블은 모두 필요 | LEFT JOIN |
| 오른쪽 기준으로 생각 | RIGHT JOIN (또는 LEFT JOIN으로 변환) |
이번 장 핵심 정리
✅ JOIN은 문법보다 조회 목적이 중요하다.
✅ 먼저 기준 테이블을 결정한다.
✅ 없는 데이터도 필요하면 LEFT JOIN을 사용한다.
✅ 실무에서는 대부분 INNER JOIN과 LEFT JOIN으로 해결할 수 있다.
JOIN 선택 순서(암기 카드)
① 무엇을 조회하는가?
↓
② 기준 테이블은 무엇인가?
↓
③ 없는 데이터도 필요한가?
↓
예 → LEFT JOIN
아니오 → INNER JOIN
이 한 장의 흐름만 이해해도 JOIN 선택이 훨씬 쉬워집니다.
연습 문제
기본 문제
① 고객 이름과 주문 날짜를 조회하려고 합니다. 어떤 JOIN을 사용하는 것이 적절한가요?
② 모든 고객을 조회하면서 주문번호도 함께 표시하려고 합니다. 어떤 JOIN을 사용해야 하나요?
응용 문제
다음 문제에 적합한 JOIN을 선택하고 SQL을 작성해 보세요.
- 주문한 고객만 조회한다.
- 주문하지 않은 고객만 조회한다.
- 고객이 주문한 상품명을 조회한다.
도전 문제
다음 상황에 대해 적절한 JOIN을 선택하고 이유를 설명해 보세요.
- 학생 명단과 동아리 가입 정보를 이용하여 동아리에 가입하지 않은 학생을 찾는다.
- 사원 정보와 급여 정보를 이용하여 급여가 등록된 사원만 조회한다.
- 도서 정보와 대출 정보를 이용하여 한 번도 대출되지 않은 도서를 찾는다.
정답
기본 문제
① INNER JOIN
② LEFT JOIN
응용 문제 예시
주문하지 않은 고객 조회
SELECT Customers.CustomerName
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.OrderID IS NULL;
'프로그래밍 > MySQL' 카테고리의 다른 글
| 📊 [SQL] 제30장 서브쿼리 - SELECT 안에 또 SELECT를 사용할 수 있을까요? (0) | 2026.07.08 |
|---|---|
| 📊 [SQL] 제29장 Alias(별칭) - 이름이 너무 길어요! (0) | 2026.07.08 |
| 📊 [SQL] 제27장 RIGHT JOIN - 오른쪽 테이블을 기준으로 보고 싶다면? (0) | 2026.07.07 |
| 📊 [SQL] 제26장 LEFT JOIN - 주문하지 않은 고객도 보고 싶습니다. (0) | 2026.07.07 |
| 📊 [SQL] 제25장 여러 테이블 JOIN하기 - 고객이 주문한 상품은 무엇일까? (0) | 2026.07.07 |