Zeno ZENO
Database / DB 기초 · 조회 3 · 좋아요 0

9. RDBMS의 꽃 조인(JOIN) 완벽 정복 (INNER, LEFT OUTER)

데이터 중복을 피하기 위해 쪼개진 테이블들을 다시 하나로 연결하여 의미 있는 정보를 추출하는 핵심 명령어인 JOIN의 작동 원리와 실무 사용법을 다룹니다.

1. 조인(JOIN)의 정의

조인(JOIN)은 관계형 데이터베이스(RDBMS)에서 분리된 두 개 이상의 테이블을 연결고리를 기준으로 결합하여 하나의 거대한 가상 테이블로 합쳐서 조회하는 SQL 명령어입니다.

쉽게 말해, '회원' 정보가 적힌 종이와 '주문 데이터'가 적힌 종이를 겹쳐 보면서 "어떤 회원이 어떤 물건을 샀는지" 한눈에 확인하는 기술입니다.


2. 조인(JOIN)이 필요한 이유

관계형 데이터베이스에서는 중복 데이터를 막고 효율적으로 공간을 쓰기 위해 데이터를 주제별로 쪼개어 보관합니다(이를 정규화라고 합니다). 하지만 정작 서비스를 운영할 때는 쪼개진 데이터를 합쳐서 보아야만 의미가 생깁니다.

실제 개발에서 해결하는 문제

  • 분산된 데이터의 결합: 주문 테이블에는 회원 이름 없이 '회원 번호'만 적혀 있고, 회원 테이블에는 이름이 적혀 있습니다. 조인을 사용하면 주문 기록 옆에 회원의 이름을 나란히 붙여서 "홍길동 고객이 모니터를 구매했다"라는 완성된 문장 형태의 화면을 만들어낼 수 있습니다.
  • 통합 정보 추출: "서울에 사는 회원들이 구매한 총 상품 금액"처럼 여러 테이블의 조건과 통계가 뒤섞인 복잡한 요구사항을 단 한 번의 요청으로 받아올 수 있습니다.

3. 반드시 알아야 할 핵심 개념

실무에서 사용하는 조인의 핵심 종류 2가지와 연결 조건문입니다.

[Image of SQL JOIN types Venn diagram]
  • INNER JOIN (내부 조인): 연결고리가 되는 기준 열의 값이 두 테이블 모두에 공통으로 존재하는 데이터(교집합)만 합쳐서 가져오는 방식입니다.
  • LEFT OUTER JOIN (왼쪽 외부 조인): 연결고리 존재 여부와 상관없이, 왼쪽(먼저 적은) 테이블의 모든 데이터를 무조건 가져오고, 오른쪽 테이블은 매칭되는 데이터가 있을 때만 합쳐서 가져오는 방식입니다. 매칭되는 자식 데이터가 없다면 빈칸(NULL)으로 채워집니다.
  • ON 구문 (조인 조건): 두 테이블을 어떤 연결고리(주로 기본키와 외래키)로 이어붙일지 컴퓨터에게 지정해 주는 조건문입니다.

4. 함께 알아야 하는 주변 기초 개념

  • 테이블 별칭 (Alias / AS): 조인을 할 때 여러 테이블의 열 이름이 중복되거나 코드가 너무 길어지는 것을 막기 위해, 테이블 이름 뒤에 users AS u처럼 알파벳 축약어를 붙여 짧게 부르는 실무형 규칙입니다.
  • SELF JOIN (자체 조인): 별도의 다른 테이블이 아니라, 자기 자신의 테이블을 복사하듯 다시 조인하는 특수한 방식입니다. (예: 조직도 테이블에서 사원 정보와 상사 정보를 한 표에서 연결할 때 사용)

5. 조인(JOIN)의 실제 처리 흐름

데이터베이스 엔진이 조인 명령을 받아 두 테이블을 합치는 물리적인 단계입니다.

  1. 테이블 지정: 어떤 테이블(A)을 기준으로 두고, 어떤 테이블(B)을 가져와 붙일지 선언합니다.
  2. 연결고리 대조: ON 조건에 적힌 규칙에 따라, A 테이블의 1번 행 외래키 값과 B 테이블의 기본키 값들을 일일이 대조합니다.
  3. 행 합치기: 조건이 일치하는 짝을 찾으면 두 테이블의 가로줄(행)을 옆으로 길게 이어붙여 하나의 가상 행을 만듭니다.
  4. 필터링 및 출력: 합쳐진 거대한 가상 테이블에서 사용자가 SELECT로 요청한 열만 골라 화면에 출력합니다.

