모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

12강 / 전체 24강

조인 개념

8분 읽기 조회 0

관계형 데이터베이스에서 테이블을 연결하는 조인의 개념, 외래키의 역할, INNER JOIN의 동작 원리를 이해합니다.

🎯 학습 목표

이 강을 마치면 왜 데이터를 여러 테이블에 나눠 저장하는지 이해할 수 있습니다. 테이블 간의 관계를 정의하는 외래키(Foreign Key)의 역할을 파악하고, JOIN이 어떤 원리로 두 테이블의 데이터를 하나로 합치는지 설명할 수 있게 됩니다. 13강의 실전 INNER JOIN 작성에 앞서 조인의 토대를 완전히 이해하는 것이 이 강의 목표입니다.

💡 왜 테이블을 나누는가

이 섹션에서는 데이터를 여러 테이블로 분리해 저장하는 이유와 이로 인해 발생하는 문제를 살펴보겠습니다.

만약 "온라인 서점의 주문 내역"을 하나의 테이블에 저장한다면 어떻게 될까요? 아래처럼 모든 정보를 한 행에 담을 수 있습니다.

order_id회원이름이메일등급도서제목저자가격수량주문일
1김민준minjun@example.comVIPSQL 첫걸음아사이 아츠시2200012024-03-15
2김민준minjun@example.comVIP클린 코드로버트 C. 마틴3300012024-03-20
3이서연seoyeon@example.comREGULARSQL 첫걸음아사이 아츠시2200022024-04-01

직관적으로 보이지만 심각한 문제가 있습니다. 첫째로 데이터 중복(Redundancy)입니다. 김민준의 이메일, 등급이 주문마다 반복 저장됩니다. 'SQL 첫걸음'의 저자와 가격도 2번, 3번에 중복됩니다. 둘째로 수정 이상(Update Anomaly)입니다. 김민준의 이메일이 바뀌면 이 회원의 모든 주문 행을 일일이 수정해야 합니다. 하나라도 빠뜨리면 데이터가 불일치합니다. 셋째로 삭제 이상(Delete Anomaly)입니다. 3번 주문을 삭제하면 이서연 회원 정보도 함께 사라집니다.

이를 해결하기 위해 관계형 데이터베이스는 정규화(Normalization)를 사용합니다. 데이터를 주제별로 분리해 각각의 테이블에 저장하고, 테이블 간에 관계를 맺어 연결합니다. 우리 실습 DB의 members, books, orders 세 테이블이 바로 이 구조입니다.

🔗 외래키 — 테이블 사이의 연결고리

이 섹션에서는 테이블 간의 관계를 정의하는 외래키(Foreign Key)의 개념과 역할을 살펴보겠습니다.

분리된 테이블을 다시 연결하려면 어떤 정보가 필요할까요? orders 테이블의 member_id가 바로 그 역할을 합니다. orders 테이블의 member_id는 members 테이블의 member_id(기본키)를 참조합니다.

외래키(Foreign Key)는 다른 테이블의 기본키를 참조하는 열입니다. "이 행이 저 테이블의 어떤 행과 연결되어 있는가"를 표현합니다.

  • orders.member_id → members.member_id (회원 참조)
  • orders.book_id → books.book_id (도서 참조)

이 관계를 통해 "1번 주문은 1번 회원(김민준)이 1번 도서(SQL 첫걸음)를 구매한 것"이라는 정보를 유지하면서도, 회원 정보와 도서 정보를 각각의 테이블에 한 번씩만 저장할 수 있습니다.

참조 무결성(Referential Integrity)이란 외래키가 가리키는 행이 반드시 존재해야 한다는 제약입니다. orders에 member_id = 99가 있는데 members 테이블에 99번 회원이 없다면 데이터 정합성이 깨집니다. 외래키 제약을 설정하면 데이터베이스가 이런 상황을 자동으로 막아줍니다. 21강(제약 조건)에서 자세히 다룹니다.

테이블기본키(PK)외래키(FK)참조 대상
membersmember_id없음—
booksbook_id없음—
ordersorder_idmember_id, book_idmembers.member_id, books.book_id

🤝 JOIN이란 무엇인가

이 섹션에서는 JOIN의 정의와 동작 원리를 개념 수준에서 살펴보겠습니다.

JOIN은 두 개 이상의 테이블을 연결 조건에 따라 결합해 하나의 결과 집합을 만드는 연산입니다. 엑셀의 VLOOKUP과 유사하지만 훨씬 강력합니다. "주문 테이블의 member_id와 회원 테이블의 member_id가 같은 행끼리 합쳐라"가 조인의 핵심입니다.

JOIN에는 여러 종류가 있습니다.

종류설명다루는 강
INNER JOIN두 테이블 모두에 일치하는 행만 반환12~13강
LEFT OUTER JOIN왼쪽 테이블의 모든 행 + 오른쪽 일치 행14강
RIGHT OUTER JOIN오른쪽 테이블의 모든 행 + 왼쪽 일치 행14강
FULL OUTER JOIN양쪽 모든 행 (일치 안 해도 포함)14강
CROSS JOIN두 테이블의 모든 조합 (카테시안 곱)참고

