📊 [SQL 프로젝트] 제23장 INNER JOIN - 두 테이블을 연결해 봅시다.
제2부 여러 테이블을 연결하는 SQL
제23장 INNER JOIN - 두 테이블을 연결해 봅시다.
📚 JOIN 학습 시리즈
① 왜 JOIN이 필요할까요?
② INNER JOIN ← 현재
③ 관계를 따라 JOIN하기
④ 여러 테이블 JOIN
⑤ LEFT JOIN
⑥ RIGHT JOIN
⑦ SELF JOIN
오늘의 질문
지난 시간에 우리는
"고객이 주문한 상품"
을 조회하려면
여러 테이블을 연결해야 한다는 것을 배웠습니다.
이번에는 조금 쉬운 문제부터 시작해 보겠습니다.
팀장님이 말합니다.
"주문번호와 고객 이름을 함께 출력해 주세요."
잠시 생각해 봅시다.
주문번호는
어느 테이블에 있을까요?
→ Orders
고객 이름은
어느 테이블에 있을까요?
→ Customers
즉,
이번에는
두 개의 테이블을 함께 읽어야 합니다.
학습 목표
이번 장을 학습하면
- INNER JOIN의 역할을 설명할 수 있다.
- 두 개의 테이블을 연결할 수 있다.
- ON 절이 왜 필요한지 이해할 수 있다.
- 가장 기본적인 JOIN을 작성할 수 있다.
23-1. 먼저 테이블을 살펴봅시다.
Customers 테이블
| CustomerID | CustomerName |
| ALFKI | Alfreds Futterkiste |
| ANATR | Ana Trujillo |
| ANTON | Around the Horn |
Orders 테이블
| OrderID | CustomerID |
| 10248 | VINET |
| 10249 | TOMSP |
| 10250 | HANAR |
| 10251 | VICTE |
여기서 중요한 것은
CustomerID
입니다.
두 테이블 모두
CustomerID를 가지고 있습니다.
바로 이것이
두 테이블을 연결하는 열쇠입니다.
잠깐 생각해 보기
만약
Customers에
ANTON
이 있고,
Orders에도
ANTON
이 있다면,
이 둘은 같은 고객을 의미합니다.
즉,
공통된 값을 이용하여 연결할 수 있습니다.
23-2. 그런데 어떻게 연결할까요?
일반적으로 가장 많이 하는 생각입니다.
"그냥 JOIN 하면 되지 않을까요?"
예를 들어
SELECT *
FROM Customers
JOIN Orders;
이렇게 작성하면 될까요?
아닙니다.
SQL은
무엇을 기준으로 연결해야 하는지
모릅니다.
예를 들어
Customers에는
- CustomerID
- CustomerName
- Country
등이 있습니다.
Orders에도
- OrderID
- CustomerID
- EmployeeID
등이 있습니다.
SQL은
어떤 열이 같은 것인지
알 수 없습니다.
그래서
우리가 알려 주어야 합니다.
이것이 바로 ON입니다.
ON은
SQL에게
"이 열을 기준으로 연결하세요."
라고 알려 주는 역할을 합니다.
즉,
ON
↓
연결 기준
입니다.
그림으로 이해하기
Customers
CustomerID
│
│
▼
CustomerID
Orders
같은 CustomerID끼리 연결합니다.
23-3. 이제 INNER JOIN을 작성해 봅시다.
SELECT CustomerName,
OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
실행 결과(예)
| CustomerName | OrderID |
| Around the Horn | 10355 |
| Around the Horn | 10383 |
| Around the Horn | 10453 |
| ... | ... |
고객 이름과
주문번호가
하나의 결과로 출력되었습니다.
SQL을 한 줄씩 읽어 보기
SELECT CustomerName,
OrderID
↓
출력할 열을 선택합니다.
FROM Customers
↓
Customers 테이블부터 읽습니다.
INNER JOIN Orders
↓
Orders 테이블을 함께 읽습니다.
ON Customers.CustomerID = Orders.CustomerID
↓
CustomerID가 같은 행끼리 연결합니다.
즉,
CustomerID가 같은 고객과 주문을 하나의 결과로 보여 주세요.
라는 의미입니다.
잠깐!
INNER는 무슨 뜻일까요?
INNER JOIN은
양쪽 테이블에 모두 존재하는 데이터만 연결합니다.
예를 들어
Customers
A
B
C
Orders
B
C
D
이면
결과는
B
C
만 출력됩니다.
이것이
INNER(공통 부분)입니다.
(LEFT JOIN에서 다시 자세히 배우겠습니다.)
💡 잠깐! 이것도 알아두세요
INNER는 생략할 수도 있습니다.
다음 두 SQL은
완전히 같습니다.
FROM Customers
INNER JOIN Orders
FROM Customers
JOIN Orders
실무에서도 둘 다 많이 사용합니다.
다만,
초보자는
INNER JOIN을 모두 쓰는 것이
의미를 이해하기 쉽습니다.
자주 하는 실수
① ON을 빼먹는다.
SELECT *
FROM Customers
INNER JOIN Orders;
무엇을 기준으로 연결해야 하는지
알 수 없습니다.
② 잘못된 열을 연결한다.
예를 들어
ON Customers.CustomerName = Orders.CustomerID
처럼
관계없는 열을 연결하면
원하는 결과가 나오지 않습니다.
③ JOIN은 테이블을 합치는 기능이라고 생각한다.
JOIN은
조회 결과만 연결합니다.
원래 테이블은
전혀 변경되지 않습니다.
④ INNER JOIN이 모든 데이터를 출력한다고 생각한다.
INNER JOIN은
공통된 데이터만 출력합니다.
이 부분은
LEFT JOIN에서 다시 비교해 보겠습니다.
실무에서는 어떻게 사용할까요?
회사에서는 INNER JOIN을 사용하여
- 고객 이름과 주문번호 조회
- 주문과 상품 연결
- 상품과 공급업체 연결
- 직원과 주문 연결
등을 매우 자주 수행합니다.
실제로 SQL 업무의 대부분은
INNER JOIN으로 시작한다고 해도 과언이 아닙니다.
실습
실습 1
고객 이름과 주문번호를 조회하세요.
SELECT CustomerName,
OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
실습 2
고객 이름과 주문 날짜를 조회하세요.
SELECT CustomerName,
OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
실습 3
모든 열을 출력하여
JOIN 결과를 확인해 보세요.
SELECT *
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
실무 미션
여러분은 영업팀 직원입니다.
팀장님이 다음과 같이 요청했습니다.
"주문번호, 고객 이름, 주문 날짜를 함께 출력해 주세요."
다음 항목을 출력하는 SQL을 작성하세요.
- OrderID
- CustomerName
- OrderDate
힌트)
Customers와 Orders를 INNER JOIN으로 연결합니다.
핵심 정리
✔ INNER JOIN은 두 테이블을 연결하는 가장 기본적인 JOIN이다.
✔ ON은 어떤 열을 기준으로 연결할지 지정하는 절이다.
✔ 공통된 값을 가진 행만 결과에 포함된다.
✔ INNER는 생략할 수 있지만, 초보자는 의미를 이해하기 위해 함께 작성하는 것이 좋다.
연습 문제
기본 문제
- INNER JOIN의 역할을 설명하세요.
- ON 절이 필요한 이유를 설명하세요.
- INNER JOIN과 JOIN의 차이를 설명하세요.
응용 문제
- Customers와 Orders를 연결하여 고객 이름과 주문번호를 조회하는 SQL을 작성하세요.
- 고객 이름과 주문 날짜를 조회하는 SQL을 작성하세요.
- SELECT *를 사용하여 JOIN 결과를 확인하는 SQL을 작성하세요.
도전 문제
다음 SQL에서 잘못된 부분을 찾아 수정해 보세요.
SELECT CustomerName,
OrderID
FROM Customers
INNER JOIN Orders;
다음 장 예고
이번 장에서는 두 개의 테이블를 연결하는 방법을 배웠습니다.
하지만 실제 데이터베이스는 두 개의 테이블만 연결해서 끝나지 않습니다.
예를 들어 "고객이 주문한 상품 이름"을 조회하려면 Customers와 Orders만으로는 부족합니다. 주문 상세(OrderDetails)와 상품(Products)까지 차례대로 연결해야 합니다.
다음 장에서는 관계(Relationship)를 따라 여러 테이블을 연결하는 방법을 배우겠습니다. 여기서 학생들은 "JOIN은 암기하는 문법이 아니라, 관계도를 따라가는 과정"이라는 사실을 자연스럽게 이해하게 될 것입니다.