6. 조인(JOIN) SQL 코드 예시

회원 테이블(users)과 주문 테이블(orders)을 INNER JOIN으로 연결하여 회원 아이디와 주문한 상품명을 함께 조회하는 예제입니다.

SELECT u.username, o.product_name
FROM users AS u
INNER JOIN orders AS o ON u.id = o.user_id;

7. 예시 코드 상세 설명

  • SELECT u.username, o.product_name: 최종 결과 화면에 users 테이블의 username 열과 orders 테이블의 product_name 열만 골라서 보여달라는 명령입니다.
  • FROM users AS u: 중심이 되는 기준 테이블로 users를 지정하고, 앞으로 이 테이블을 코드 내에서 짧게 u라는 별칭으로 부르겠다고 선언합니다.
  • INNER JOIN orders AS o: users 테이블 옆에 결합할 대상 테이블로 orders를 지정하고, 별칭을 o라고 붙입니다.
  • ON u.id = o.user_id: 가장 중요한 연결 조건입니다. users 테이블의 기본키인 id 값과 orders 테이블의 외래키인 user_id 값이 정확히 일치하는 행들끼리만 조립하라는 의미입니다.

8. 초보자가 자주 실수하는 현상 및 비교

조인 조건을 빼먹을 때 발생하는 대참사 (카테시안 곱)

초보자분들이 가장 많이 하는 실수 중 하나는 두 테이블을 연결하면서 ON 조건문을 생략하거나 잘못 적는 것입니다.

만약 ON u.id = o.user_id 조건을 빼고 조인을 실행하면, 데이터베이스는 두 테이블의 데이터를 수학적 조합으로 무조건 전부 엮어버립니다. 이를 카테시안 곱(Cartesian Product) 또는 교차 조인(CROSS JOIN)이라고 합니다.

예를 들어 회원 데이터가 1,000건 있고, 주문 데이터가 1,000건 있을 때 조건을 빼먹으면 1,000 × 1,000 = 1,000,000(100만) 건의 엉터리 가짜 데이터 행이 만들어지며 컴퓨터가 멈추거나 뻗어버릴 수 있으므로 ON 조건은 필수적으로 검증해야 합니다.

INNER JOIN vs LEFT JOIN 결과 비교

  • INNER JOIN: 물건을 한 번도 주문하지 않은 회원은 결과에서 아예 제외됩니다. 오직 구매 이력이 있는 회원과 주문 내역만 매칭되어 출력됩니다.
  • LEFT JOIN: 물건을 주문하지 않은 회원도 회원 이름이 결과에 무조건 출력됩니다. 대신 그 회원의 주문 상품명 칸은 빈 상태인 NULL로 표시됩니다. (전체 회원 목록을 뽑으면서 주문 현황을 같이 볼 때 실무에서 아주 유용합니다.)

9. 핵심 내용 요약

RDBMS의 꽃인 JOIN은 정규화를 통해 분리 보관된 테이블들을 하나의 정보로 합쳐주는 도구입니다. 교집합 데이터만 뽑는 INNER JOIN과 왼쪽 기준 테이블을 보존하는 LEFT JOIN이 핵심이며, 복잡한 테이블 이름을 생략하기 위해 별칭(Alias)을 적극 활용합니다. 컴퓨터 과부하를 막기 위해 조인 시 ON 조건문을 정확하게 명시하는 습관이 필요합니다.


10. 핵심 용어 정리

조인(JOIN) = 분산된 두 개 이상의 테이블을 특정 조건으로 엮어 하나의 가상 테이블로 합쳐 띄우는 SQL 연산

INNER JOIN = 두 테이블 간에 지정한 연결고리 값이 모두 일치하는 교집합 행만 결합하여 가져오는 방식

LEFT OUTER JOIN = 왼쪽 테이블의 데이터는 무조건 살리고, 오른쪽 테이블은 매칭되는 짝이 있을 때만 결합하는 방식

ON 구문 = 조인을 수행할 때 두 테이블을 매칭시킬 연결고리 기준(PK와 FK)을 정의하는 조건문

카테시안 곱 = 조인 조건문을 빼먹거나 잘못 지정하여 두 테이블의 모든 행이 무작위로 복사 결합되어 데이터가 폭발하는 현상

AD

제휴 광고

일부 링크는 제휴 링크이며, 구매 또는 가입 시 일정 수수료를 받을 수 있습니다.

AD

'DB 기초' 카테고리의 다른 글

전체보기