지난 강의에서 SQL에서 어떤 JOIN 타입들이 있는지 얘기했었지. 오늘은 INNER JOIN에 좀 더 집중해서 볼 거야.
INNER JOIN은 관계형 데이터베이스에서 데이터를 합치는 방식 중 하나인데, 두 테이블에서 "조건에 맞는" 행만 가져오는 거야. 즉, INNER JOIN은 두 테이블에서 겹치는 부분만 반환하고 나머지는 무시해.
상상해봐, 네가 상자 두 개를 가지고 있다고 치자. 한 상자엔 학생 카드가 있고, 다른 상자엔 학생들이 등록한 강좌 카드가 있어. 어떤 학생이 어떤 강좌에 등록했는지 알고 싶어. 만약 등록 안 한 학생이 있다면, 그건 지금 신경 안 써도 돼. 이런 상황이 바로 INNER JOIN에 딱 맞는 케이스야.
INNER JOIN 문법
문법은 꽤 직관적이야 — 합치고 싶은 두 테이블을 지정하고, ON 키워드로 조인 조건을 써주면 돼.
SELECT 컬럼들
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.필드 = 테이블2.필드;
테이블1이랑테이블2는 네가 합치고 싶은 테이블이야.필드는 매칭할 컬럼(열)이야.ON뒤에 오는 조건이 두 테이블에서 행을 어떻게 맞출지 정해주는 거야.
INNER JOIN 사용 예시
예시를 위해 두 개의 테이블을 쓸 거야:
students 테이블 — 학생 정보
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
enrollments 테이블 — 강좌 등록 정보
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
참고, Dia 학생(student_id = 4)은 아무 강좌에도 등록 안 했어.
예시 1: 학생과 강좌 정보 가져오기
어떤 학생이 어떤 강좌에 등록했는지 알고 싶어. 이게 INNER JOIN의 전형적인 예시야. students랑 enrollments 테이블에서 student_id 기준으로 데이터가 겹치는 것만 신경 쓰면 돼.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
결과:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
어때? INNER JOIN은 강좌에 등록한 학생만 보여줘. Dia 학생은 아무 데도 등록 안 해서 결과에 안 나와.
예시 2: 주문과 고객 정보 가져오기
이번엔 다른 예시를 볼게. orders(주문)랑 customers(고객) 테이블이 있다고 치자. 모든 주문에 대해 고객 이름을 같이 보고 싶어.
orders 테이블
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
customers 테이블
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
문제: orders랑 customers를 customer_id로 조인해서, 고객이 있는 주문만 반환해야 해.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
결과:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
여기서 order_id = 3인 주문은 결과에 없어. 왜냐면 customer_id = 103인 고객이 customers 테이블에 없으니까.
INNER JOIN으로 테이블을 합칠 때 (그리고 뭐가 잘못될 수 있는지)
INNER JOIN은 거의 모든 관계형 데이터베이스 프로젝트에서 기본적으로 쓰는 도구야. 공구함에 있는 스패너 같은 거지: 이거 없이도 할 수는 있지만, 훨씬 힘들어질걸. 예를 들면:
- 여러 테이블에서 데이터 합쳐서 리포트 만들 때.
- 분석할 때, 예를 들어 판매랑 고객 데이터 같이 볼 때.
- 외부 시스템 데이터 통합할 때.
초보자들이 제일 많이 하는 실수는 ON을 빼먹거나 조인 조건을 잘못 쓰는 거야. 조건을 제대로 안 쓰면, 원하는 결과 대신 데카르트 곱이 나와 — 이건 수천, 수만 줄의 의미 없는 데이터가 될 수 있어.
실수 예시:
이 예시엔 조인 조건이 없어서, 두 테이블의 모든 행 조합이 만들어져 (이건 진짜 원하는 게 아닐 거야):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- 오류: 조인 조건이 없음!
결과는 완전 혼돈이야: students의 각 행이 enrollments의 모든 행과 조합돼.
GO TO FULL VERSION