
1. 기준 마스터 데이터의 보존: LEFT OUTER JOIN의 필요성
8화에서 우리는 다중 테이블 가공의 시작점인 INNER JOIN의 문법 구조를 살펴보고, 실무 데이터 집계 시 흔히 발생하는 데이터 중복(뻥튀기) 현상의 메커니즘과 이를 제어하기 위한 고유성 확보 전략을 알아보았습니다. 교집합만을 정확히 추출하는 내부 조인은 양쪽 테이블에 매칭되는 데이터가 모두 존재할 때는 완벽한 결과물을 제공합니다.
그러나 현업 데이터 분석 실무에서는 한쪽 테이블의 모수를 온전히 유지한 채 다른 쪽 테이블의 정보를 덧붙여야 하는 상황이 훨씬 더 높은 비중으로 발생하곤 합니다.
예를 들어 “이번 달 전체 가입 회원 명단을 기준으로 각 회원별 구매 금액을 매칭해 달라”는 요청이 들어왔다고 가정해 보겠습니다. 이 경우 이번 달에 가입은 했지만 아직 물건을 전혀 구매하지 않은 ‘구매 이력 없음’ 고객들도 리포트 상에 누락 없이 노출되어야 마케팅 부서가 미구매자 대상 리마인드 프로모션을 기획할 수 있습니다.
만약 이를 8화에서 배운 INNER JOIN으로 처리해 버리면, 구매 테이블에 내역이 없는 미구매 고객들은 교집합 조건을 만족하지 못해 결과 집합에서 통째로 증발해 버리는 현상이 발생합니다. 이처럼 왼쪽 기준 테이블의 데이터를 단 1행도 버리지 않고 온전히 살려둔 채 오른쪽 테이블의 데이터를 유기적으로 이어 붙이는 도구가 바로 LEFT OUTER JOIN (왼쪽 외부 조인)입니다. 본 연작 시리즈는 대용량 데이터 처리에 자주 활용되는 테라데이터 SQL 환경을 기준으로 실무 외부 조인 예제를 설명합니다.
2. LEFT OUTER JOIN의 기본 문법 구조와 메커니즘
LEFT OUTER JOIN은 문법적으로 FROM 절에 먼저 선언되는 테이블을 ‘왼쪽(Left) 기준 테이블’로 삼고, LEFT OUTER JOIN 키워드 뒤에 선언되는 테이블을 ‘오른쪽(Right) 참조 테이블’로 취급합니다.
양쪽 테이블을 연결할 매칭 기준은 INNER JOIN과 마찬가지로 ON 절에 기술하지만, 작동하는 결과의 양상은 사뭇 대칭적입니다. 오른쪽 테이블에 매칭되는 연결고리가 존재하면 해당 데이터를 정상적으로 결합하고, 존재하지 않는다면 오른쪽 테이블에서 가져올 칼럼들의 자리를 결합 누락 상태인 NULL 값으로 채워넣어 행의 형태를 유지하는 문법적 속성을 가집니다.
-- LEFT OUTER JOIN의 표준적인 문법 구조
SELECT
A.CUST_NO
, A.CUST_NM
, B.PURCHASE_AMT
FROM
DW_MART.CUSTOMER_MSTR A -- [왼쪽] 기준 테이블 (모수 보존 대상)
LEFT OUTER JOIN
DW_MART.DAILY_PURCHASE_LOG B -- [오른쪽] 참조 테이블 (매칭 대상)
ON
A.CUST_NO = B.CUST_NO;
💡 실무 작성 시 기억해야 할 문법 팁
- OUTER 키워드의 생략 가능성: 표준 SQL 문법 규칙상
LEFT OUTER JOIN에서OUTER단어는 생략이 가능합니다. 즉, 현업에서LEFT JOIN으로 축약하여 기재하더라도 데이터베이스 엔진은 이를 완벽한 외부 조인으로 인식하므로 코드를 간결하게 유지하는 대안으로 꼽힙니다. - 우측 테이블의 NULL 발생 인지: 결합 매칭에 실패한 행들은 우측 테이블 유래 칼럼(위 예시의
B.PURCHASE_AMT)이 강제로NULL로 변환되어 출력됩니다. 이 특성은 결측치 처리 함수와 유기적으로 연결되어 분석의 퀄리티를 높이는 밑거름이 됩니다.
3. 현업 비즈니스 사례로 보는 데이터 결합 누락과 WHERE절의 함정
LEFT OUTER JOIN을 다룰 때 초보 분석가와 실무 직장인들이 가장 많이 범하는 치명적인 논리적 오류가 있습니다. 분명 코드는 외부 조인 형식으로 작성했음에도 불구하고, 추가 조건을 결합하는 과정에서 실수하여 결과적으로 INNER JOIN과 다름없는 교집합 데이터만 남겨놓는 현상입니다. 이해를 돕기 위해 실제 대형 유통 기업 마케팅 부서에서 자주 겪는 가상의 시나리오를 살펴보겠습니다.
📊 [실무 사례 예시: 마케팅 팀 최 대리의 쿠폰 발송 대상 누락]
온라인 백화점 마케팅 팀의 최 대리는 “7월 전체 회원 이벤트 대상자 명단을 기준으로, 7월 12일 당일에 ‘패션’ 카테고리 상품을 구매한 이력이 있다면 그 구매 금액을 매칭하고, 구매하지 않은 회원들도 명단에 누락 없이 전부 포함시켜 최종 리포트를 제출해 달라”는 요청을 받았습니다.
최 대리는 회원의 모수를 지키기 위해 다음과 같이
LEFT JOIN을 사용하여 쿼리를 구성하고, 특정 카테고리와 날짜 필터를WHERE절에 덧붙여 실행했습니다.
-- [주의] LEFT JOIN 사용 후 WHERE절의 잘못된 조건 부여로 데이터 누락을 유발하는 위험한 쿼리
SELECT
A.CUST_NO
, A.CUST_NM
, B.PURCHASE_AMT
FROM
DW_MART.CUSTOMER_MSTR A
LEFT JOIN
DW_MART.DAILY_PURCHASE_LOG B
ON
A.CUST_NO = B.CUST_NO
WHERE
B.PURCHASE_DT = '2026-07-12' -- [오류 유발] 우측 참조 테이블에 대한 필터 조건
AND B.CATEGORY_CD = 'FASHION';
🚨 무엇이 문제였을까? (외부 조인의 WHERE절 무력화 현상)
마케팅 팀은 이 리포트를 기반으로 전체 회원 대상 쿠폰을 발송하려고 했으나, 평소보다 대상자 수가 크게 감소하 오직 7월 12일에 패션 상품을 구매한 사람들만 명단에 남아있는 심각한 데이터 결합 누락 현상을 발견했습니다.
이유는 SQL의 ‘조건 평가 순서’ 때문입니다. LEFT JOIN이 먼저 실행되어 구매 이력이 없는 회원들의 B.PURCHASE_DT와 B.CATEGORY_CD 칼럼 자리는 결합 실패로 인해 일시적으로 NULL 값으로 채워졌습니다.
그러나 결합이 완료된 이후 최종 단계에서 WHERE 절의 B.PURCHASE_DT = '2026-07-12' 조건이 평가받게 됩니다. 6화에서 배웠듯이 NULL = '2026-07-12'라는 비교 연산은 참이 될 수 없으므로, 구매 이력이 없어서 NULL 상태였던 대다수의 정상 회원 행들이 WHERE 절의 필터 벽을 넘지 못하고 전부 탈락(거짓 처리)해 버린 것입니다. 결과적으로 외부 조인의 메커니즘이 무력화되고 내부 조인처럼 작동하게 되는 비즈니스 리스크를 초래한 셈입니다.
4. 데이터 누락을 원천 차단하는 올바른 외부 조인 제어 치트키
이러한 조건절 결합 오류를 방지하고 왼쪽 마스터 테이블의 모수를 철저하게 보존하기 위해, 현직 분석가들이 사용하는 실무 치트키 두 가지를 제시합니다.
1) 우측 참조 테이블의 필터 조건을 ON 절로 격리 이동
오른쪽 테이블에서 유래한 조건이 외부 조인의 모수를 깎아 먹지 않게 하려면, 해당 필터 조건을 WHERE 절이 아닌 조인의 뼈대를 정의하는 ON 절 내부에 AND로 결합하여 묶어주는 것이 표준 대안으로 평가받습니다.
-- [올바른 예시 1] 참조 테이블의 필터를 ON 절 내부에 격리하여 모수를 온전히 보존한 최적화 쿼리
SELECT
A.CUST_NO
, A.CUST_NM
, B.PURCHASE_AMT
FROM
DW_MART.CUSTOMER_MSTR A
LEFT JOIN
DW_MART.DAILY_PURCHASE_LOG B
ON
A.CUST_NO = B.CUST_NO
AND B.PURCHASE_DT = '2026-07-12' -- ON 절 내부로 이동하여 외부 조인 규칙 보호
AND B.CATEGORY_CD = 'FASHION';
필터 조건을 ON 절로 이동시키면 데이터베이스 엔진은 “7월 12일이면서 패션 카테고리인 구매 내역만 골라내어 회원 마스터와 매칭을 시도하고, 만약 매칭되지 않더라도 회원 마스터 행은 지우지 말고 살려두라”고 올바르게 해석하게 됩니다. 이로 인해 미구매 회원들도 탈락하지 않고 정상적으로 결과 창에 노출될 수 있습니다.
2) COALESCE 함수와의 융합을 통한 대시보드 규격화
LEFT JOIN을 성공적으로 마치고 나면 매칭 실패로 발생한 무수한 NULL 값들이 화면에 공백으로 노출됩니다. 이를 임원진 보고용 대시보드나 정산 자료에 그대로 올리면 불완전한 리포트로 보이기 쉽습니다. 이때 6화에서 학습한 COALESCE 함수를 융합하여 결측치를 깔끔한 숫자나 문자로 대체해 주는 것이 훌륭한 실무 튜닝 노하우입니다.
-- [올바른 예시 2] LEFT JOIN과 COALESCE 함수를 결합하여 깔끔한 기본값을 부여한 실무 쿼리
SELECT
A.CUST_NO
, A.CUST_NM
, COALESCE(B.PURCHASE_AMT, 0) AS PURCHASE_AMT -- 구매 이력이 없으면 공백 대신 숫자 0 노출
FROM
DW_MART.CUSTOMER_MSTR A
LEFT JOIN
DW_MART.DAILY_PURCHASE_LOG B
ON
A.CUST_NO = B.CUST_NO
AND B.PURCHASE_DT = '2026-07-12';
5. 9화 요약 및 실무 외부 조인 체크리스트
쿼리를 빌드하고 서버 환경에 실행 명령을 던지기 전, 마스터 데이터 누락의 결점이 없는지 스스로 진단할 수 있는 요약 가이드를 제공합니다.
| 체크포인트 | 발생 가능한 실무 리스크 | 현직 분석가의 권장 대안 및 조치 |
| 조인 완료 후 WHERE절에 우측 테이블 칼럼 조건 기재 여부 | LEFT JOIN이 내부 조인화되어 기준 마스터 데이터 대량 탈락 및 누락 | 우측 테이블의 매칭 여부에 영향을 주는 조건은 가급적 ON절에 작성 |
| 출력 화면의 공백(NULL) 방치 여부 | 연산 오류 유발 및 최종 대시보드 레이아웃의 시각적 신뢰성 하락 | COALESCE(B.칼럼, 0) 또는 ('미등록') 형태로 대체값 펜싱 |
| 좌측 테이블의 고유성(Uniqueness) 확보 | 기준이 되는 왼쪽 마스터에 중복행 존재 시 데이터 뻥튀기 재발 | 8화에서 언급한 기준 테이블의 단일 이력 필터 선제 결합 체크 |
6. 결론 및 다음 화 예고
이번 9화에서는 기준 테이블의 모수를 보존하면서 다차원 데이터 결합을 구현하는 LEFT OUTER JOIN의 문법 구조를 살펴보고, 실무에서 흔히 저지르는 WHERE 절 필터 배치 오류로 인한 데이터 결합 누락 현상과 이를 해결하기 위한 ON 절 격리 전략을 다각도로 점검해 보았습니다. 데이터의 버려지는 파편 없이 기준 테이블의 모수를 정확하게 보존하는 조인 제어 역량은 고도화된 비즈니스 통계를 산출하기 위한 필수 관문입니다.
단일 테이블 제어와 다중 테이블 결합 기법을 섭렵한 분석가가 다음으로 마주하게 되는 고난도 과제는, 거대하고 복잡한 질의를 구조화하여 생산성을 높이는 일입니다.
이어지는 10화에서는 하나의 쿼리 문장 안에 또 다른 가상의 조회를 중첩하여 집어넣는 서브쿼리(Subquery)의 세계를 집중 분석합니다. SELECT 절에 들어가는 스칼라 서브쿼리, WHERE 절에 배치되는 중첩 서브쿼리 등 위치에 따른 분류 체계를 명확히 하고, 복잡한 비즈니스 조건 연산 환경에서 서브쿼리가 전체 시스템 연산 효율과 쿼리 가독성에 미치는 영향을 다각도로 파악해 보겠습니다.