가장 기본이자 가장 많이 쓰이는 것은 INNER JOIN입니다. 두 테이블에서 연결 조건이 일치하는 행만 결과에 포함됩니다. 조건이 일치하지 않는 행은 버려집니다.

🔄 INNER JOIN의 동작 원리

이 섹션에서는 INNER JOIN이 내부적으로 어떻게 동작하는지 단계별로 살펴보겠습니다.

orders 테이블과 members 테이블을 조인하는 과정을 단계별로 살펴봅니다.

첫 번째 단계는 카테시안 곱(Cartesian Product)입니다. orders의 모든 행과 members의 모든 행을 모두 조합합니다. orders 10개 행 × members 6개 행 = 60개 행의 임시 결과가 만들어집니다.

두 번째 단계는 조인 조건 필터링입니다. 60개 중 orders.member_id = members.member_id를 만족하는 행만 남깁니다. 1번 주문의 member_id = 1 이므로, members에서 member_id = 1인 '김민준' 행과 결합됩니다. 조건을 만족하지 않는 조합은 모두 버려집니다.

결국 INNER JOIN은 "두 테이블 모두에 연결 조건을 만족하는 행만 남기는" 교집합 연산입니다.

INNER JOIN의 기본 문법은 다음과 같습니다.

SELECT 열1, 열2, ...
FROM 테이블A
INNER JOIN 테이블B ON 테이블A.열 = 테이블B.열;

ON 키워드 다음에 두 테이블을 연결하는 조건을 씁니다. 보통 외래키와 참조하는 기본키를 동등 비교합니다.

-- 주문과 회원 테이블 조인 (이름과 주문 내역 함께 보기)
SELECT
  o.order_id,
  m.name        AS 회원이름,
  o.order_date,
  o.status
FROM orders AS o
INNER JOIN members AS m ON o.member_id = m.member_id
ORDER BY o.order_date;

테이블에 별칭(o, m)을 붙여 쿼리를 간결하게 만들었습니다. FROM orders AS o처럼 테이블도 AS로 별칭을 붙일 수 있습니다. 이렇게 하면 orders.order_id 대신 o.order_id처럼 짧게 쓸 수 있어 가독성이 높아집니다.

결과에는 주문 번호, 회원 이름, 주문 날짜, 상태가 함께 나타납니다. 이제 "1번 주문은 김민준이 했다"는 정보를 한 행에서 볼 수 있습니다.

📛 열 이름 충돌과 테이블 접두사

이 섹션에서는 조인할 때 같은 이름의 열이 여러 테이블에 있을 때 발생하는 충돌 문제와 해결법을 살펴보겠습니다.

orders 테이블과 members 테이블 모두에 member_id 열이 있습니다. 조인 후 SELECT에서 member_id라고만 쓰면 어느 테이블의 member_id인지 모호합니다. 이때 데이터베이스는 오류를 냅니다.

-- 오류: member_id가 어느 테이블 것인지 모호함
SELECT order_id, member_id, name
FROM orders
INNER JOIN members ON orders.member_id = members.member_id;

-- 올바른 방법: 테이블 접두사 또는 별칭으로 명시
SELECT
  o.order_id,
  m.member_id,
  m.name,
  o.order_date
FROM orders AS o
INNER JOIN members AS m ON o.member_id = m.member_id;

모호하지 않은 열(order_id는 orders에만 있음)은 접두사 없이 써도 됩니다. 하지만 조인 쿼리에서는 모든 열에 테이블 접두사를 붙이는 습관을 들이는 것이 좋습니다. 나중에 테이블이 추가될 때 충돌 위험을 미리 방지할 수 있습니다.

📝 핵심 요약

이번 강에서 배운 내용을 정리하겠습니다.

개념설명
테이블 분리(정규화)중복 제거 + 수정·삭제 이상 방지를 위해 주제별로 테이블 분리
외래키(FK)다른 테이블의 기본키를 참조하는 열 — 테이블 간 연결고리
INNER JOIN두 테이블 모두에 일치하는 행만 결합 (교집합)
ON 조건조인 연결 조건 — 보통 FK = PK 형태
테이블 별칭FROM 테이블 AS 별칭 — 열 접두사를 짧게 만들기 위해 사용

이 강에서 조인의 개념적 토대를 이해했습니다. 다음 13강에서는 INNER JOIN을 실제로 작성하며 세 테이블을 결합해 "회원 이름 + 도서 제목 + 주문 수량"을 한 번에 보여주는 실전 쿼리를 작성합니다. JOIN과 GROUP BY를 결합해 "회원별 총 주문 금액"도 계산해 봅니다.

관련 주제

  • 외래키
  • INNER JOIN 원리
  • 테이블 관계
  • 정규화
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • SQL·데이터베이스 입문 24강
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

SQL·데이터베이스 입문 24강

이 강의가 속한 시리즈는 총 24강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...