여러 테이블에 흩어진 데이터를 하나로 합치는 방법.
JOIN 으로 테이블 연결하기
관계형 DB의 핵심은 데이터를 나눠 저장하고, 필요할 때 JOIN 으로 합치는 것입니다. 학생 정보와 반 정보를 따로 두면 중복이 줄고 관리가 쉬워지죠. 이 레슨에서는 다양한 JOIN의 차이를 예제로 확실히 구분합니다.
학습 목표
- INNER / LEFT / RIGHT / FULL OUTER JOIN의 차이를 이해합니다.
- CROSS JOIN과 SELF JOIN의 쓰임을 배웁니다.
- 세 개 이상의 테이블을 연쇄적으로 조인합니다.
- 카티시안 곱이 생기는 실수를 피합니다.
예시 테이블
-- Students(학생) -- Classes(반)
-- id | name | class_id -- id | name
-- 1 | 민수 | 10 -- 10 | A반
-- 2 | 영희 | 20 -- 20 | B반
-- 3 | 철수 | NULL -- 30 | C반
민수·영희는 반이 있고, 철수는 아직 반 배정이 없으며(NULL), C반에는 학생이 없습니다. 이 상태로 각 JOIN 결과가 어떻게 달라지는지 보겠습니다.
INNER JOIN — 양쪽 모두 있는 행만
SELECT s.name AS 학생, c.name AS 반
FROM Students s
INNER JOIN Classes c ON s.class_id = c.id;
| 학생 | 반 |
|---|---|
| 민수 | A반 |
| 영희 | B반 |
철수는 class_id 가 없어 매칭되지 않으므로 제외됩니다.
LEFT JOIN — 왼쪽은 모두, 오른쪽은 있으면
반이 배정되지 않은 학생도 보고 싶다면:
SELECT s.name AS 학생, c.name AS 반
FROM Students s
LEFT JOIN Classes c ON s.class_id = c.id;
| 학생 | 반 |
|---|---|
| 민수 | A반 |
| 영희 | B반 |
| 철수 | NULL |
매칭되는 반이 없으면 반 열은 NULL 로 나옵니다. "한쪽 전체 + 매칭 여부"를 볼 때 가장 자주 쓰는 조인입니다.
💡 TIP — "A에는 있지만 B에는 없는 행"만 찾고 싶다면 LEFT JOIN 후
WHERE c.id IS NULL을 붙입니다. 매칭에 실패한 행만 남습니다.
RIGHT / FULL OUTER JOIN
-- 학생이 없는 반(C반)까지 포함
SELECT s.name AS 학생, c.name AS 반
FROM Students s
RIGHT JOIN Classes c ON s.class_id = c.id;
-- 양쪽 전부 (짝 없는 학생 + 짝 없는 반 모두)
SELECT s.name AS 학생, c.name AS 반
FROM Students s
FULL OUTER JOIN Classes c ON s.class_id = c.id;
JOIN 종류 정리
| 종류 | 결과 |
|---|---|
INNER JOIN | 양쪽에 모두 매칭되는 행 |
LEFT JOIN | 왼쪽 전체 + 매칭되는 오른쪽 |
RIGHT JOIN | 오른쪽 전체 + 매칭되는 왼쪽 |
FULL OUTER JOIN | 양쪽 전체 |
CROSS JOIN | 모든 행의 조합(곱) |
SELF JOIN | 자기 테이블끼리 조인 |
CROSS JOIN — 모든 조합
-- 모든 색상 × 모든 사이즈 조합 생성
SELECT col.name AS 색상, sz.name AS 사이즈
FROM Colors col
CROSS JOIN Sizes sz;
의도적으로 모든 조합이 필요할 때(예: 옵션 매트릭스 생성) 사용합니다.
SELF JOIN — 같은 테이블 안의 관계
직원-상사처럼 한 테이블 안에서 행끼리 연결할 때 씁니다.
SELECT e.name AS 직원, m.name AS 상사
FROM Employees e
LEFT JOIN Employees m ON e.manager_id = m.id;
다중 조인
SELECT s.name AS 학생, c.name AS 반, t.name AS 담임
FROM Students s
INNER JOIN Classes c ON s.class_id = c.id
INNER JOIN Teachers t ON c.teacher_id = t.id;
조인은 위에서 아래로 차례대로 누적됩니다. 테이블이 늘어날수록 각 ON 조건을 정확히 적는 것이 중요합니다.
⚠️ 주의 — JOIN 조건(
ON)을 빠뜨리면 모든 행이 곱해지는 카티시안 곱이 발생합니다. 1만 행 × 1만 행 = 1억 행이 되어 서버가 멈출 수 있어요. 항상 키로 연결하세요.
요약
INNER JOIN은 양쪽이 매칭되는 행만,LEFT JOIN은 왼쪽 전체를 남깁니다.- 매칭이 없으면 반대편 열은
NULL이 됩니다. CROSS JOIN은 모든 조합,SELF JOIN은 같은 테이블 안의 관계를 표현합니다.- 세 개 이상의 테이블도
JOIN을 연쇄해 합칠 수 있습니다. ON조건을 빠뜨리면 카티시안 곱이 발생하니 주의하세요.
연습문제
- 반이 배정되지 않은 학생만 골라내는 쿼리를 작성하세요.
- 학생이 한 명도 없는 반을 찾는 쿼리를 작성하세요.
- 직원과 그 상사의 이름을 함께 출력하되, 상사가 없는 사람도 포함하세요.
Students,Classes,Teachers세 테이블을 조인해 학생-반-담임을 한 줄에 출력하세요.
힌트 — 1번은
LEFT JOIN ... WHERE c.id IS NULL, 3번은Employees의 SELF JOIN을 떠올리세요.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MSSQL” 강좌에 대한 댓글입니다.