정 보 교 환

오라클 INNER JOIN vs OUTER JOIN 완전 정리 (실무 예제 포함)

sageput 2026. 3. 3. 11:46
반응형

1️⃣ JOIN이란 무엇인가?

   JOIN은 두 개 이상의 테이블을 **공통 컬럼(Primary Key / Foreign Key)**을 기준으로 연결하여 하나의 결과 집합으로 조회하는 SQL 문법입니다.

  • 관계형 데이터베이스 이론은 E.F. Codd의 관계 대수(Relational Algebra)에 기반
  • Oracle 공식 SQL Reference 문서에서 JOIN은 ANSI SQL 표준을 따름

📌 공식 문서 근거
Oracle® Database SQL Language Reference
https://docs.oracle.com/en/database/


2️⃣ INNER JOIN

✔ 정의

두 테이블에서 조인 조건을 만족하는 행만 반환

즉, 교집합 데이터만 조회합니다.

✔ 문법 (ANSI 표준 방식)

 
SELECT 컬럼
FROM 테이블1 A
INNER JOIN 테이블2 B
ON A.공통컬럼 = B.공통컬럼;
 

✔ 예제 테이블

EMP (사원)

EMPNO ENAME DEPTNO
1001 KIM 10
1002 LEE 20
1003 PARK 30
1004 CHOI NULL

DEPT (부서)

DEPTNO DNAME
10 SALES
20 HR
40 IT

✔ INNER JOIN 실행

 
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

✔ 결과

EMPNO ENAME DNAME
1001 KIM SALES
1002 LEE HR

✔ 분석

  • DEPTNO : 30 → DEPT에 없음 → 제외
  • DEPTNO  : NULL → 비교 불가 → 제외
  • DEPTNO  : 40 → EMP에 없음 → 제외

👉 교집합만 반환 = INNER JOIN


3️⃣ OUTER JOIN

   OUTER JOIN은 한쪽 테이블 기준으로 조건이 일치하지 않아도 데이터를 포함합니다.

Oracle에서는 다음 3가지가 있습니다.

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

3-1️⃣ LEFT OUTER JOIN

✔ 정의

    왼쪽 테이블의 모든 행을 반환 조건이 일치하지 않으면 오른쪽 컬럼은 NULL

 
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

✔ 결과

EMPNO ENAME DNAME
1001 KIM SALES
1002 LEE HR
1003 PARK NULL
1004 CHOI NULL

✔ 분석

  • EMP 기준 전부 출력
  • 부서 없는 직원도 표시됨

👉 실무에서 가장 많이 사용됨


3-2️⃣ RIGHT OUTER JOIN

    오른쪽 테이블 기준 전체 출력

 
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E
RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

✔ 결과

EMPNO ENAME DNAME
1001 KIM SALES
1002 LEE HR
NULL NULL IT

👉 부서 IT는 사원이 없어도 출력됨


3-3️⃣ FULL OUTER JOIN

    양쪽 테이블의 모든 데이터 반환

 
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

✔ 결과

EMPNO ENAME DNAME
1001 KIM SALES
1002 LEE HR
1003 PARK NULL
1004 CHOI NULL
NULL NULL IT

4️⃣ Oracle 구문 특징 (구형 방식)

    Oracle 9i 이전에는 (+) 문법 사용

 
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO (+);
 

⚠ 현재는 ANSI JOIN 사용 권장
(Oracle 공식 문서 권장)


5️⃣ INNER vs OUTER JOIN 차이 정리

구분 INNER JOIN LEFT OUTER JOIN (또는 OUTER JOIN)
기준 교집합 왼쪽 전체 (오른쪽 전체)
NULL 포함 없음 조건 불일치 시 NULL
사용 목적 정확한 매칭 데이터 누락 데이터 확인
성능 상대적으로 유리 조건에 따라 비용 증가

6️⃣ 한 단계 더 (현실 업무 예시) 

💳 “결제 안 한 고객 찾기”

LEFT JOIN + WHERE IS NULL

SELECT C.CUSTOMER_ID
FROM CUSTOMER C
LEFT JOIN PAYMENT P
ON C.CUSTOMER_ID = P.CUSTOMER_ID
WHERE P.CUSTOMER_ID IS NULL;
 

👉 결제 기록 없는 고객 찾기


7️⃣초보자가 주의할 점

    1️⃣ WHERE 조건 위치

    LEFT JOIN 후 WHERE 조건을 잘못 쓰면 INNER처럼 동작할 수 있음

    2️⃣ NULL은 값이 아니다

  • NULL ≠ 0
  • NULL ≠ ''
  • 비교 시 반드시 IS NULL 사용

9️⃣ 성능 관점에서의 고려사항

  • 인덱스 존재 여부
  • 옵티마이저 실행 계획
  • 카디널리티
  • 조인 순서
 

📌 결론

  • INNER JOIN = 정확히 매칭되는 데이터만 필요할 때
  • LEFT OUTER JOIN = 누락 데이터까지 분석해야 할 때
  • FULL JOIN = 통계/검증용으로 사용

JOIN은 관계형 데이터베이스 설계와 성능 튜닝의 핵심입니다.

반응형