본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL 3-Table INNER JOIN — 다중 테이블 조인 완전 정리

by 왕진 2026. 6. 28.
반응형

 

 

Database · MySQL

MySQL 3-Table INNER JOIN — 다중 테이블 조인 완전 정리

학생, 동아리 소속, 동아리 정보를 중간 테이블로 연결하는 3테이블 INNER JOIN
시작 오늘 분석할 코드

3테이블 INNER JOIN은 한 번에 세 테이블을 모두 연결하는 것이 아니라, 학생과 소속 테이블을 먼저 연결하고 그 결과를 다시 동아리 테이블과 연결한다고 읽으면 쉽다.

SELECT S.stdName, S.addr, SC.clubName, C.roomNo FROM stdtbl S INNER JOIN stdclubtbl SC ON S.stdName = SC.stdName INNER JOIN clubtbl C ON SC.clubName = C.clubName ORDER BY S.stdName; SELECT C.clubName, C.roomNo, S.stdName, S.addr FROM stdtbl S INNER JOIN stdclubtbl SC ON SC.stdName = S.stdName INNER JOIN clubtbl C ON SC.clubName = C.clubName ORDER BY C.clubName;
실제 결과 미리보기
clubName roomNo stdName addr 해석
수영 101호 김범수 경기 학생과 동아리 정보가 모두 매칭됨
바둑 202호 NULL NULL OUTER JOIN에서는 매칭 없는 쪽이 NULL로 남을 수 있음
용어 용어 정리
3-table JOIN세 개의 테이블을 두 개 이상의 관계 조건으로 이어 붙이는 조인
stdtbl학생 기본 정보를 가진 테이블
stdclubtbl학생과 동아리의 소속 관계를 저장하는 중간 테이블
clubtbl동아리명과 동아리방 같은 동아리 정보를 가진 테이블
INNER JOIN양쪽에 매칭되는 행이 모두 있을 때만 남기는 조인
LEFT OUTER JOIN왼쪽 테이블의 모든 행을 보존하고 오른쪽 정보를 붙이는 조인
RIGHT OUTER JOIN오른쪽 테이블의 모든 행을 보존하고 왼쪽 정보를 붙이는 조인
중간 테이블다대다 관계에서 양쪽 테이블을 연결하는 매핑 테이블
흐름 3테이블 조인을 읽는 순서
stdtbl S
stdclubtbl SC
clubtbl C

학생과 동아리는 직접 연결되는 것이 아니라 중간 테이블을 통해 연결된다. 이 구조를 이해하면 다대다 관계의 JOIN이 훨씬 쉬워진다.

1 학생 → 소속 → 동아리 순서로 연결한다

stdtbl에는 학생 정보, stdclubtbl에는 학생과 동아리의 연결, clubtbl에는 동아리 정보가 있다. 중간 테이블을 거쳐야 학생이 어떤 동아리에 속했는지 알 수 있다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.
2 첫 번째 ON은 학생과 소속을 연결한다

S.stdName = SC.stdName 조건은 학생 기본 정보와 동아리 소속 기록을 같은 학생 이름으로 연결한다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.
3 두 번째 ON은 소속과 동아리를 연결한다

SC.clubName = C.clubName 조건은 소속 기록에 적힌 동아리명과 실제 동아리 정보를 연결한다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.

 

반응형

 

4 정렬 기준만 바꾸면 관점이 바뀐다

ORDER BY S.stdName은 학생 중심 목록이고, ORDER BY C.clubName은 동아리 중심 목록으로 읽힌다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.
5 INNER JOIN과 OUTER JOIN 비교
INNER JOIN
양쪽 조건이 모두 맞는 행만 결과에 남긴다. 누락 데이터 확인보다는 완성된 관계 조회에 적합하다.
OUTER JOIN
한쪽 테이블을 보존한다. 소속 없는 학생, 학생 없는 동아리처럼 누락 상황을 확인할 때 유용하다.
6 중간 테이블이 필요한 이유

학생 한 명이 여러 동아리에 가입할 수 있고, 동아리 하나에도 여러 학생이 가입할 수 있다면 학생 테이블과 동아리 테이블만으로는 관계를 깔끔하게 저장하기 어렵다. 그래서 stdclubtbl 같은 중간 테이블이 필요하다.

테이블 역할 주요 컬럼
stdtbl 학생 기본 정보 stdName, addr
stdclubtbl 학생-동아리 관계 stdName, clubName
clubtbl 동아리 기본 정보 clubName, roomNo
7 LEFT와 RIGHT를 바꿔 읽는 법

RIGHT OUTER JOIN은 기준 테이블을 오른쪽에 둔 표현이다. 같은 결과를 더 읽기 쉽게 만들고 싶다면 테이블 순서를 바꿔 LEFT OUTER JOIN으로 표현할 수 있다.

-- RIGHT JOIN FROM buytbl B RIGHT OUTER JOIN usertbl U ON U.userID = B.userID -- 같은 관점을 LEFT JOIN으로 읽기 FROM usertbl U LEFT OUTER JOIN buytbl B ON U.userID = B.userID
실무에서는 기준 테이블을 FROM에 먼저 쓰고 LEFT JOIN으로 필요한 정보를 붙이는 스타일이 가장 흔하다.
8 NULL 결과 해석하기

OUTER JOIN 결과에서 NULL은 오류가 아니라 "매칭되는 행이 없었다"는 신호다. 이 신호를 이용하면 구매 이력이 없는 회원, 가입 학생이 없는 동아리 같은 데이터를 찾을 수 있다.

