413. 자연 조인 (Natural Join)
⚠️ 이 문서는 두 개의 테이블을 연결할 때, **개발자가 굳이 "어떤 컬럼끼리 똑같은지 연결해 줘"라고 말하지 않아도 DB가 알아서 이름이 똑같은 컬럼을 찾아 연결하고, 중복된 컬럼은 하나로 합쳐서 보여주는 똑똑하고 깔끔한 조인 방식인 '자연 조인'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 두 릴레이션에 공통으로 존재하는 속성(이름과 타입이 같은 컬럼)을 기준으로 동등 조인(Equi Join)을 수행한 뒤, 중복되는 속성을 제거하여 하나의 속성만 남기는 연산이다.
- 가치: 조인 조건을 명시할 필요가 없어 쿼리가 아주 짧아지고, 결과 테이블에 쓸데없는 중복 컬럼이 생기지 않아 깔끔하다.
- 실무 한계: 컬럼의 이름만 보고 자동으로 조인하기 때문에, 우연히 이름만 같고 의미가 다른 컬럼(예:
date)이 있으면 엉뚱한 결과가 나온다. 그래서 실무에서는 잘 쓰지 않고 명시적인INNER JOIN ... USING을 선호한다.
Ⅰ. 개요: 알아서 합쳐주세요 (Context & Necessity)
학생(학번, 이름) 테이블과 수강(학번, 과목) 테이블이 있다.
두 테이블을 조인해서 학생의 이름과 과목을 보고 싶다.
-
일반적인 동등 조인 (Equi Join):
SELECT * FROM 학생, 수강 WHERE 학생.학번 = 수강.학번;- 결과:
[학번, 이름, 학번, 과목]$\rightarrow$ '학번' 컬럼이 두 번(중복) 출력된다. 보기 지저분하다.
- 결과:
-
자연 조인 (Natural Join):
SELECT * FROM 학생 NATURAL JOIN 수강;- 결과:
[학번, 이름, 과목]$\rightarrow$ '학번'이 한 번만 출력된다. WHERE조건절도 쓸 필요가 없다. 두 테이블에 '학번'이라는 똑같은 이름의 컬럼이 있다는 것을 DB가 알아서 찾았기 때문이다.
- 결과:
📢 섹션 요약 비유: 일반 조인이 두 장의 카드를 스카치테이프로 그냥 이어 붙여서 똑같은 그림이 두 번 보이는 것이라면, 자연 조인은 겹치는 부분을 살짝 포개서 겹쳐진 그림이 한 번만 보이게 깔끔하게 풀로 붙이는 것과 같습니다.
Ⅱ. 자연 조인의 3대 규칙 ★
수학적(관계 대수)으로 자연 조인이 성립하려면 다음 조건이 필요하다.
1. 공통 속성의 존재
- 두 테이블 간에 이름과 데이터 타입이 100% 똑같은 컬럼이 최소 1개 이상 존재해야 한다.
2. 동등 조건 (Equi Join) 자동 적용
- 공통 속성의 '값이 일치하는' 튜플(행)들만 짝지어준다. (값이 다르면 버림)
3. 중복 속성 제거 (가장 중요)
- 일반 조인은 카티션 프로덕트(412번 문서)를 기반으로 하므로 $A$열과 $B$열이 단순히 더해진다.
- 자연 조인은 공통 속성을 딱 1번만 표시하므로, **(A테이블 열 수 + B테이블 열 수 - 공통 열 수)**가 최종 열의 개수(차수)가 된다.
Ⅲ. 실무에서의 취약점과 대안
자연 조인은 쿼리를 짧게 만들어주지만, 현업 백엔드 개발자들은 이를 **"시한폭탄"**이라고 부른다.
- 문제 상황:
게시글(id, title, created_at)테이블과댓글(id, board_id, created_at)테이블이 있다. 개발자가NATURAL JOIN을 썼다. - 대참사: 개발자는
게시글.id와댓글.board_id로 연결되길 바랐다. 하지만 DB는 멍청하게도 두 테이블에 공통으로 있는 이름인 **id와created_at**을 기준으로 조인을 걸어버린다. (글 쓴 시간과 댓글 쓴 시간이 정확히 1초까지 똑같은 데이터만 검색됨 $\rightarrow$ 결과 0건)
그래서 실무에서는 NATURAL JOIN 대신, 공통 컬럼을 개발자가 명시적으로 콕 집어주는 JOIN ... USING 문법을 훨씬 많이 쓴다.
┌──────────────────────────────────────────────────────────────┐
│ 동등 조인(Equi Join) vs 자연 조인(Natural Join) 시각화 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [ A 테이블 ] [ B 테이블 ] │
│ ID │ 이름 ID │ 부서 │
│ 1 │ 철수 1 │ 영업 │
│ 2 │ 영희 3 │ 개발 │
│ │
│ [ 1️⃣ 동등 조인 (SELECT * FROM A, B WHERE A.ID = B.ID) ] │
│ A.ID │ 이름 │ B.ID │ 부서 │
│ 1 │ 철수 │ 1 │ 영업 ◀── (ID 컬럼이 2번 중복해서 출력됨!) │
│ │
│ [ 2️⃣ 자연 조인 (SELECT * FROM A NATURAL JOIN B) ] │
│ ID │ 이름 │ 부서 │
│ 1 │ 철수 │ 영업 ◀── (중복된 ID 컬럼 1개가 제거되어 깔끔함!) │
└──────────────────────────────────────────────────────────────┘
Ⅳ. 결론
"편리함은 때론 가장 큰 함정이 된다."
자연 조인은 관계 대수 이론에서 카티션 프로덕트의 낭비를 없애고, 의미 있는 데이터만 깔끔하게 합치기 위해 만들어진 훌륭한 수학적 모델이다. 하지만 소프트웨어가 복잡해지고 데이터베이스 테이블의 컬럼 이름들이 status, created_by, updated_at 처럼 뻔하게 겹치기 시작하면서, 자연 조인의 '자동 이름 매칭' 기능은 통제 불가능한 버그의 온상이 되었다. 시험 문제에서는 중복 제거의 특성이 중요하게 다뤄지지만, 실무에서는 쿼리가 길어지더라도 ON이나 USING 절로 조인 조건을 100% 명확히 적는 것이 훌륭한 엔지니어의 기본 소양이다.
📌 관련 개념 맵
- 관련 연산자: 관계 대수 ($\bowtie$ 기호 - 409번 문서), 카티션 프로덕트 (412번 문서)
- SQL 키워드:
NATURAL JOIN,JOIN ... USING (컬럼명) - 비교 개념: Equi Join (동등 조인 - 중복 속성을 제거하지 않음)
- 특징: 교환 법칙과 결합 법칙이 모두 성립한다.
👶 어린이를 위한 3줄 비유 설명
- 동등 조인은 두 장의 퍼즐을 합칠 때, 겹치는 부분(예: 강아지 꼬리)을 자르지 않고 그냥 이어 붙이는 거예요. 그래서 꼬리가 두 개 달린 이상한 강아지 그림이 되죠.
- 자연 조인은 퍼즐을 합칠 때, 똑같이 생긴 강아지 꼬리 한쪽을 가위로 잘라내고 붙이는 거예요.
- 그러면 아주 매끄럽고 꼬리가 하나뿐인 완벽한 강아지 한 마리(중복 제거)가 완성된답니다!