MySQL 3-Table OUTER JOIN — 혼합 외부 조인 완전 정리
OUTER JOIN은 매칭되지 않는 행도 남긴다. 이 예제는 학생과 소속을 먼저 왼쪽 기준으로 붙이고, 마지막에는 clubtbl을 오른쪽 기준으로 보존해 동아리 목록을 중심으로 결과를 본다.
| clubName | roomNo | stdName | addr | 해석 |
|---|---|---|---|---|
| 수영 | 101호 | 김범수 | 경기 | 학생과 동아리 정보가 모두 매칭됨 |
| 바둑 | 202호 | NULL | NULL | OUTER JOIN에서는 매칭 없는 쪽이 NULL로 남을 수 있음 |
학생과 동아리는 직접 연결되는 것이 아니라 중간 테이블을 통해 연결된다. 이 구조를 이해하면 다대다 관계의 JOIN이 훨씬 쉬워진다.
stdtbl S를 기준으로 SC를 붙이면 동아리 소속이 없는 학생도 결과에 남길 수 있다.
마지막에 clubtbl C를 오른쪽 기준으로 보존하면 소속 학생이 없는 동아리도 결과에서 빠지지 않는다.
LEFT와 RIGHT가 섞이면 어느 테이블이 최종 보존 기준인지 헷갈리기 쉽다. 실무에서는 같은 의미를 LEFT JOIN 중심으로 재작성하는 편이 읽기 좋다.
OUTER JOIN 결과에서 학생명이나 주소가 NULL이면 해당 동아리에 매칭된 학생 정보가 없다는 뜻으로 해석할 수 있다.
학생 한 명이 여러 동아리에 가입할 수 있고, 동아리 하나에도 여러 학생이 가입할 수 있다면 학생 테이블과 동아리 테이블만으로는 관계를 깔끔하게 저장하기 어렵다. 그래서 stdclubtbl 같은 중간 테이블이 필요하다.
| 테이블 | 역할 | 주요 컬럼 |
|---|---|---|
| stdtbl | 학생 기본 정보 | stdName, addr |
| stdclubtbl | 학생-동아리 관계 | stdName, clubName |
| clubtbl | 동아리 기본 정보 | clubName, roomNo |
RIGHT OUTER JOIN은 기준 테이블을 오른쪽에 둔 표현이다. 같은 결과를 더 읽기 쉽게 만들고 싶다면 테이블 순서를 바꿔 LEFT OUTER JOIN으로 표현할 수 있다.
OUTER JOIN 결과에서 NULL은 오류가 아니라 "매칭되는 행이 없었다"는 신호다. 이 신호를 이용하면 구매 이력이 없는 회원, 가입 학생이 없는 동아리 같은 데이터를 찾을 수 있다.
| NULL 위치 | 의미 | 확인 방법 |
|---|---|---|
| 구매 컬럼 NULL | 회원은 있지만 구매 이력이 없음 | B.userID IS NULL |
| 학생 컬럼 NULL | 동아리는 있지만 소속 학생이 없음 | S.stdName IS NULL |
| 동아리 컬럼 NULL | 학생 소속 기록은 있지만 동아리 원장이 없음 | C.clubName IS NULL |
| 주소 NULL | 회원 또는 학생 기본 정보가 매칭되지 않음 | 기준 테이블을 단독 조회 |
| 실수 | 증상 | 해결 |
|---|---|---|
| 3테이블 조인에서 ON 조건 하나 누락 | 중복 행이 크게 늘어난다 | JOIN마다 ON이 하나씩 있는지 확인 |
| LEFT와 RIGHT를 섞어 읽음 | 어느 테이블이 보존되는지 헷갈린다 | 가능하면 LEFT JOIN 중심으로 재작성 |
| NULL을 데이터 오류로 오해 | OUTER JOIN의 정상 결과를 잘못 판단 | 매칭 없음의 신호로 해석 |
| 중간 테이블을 건너뜀 | 학생과 동아리 관계가 연결되지 않음 | stdclubtbl을 반드시 거쳐 조인 |
| 정렬 기준 생략 | 출력 순서가 매번 달라 보인다 | 학생명 또는 동아리명으로 ORDER BY |
다중 조인은 테이블 수가 늘수록 결과 행 수가 예상과 달라지기 쉽다. 작은 테스트 데이터로 먼저 확인하고, 실제 데이터에서는 COUNT와 GROUP BY로 중복 여부를 검사하는 습관이 필요하다.
3테이블 LEFT OUTER JOIN은 기준 테이블을 끝까지 살리는 데 목적이 있다. 학생 목록을 기준으로 동아리 가입 여부를 붙이면 가입하지 않은 학생도 결과에 남는다.
| 결과 형태 | 의미 | 활용 |
|---|---|---|
| clubName이 NULL | 학생은 있지만 가입 내역이 없다 | 미가입 학생 목록 추출 |
| roomNo만 NULL | 가입 내역은 있지만 동아리 마스터가 없다 | 참조 데이터 정비 대상 |
| 학생명이 여러 번 출력 | 한 학생이 여러 동아리에 가입했다 | GROUP BY로 요약 가능 |
| 결과 행이 학생 수보다 많음 | 1:N 관계가 펼쳐진 정상 결과다 | 중복이 아니라 관계 확장으로 해석 |
| 질문 | 확인 포인트 |
|---|---|
| 기준 테이블이 무엇인가? | FROM에 둔 테이블이 결과 보존의 출발점이다. |
| 관계 테이블을 빠뜨리지 않았는가? | N:M 관계는 중간 테이블을 거쳐야 한다. |
| NULL이 정상 신호인가? | OUTER JOIN에서는 매칭 실패를 나타내는 정상 결과일 수 있다. |
| 결과 행 수가 늘어난 이유는? | 1:N 또는 N:M 관계가 펼쳐졌는지 먼저 확인한다. |
핵심 요약
Tags
'php' 카테고리의 다른 글
| MySQL SELF JOIN — 자기참조 조인 완전 정리 (0) | 2026.06.29 |
|---|---|
| MySQL CROSS JOIN · COUNT — 카르테시안 곱 완전 정리 (0) | 2026.06.29 |
| MySQL OUTER JOIN — LEFT/RIGHT 외부 조인 완전 정리 (0) | 2026.06.28 |
| MySQL 3-Table INNER JOIN — 다중 테이블 조인 완전 정리 (0) | 2026.06.28 |
| MySQL WHERE EXISTS — EXISTS 서브쿼리 완전 정리 (0) | 2026.06.28 |
왕진 블로그

댓글