dev.syw

여러 테이블에 흩어진 데이터를 하나로 합치는 방법.

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 ASFROM Students s
INNER JOIN Classes c ON s.class_id = c.id;
학생
민수A반
영희B반

철수는 class_id 가 없어 매칭되지 않으므로 제외됩니다.

LEFT JOIN — 왼쪽은 모두, 오른쪽은 있으면

반이 배정되지 않은 학생도 보고 싶다면:

SELECT s.name AS 학생, c.name ASFROM 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 ASFROM Students s
RIGHT JOIN Classes c ON s.class_id = c.id;

-- 양쪽 전부 (짝 없는 학생 + 짝 없는 반 모두)
SELECT s.name AS 학생, c.name ASFROM 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 조건을 빠뜨리면 카티시안 곱이 발생하니 주의하세요.

연습문제

  1. 반이 배정되지 않은 학생만 골라내는 쿼리를 작성하세요.
  2. 학생이 한 명도 없는 반을 찾는 쿼리를 작성하세요.
  3. 직원과 그 상사의 이름을 함께 출력하되, 상사가 없는 사람도 포함하세요.
  4. Students, Classes, Teachers 세 테이블을 조인해 학생-반-담임을 한 줄에 출력하세요.

힌트 — 1번은 LEFT JOIN ... WHERE c.id IS NULL, 3번은 Employees 의 SELF JOIN을 떠올리세요.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MSSQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.