본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

MySQL OUTER JOIN — LEFT/RIGHT 외부 조인 완전 정리

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

 

 

Database · MySQL

MySQL OUTER JOIN — LEFT/RIGHT 외부 조인 완전 정리

회원은 모두 보고 구매 이력이 있으면 붙이는 LEFT OUTER JOIN과 같은 결과를 RIGHT OUTER JOIN으로 표현하는 방법
시작 오늘 분석할 코드

OUTER JOIN은 한쪽 테이블의 행을 모두 보존한다. 회원은 가입했지만 구매 이력이 없는 사람까지 보고 싶다면 usertbl을 보존하는 LEFT OUTER JOIN이 적합하다.

USE sqldb; SELECT U.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처' FROM usertbl U LEFT OUTER JOIN buytbl B ON U.userID = B.userID ORDER BY U.userID; SELECT U.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '연락처' FROM buytbl B RIGHT OUTER JOIN usertbl U ON U.userID = B.userID ORDER BY U.userID;
실제 결과 미리보기
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은 왼쪽을 모두 남긴다

FROM usertbl U LEFT OUTER JOIN buytbl B는 회원 테이블의 모든 회원을 결과에 남긴다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.
2 구매 이력이 없으면 오른쪽 컬럼이 NULL

구매 테이블에 매칭되는 행이 없으면 B.prodName 같은 구매 컬럼은 NULL로 표시된다.

JOIN은 테이블을 많이 붙일수록 "현재 어느 테이블을 기준으로 보존하는가"를 계속 확인해야 한다.
3 RIGHT OUTER JOIN은 같은 결과를 반대로 쓴 것

FROM buytbl B RIGHT OUTER JOIN usertbl U는 오른쪽 usertbl을 보존하므로 위 LEFT JOIN과 같은 관점의 결과를 낼 수 있다.

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

 

반응형

 

4 실무에서는 LEFT JOIN을 더 자주 쓴다

기준 테이블을 FROM에 먼저 놓고 LEFT JOIN으로 붙이는 방식이 읽기 쉽고 유지보수도 편하다.

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 실전 확인 예제

OUTER JOIN은 “매칭되지 않은 데이터”를 찾을 때 가장 자주 쓴다. 아래 예제는 구매 이력이 없는 회원을 찾는 전형적인 패턴이다.

-- 구매 이력이 없는 회원 찾기 SELECT U.userID, U.name, U.addr FROM usertbl U LEFT OUTER JOIN buytbl B ON U.userID = B.userID WHERE B.userID IS NULL ORDER BY U.userID;
목적 JOIN 선택 WHERE 조건
구매 없는 회원 회원 LEFT JOIN 구매 B.userID IS NULL
회원 없는 구매 내역 구매 LEFT JOIN 회원 U.userID IS NULL
전체 회원과 구매 요약 회원 LEFT JOIN 구매 GROUP BY U.userID
매칭된 데이터만 보기 INNER JOIN NULL 조건 없음
OUTER JOIN 뒤에 오른쪽 테이블 컬럼 조건을 WHERE에 바로 쓰면 NULL 행이 제거되어 INNER JOIN처럼 동작할 수 있다. 보존해야 하는 조건은 ON과 WHERE의 위치를 구분한다.
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, 웹개발, 티스토리
반응형

댓글