본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

MySQL 3-Table OUTER JOIN — 혼합 외부 조인 완전 정리

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

 

 

Database · MySQL

MySQL 3-Table OUTER JOIN — 혼합 외부 조인 완전 정리

학생·소속·동아리 테이블을 LEFT/RIGHT OUTER JOIN으로 연결해 누락 데이터를 함께 확인하는 방식
시작 오늘 분석할 코드

OUTER JOIN은 매칭되지 않는 행도 남긴다. 이 예제는 학생과 소속을 먼저 왼쪽 기준으로 붙이고, 마지막에는 clubtbl을 오른쪽 기준으로 보존해 동아리 목록을 중심으로 결과를 본다.

SELECT C.clubName, C.roomNo, S.stdName, S.addr FROM stdtbl S LEFT OUTER JOIN stdclubtbl SC ON SC.stdName = S.stdName RIGHT OUTER 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 LEFT OUTER JOIN은 학생을 보존한다

stdtbl S를 기준으로 SC를 붙이면 동아리 소속이 없는 학생도 결과에 남길 수 있다.

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

마지막에 clubtbl C를 오른쪽 기준으로 보존하면 소속 학생이 없는 동아리도 결과에서 빠지지 않는다.

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

LEFT와 RIGHT가 섞이면 어느 테이블이 최종 보존 기준인지 헷갈리기 쉽다. 실무에서는 같은 의미를 LEFT JOIN 중심으로 재작성하는 편이 읽기 좋다.

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

 

반응형

 

4 NULL이 누락의 신호가 된다

OUTER JOIN 결과에서 학생명이나 주소가 NULL이면 해당 동아리에 매칭된 학생 정보가 없다는 뜻으로 해석할 수 있다.

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테이블 LEFT OUTER JOIN은 기준 테이블을 끝까지 살리는 데 목적이 있다. 학생 목록을 기준으로 동아리 가입 여부를 붙이면 가입하지 않은 학생도 결과에 남는다.

-- 모든 학생을 보존하고 동아리 정보 붙이기 SELECT S.stdName, S.addr, SC.clubName, C.roomNo FROM stdtbl S LEFT OUTER JOIN stdclubtbl SC ON S.stdName = SC.stdName LEFT OUTER JOIN clubtbl C ON SC.clubName = C.clubName ORDER BY S.stdName, SC.clubName;
결과 형태 의미 활용
clubName이 NULL 학생은 있지만 가입 내역이 없다 미가입 학생 목록 추출
roomNo만 NULL 가입 내역은 있지만 동아리 마스터가 없다 참조 데이터 정비 대상
학생명이 여러 번 출력 한 학생이 여러 동아리에 가입했다 GROUP BY로 요약 가능
결과 행이 학생 수보다 많음 1:N 관계가 펼쳐진 정상 결과다 중복이 아니라 관계 확장으로 해석
LEFT JOIN을 여러 번 연결할 때는 FROM에 둔 기준 테이블이 무엇인지 끝까지 유지한다. 중간에 INNER 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, 웹개발, 티스토리
반응형

댓글