📊 [SQL 프로젝트] 제22장 왜 JOIN이 필요할까요? - 여러 테이블을 연결하는 이유
제2부 여러 테이블을 연결하는 SQL
제22장 왜 JOIN이 필요할까요? - 여러 테이블을 연결하는 이유
📚 JOIN 학습 시리즈
① 왜 JOIN이 필요할까요? ← 현재
② INNER JOIN
③ 관계를 따라 JOIN하기
④ 여러 테이블 JOIN
⑤ LEFT JOIN
⑥ RIGHT JOIN
⑦ SELF JOIN
제2부를 시작하며
축하합니다!
여러분은 지금까지 SQL의 가장 중요한 기초를 모두 배웠습니다.
여러분은 이제
- 원하는 데이터를 조회하고
- 조건을 지정하고
- 정렬하고
- 그룹별 통계를 계산하는 SQL을 작성할 수 있습니다.
하지만 실제 회사에서는 이런 질문을 더 자주 받습니다.
"어떤 고객이 어떤 상품을 주문했나요?"
잠시 생각해 봅시다.
이 질문에 지금까지 배운 SQL만으로 답할 수 있을까요?
오늘의 질문
회사에서 다음과 같은 요청이 들어왔습니다.
"Anton 고객이 주문한 상품 이름을 알려 주세요."
보통 먼저 Products 테이블을 열어 봅니다.
하지만 고객 이름은 없습니다.
이번에는 Customers 테이블을 열어 봅니다.
이번에는 상품 이름이 없습니다.
Orders 테이블도 열어 봅니다.
역시 상품 이름은 없습니다.
그런데 이상합니다.
분명 데이터베이스 안에는 이 정보가 있을 텐데,
왜 어느 테이블에도 정답이 보이지 않을까요?
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- 하나의 테이블만으로 해결할 수 없는 문제를 이해할 수 있다.
- 데이터를 여러 테이블로 나누어 저장하는 이유를 설명할 수 있다.
- JOIN이 필요한 이유를 이해할 수 있다.
- 다음 장에서 배울 INNER JOIN의 필요성을 이해할 수 있다.
22-1. 하나의 테이블만으로는 부족합니다.
Products 테이블에는 상품 정보가 있습니다.
| ProductID | ProductName | Price |
| 1 | Chais | 18.00 |
| 2 | Chang | 19.00 |
여기에는
- 상품 이름
- 가격
은 있지만,
누가 주문했는지는 알 수 없습니다.
Customers 테이블을 보면
| CustomerID | CustomerName | Country |
| ALFKI | Alfreds Futterkiste | Germany |
| ANTON | Around the Horn | UK |
이번에는
고객 이름은 있지만,
무엇을 주문했는지는 없습니다.
Orders 테이블에는
| OrderID | CustomerID | EmployeeID | OrderDate |
| 10248 | VINET | 5 | 1996-07-04 |
| 10249 | TOMSP | 6 | 1996-07-05 |
여기에는
주문 정보는 있지만,
상품 이름은 없습니다.
즉,
각 테이블은
자신의 역할만 담당합니다.
잠깐 생각해 보기
여러분이라면 어떻게 저장하시겠습니까?
방법 ①
모든 정보를 하나의 거대한 테이블에 저장한다.
또는
방법 ②
고객, 상품, 주문을 각각 따로 저장한다.
어떤 방법이 더 좋을까요?
22-2. 왜 여러 테이블로 나눌까요?
만약 모든 정보를 하나의 테이블에 저장하면 어떻게 될까요?
| 고객 | 상품 | 가격 | 주문일 |
| Anton | Chais | 18 | 7월 4일 |
| Anton | Chang | 19 | 7월 5일 |
| Anton | Ikura | 31 | 7월 7일 |
언뜻 보기에는 편해 보입니다.
하지만 문제가 있습니다.
Anton이 주소를 변경하면
모든 행을 수정해야 합니다.
상품 가격이 바뀌면
여러 행을 수정해야 합니다.
같은 정보가 계속 반복됩니다.
그래서 데이터베이스는
정보를 역할별로 나누어 저장합니다.
Customers
↓
Orders
↓
OrderDetails
↓
Products
이 구조 덕분에
데이터를 효율적으로 관리할 수 있습니다.
22-3. 그렇다면 어떻게 연결할까요?
테이블을 따로 저장했는데
필요할 때는 함께 봐야 합니다.
예를 들어
Customers
↓
Orders
↓
OrderDetails
↓
Products
처럼 연결하면
"고객이 주문한 상품"
을 확인할 수 있습니다.
이처럼
여러 테이블을 연결하여 하나의 결과를 만드는 기능이
바로 JOIN입니다.
그림으로 이해하기
Customers
(CustomerID)
│
│
Orders
(CustomerID)
│
│
OrderDetails
(OrderID)
│
│
Products
(ProductID)
테이블끼리는
공통된 값을 이용하여 연결됩니다.
다음 장에서는
이 연결 방법을 SQL로 직접 작성하게 됩니다.
💡 잠깐! 이것도 알아두세요
JOIN은
데이터를 합치는 것이 아닙니다.
테이블을 수정하는 것도 아닙니다.
필요한 순간에만
여러 테이블을 함께 조회하는 기능입니다.
조회가 끝나면
원래의 테이블은 그대로 유지됩니다.
학생들이 가장 많이 하는 오해
① JOIN은 테이블을 하나로 합치는 것이다.
아닙니다.
JOIN은
조회 결과만 함께 보여 줍니다.
테이블 자체는 변경되지 않습니다.
② 모든 정보를 하나의 테이블에 저장하는 것이 더 쉽다.
처음에는 쉬워 보입니다.
하지만
데이터가 많아질수록 관리가 매우 어려워집니다.
그래서 관계형 데이터베이스는
여러 테이블로 나누어 저장합니다.
③ JOIN은 어려운 문법이다.
사실 JOIN은
"공통된 값을 이용하여 연결한다."
라는 원리만 이해하면
생각보다 어렵지 않습니다.
실무에서는 어떻게 사용할까요?
회사에서는 JOIN을 사용하여
- 고객과 주문 정보를 함께 조회하고
- 주문 상품을 확인하고
- 공급업체와 상품을 연결하며
- 배송 회사 정보를 함께 조회합니다.
실제로 업무에서 작성하는 SQL의 대부분은 JOIN을 포함합니다.
즉,
JOIN은 SQL에서 가장 많이 사용하는 기능 중 하나입니다.
실습
실습 1
Products 테이블을 열어 보세요.
다음 질문에 답해 보세요.
고객 이름을 찾을 수 있나요?
실습 2
Customers 테이블을 열어 보세요.
다음 질문에 답해 보세요.
상품 이름을 찾을 수 있나요?
실습 3
Orders 테이블을 열어 보세요.
다음 질문에 답해 보세요.
상품 이름이 저장되어 있나요?
실무 미션
여러분은 신입 사원입니다.
팀장님이 다음과 같이 말씀하셨습니다.
"고객이 주문한 상품을 조회하는 프로그램을 만들어 주세요."
현재 여러분이 가지고 있는 테이블은
- Customers
- Orders
- OrderDetails
- Products
입니다.
생각해 봅시다.
어떤 테이블부터 어떤 순서로 연결해야 할까요?
(아직 SQL을 작성하지 않아도 됩니다.)
핵심 정리
✔ 하나의 테이블만으로는 모든 정보를 저장할 수 없다.
✔ 데이터는 역할에 따라 여러 테이블로 나누어 저장한다.
✔ 여러 테이블을 연결하여 조회하는 기능이 JOIN이다.
✔ JOIN은 데이터를 수정하지 않고 조회 결과만 연결한다.
✔ 실제 업무에서는 JOIN이 매우 자주 사용된다.
연습 문제
기본 문제
- 데이터를 여러 테이블로 나누어 저장하는 이유를 설명하세요.
- JOIN이 필요한 이유를 설명하세요.
- JOIN은 테이블 자체를 합치는 기능인가요?
응용 문제
- "고객이 주문한 상품"을 조회하려면 어떤 테이블들이 필요할까요?
- Products 테이블만으로 알 수 있는 정보와 알 수 없는 정보를 구분해 보세요.
- Customers 테이블과 Orders 테이블은 어떤 정보로 연결될 것이라고 예상하나요?
도전 문제
다음 네 개의 테이블을 이용하여
"고객 이름 → 주문 날짜 → 상품 이름"
을 조회하려면
테이블을 어떤 순서로 연결해야 하는지
화살표로 표현해 보세요.
Customers
Orders
OrderDetails
Products
다음 장 예고
이제 JOIN이 왜 필요한지는 이해했습니다.
다음 장에서는 SQL에서 가장 기본이 되는 INNER JOIN을 처음으로 사용해 보겠습니다.
우리는 단순히 문법을 외우는 것이 아니라,
"공통된 값을 기준으로 두 개의 테이블을 연결하는 방법"을 직접 실습하게 됩니다.