NULL 위치 의미 확인 방법
구매 컬럼 NULL 회원은 있지만 구매 이력이 없음 B.userID IS NULL
학생 컬럼 NULL 동아리는 있지만 소속 학생이 없음 S.stdName IS NULL
동아리 컬럼 NULL 학생 소속 기록은 있지만 동아리 원장이 없음 C.clubName IS NULL
주소 NULL 회원 또는 학생 기본 정보가 매칭되지 않음 기준 테이블을 단독 조회
9 자주 하는 실수
실수 증상 해결
3테이블 조인에서 ON 조건 하나 누락 중복 행이 크게 늘어난다 JOIN마다 ON이 하나씩 있는지 확인
LEFT와 RIGHT를 섞어 읽음 어느 테이블이 보존되는지 헷갈린다 가능하면 LEFT JOIN 중심으로 재작성
NULL을 데이터 오류로 오해 OUTER JOIN의 정상 결과를 잘못 판단 매칭 없음의 신호로 해석
중간 테이블을 건너뜀 학생과 동아리 관계가 연결되지 않음 stdclubtbl을 반드시 거쳐 조인
정렬 기준 생략 출력 순서가 매번 달라 보인다 학생명 또는 동아리명으로 ORDER BY
10 검증 체크리스트
1
각 테이블 단독 확인학생, 소속, 동아리 테이블의 원본 행을 먼저 본다.
2
두 테이블씩 연결학생-소속, 소속-동아리를 따로 조인해 조건을 확인한다.
3
세 테이블 연결두 조인이 모두 맞으면 전체 JOIN으로 확장한다.
4
OUTER JOIN으로 누락 확인INNER JOIN에서 빠지는 데이터를 OUTER JOIN으로 점검한다.
11 실무 메모

다중 조인은 테이블 수가 늘수록 결과 행 수가 예상과 달라지기 쉽다. 작은 테스트 데이터로 먼저 확인하고, 실제 데이터에서는 COUNT와 GROUP BY로 중복 여부를 검사하는 습관이 필요하다.

SELECT SC.stdName, COUNT(*) FROM stdclubtbl SC GROUP BY SC.stdName; SELECT SC.clubName, COUNT(*) FROM stdclubtbl SC GROUP BY SC.clubName;
12 실전 확인 예제

3테이블 INNER JOIN은 중간 테이블을 통해 양쪽 테이블의 관계를 연결하는 패턴이다. 아래처럼 먼저 연결 경로를 주석으로 적고 SQL을 작성하면 ON 조건 누락을 줄일 수 있다.

-- 학생 -> 가입내역 -> 동아리 SELECT S.stdName, S.addr, C.clubName, C.roomNo FROM stdtbl S INNER JOIN stdclubtbl SC ON S.stdName = SC.stdName INNER JOIN clubtbl C ON SC.clubName = C.clubName ORDER BY S.stdName, C.clubName;
확인 항목 보는 이유 판단 기준
학생 수와 결과 행 수 비교 한 학생이 여러 동아리에 가입하면 행이 늘어난다 중복이 자연스러운지 확인
중간 테이블 단독 조회 JOIN 결과의 기준 관계를 확인한다 stdName, clubName 조합이 맞는지 확인
ORDER BY 추가 결과 검토를 쉽게 만든다 학생명, 동아리명 순서로 정렬
SELECT * 지양 동일한 이름의 컬럼이 섞인다 필요한 컬럼만 별칭과 함께 선택
INNER JOIN 결과가 예상보다 적으면 데이터가 사라진 것이 아니라 연결 조건을 모두 만족하는 행만 남은 것이다. 누락 여부를 보려면 같은 조건을 LEFT JOIN으로 바꿔 비교한다.
13 빠른 검산 질문
질문 확인 포인트
기준 테이블이 무엇인가? FROM에 둔 테이블이 결과 보존의 출발점이다.
관계 테이블을 빠뜨리지 않았는가? N:M 관계는 중간 테이블을 거쳐야 한다.
NULL이 정상 신호인가? OUTER JOIN에서는 매칭 실패를 나타내는 정상 결과일 수 있다.
결과 행 수가 늘어난 이유는? 1:N 또는 N:M 관계가 펼쳐졌는지 먼저 확인한다.
JOIN을 검산할 때는 완성 SQL만 보지 말고 각 테이블을 단독 조회한 결과와 비교하면 원인을 빨리 찾을 수 있다.

핵심 요약

3테이블 JOIN학생, 중간 관계, 동아리 정보를 순서대로 연결한다.
INNER JOIN모든 연결 조건이 맞는 행만 남긴다.
OUTER JOIN한쪽 테이블을 보존해 매칭 없는 행도 확인한다.
중간 테이블다대다 관계를 안정적으로 저장하는 핵심 구조다.
NULLOUTER JOIN에서 매칭되지 않은 쪽의 컬럼에 나타나는 신호다.

Tags

#MySQL #JOIN #INNER JOIN #OUTER JOIN #LEFT JOIN #RIGHT JOIN #3테이블조인 #중간테이블 #SQL #데이터베이스 #DB #웹개발 #티스토리
티스토리 태그 입력란 복사용
MySQL, JOIN, INNER JOIN, OUTER JOIN, LEFT JOIN, RIGHT JOIN, 3테이블조인, 중간테이블, SQL, 데이터베이스, DB, 웹개발, 티스토리
반응형

댓글