반응형
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.공통컬럼;
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;
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;
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;
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;
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 (+);
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;
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은 관계형 데이터베이스 설계와 성능 튜닝의 핵심입니다.
반응형
'정 보 교 환' 카테고리의 다른 글
| 미니 PC 시장 성장과 저전력 홈서버 구축 – NAS와 홈랩 시대의 시작 (0) | 2026.03.10 |
|---|---|
| SSD 2D NAND VS 3D NAND 무엇을 사용 할 것인가 (0) | 2026.03.09 |
| PCI vs PCIe 차이점 완벽 비교 (0) | 2026.03.02 |
| 바이브 코딩(Vibe Coding)이란? (0) | 2026.03.02 |
| 2026년 NVMe vs SATA SSD 완벽 비교 🔥 속도 차이, 체감 성능, 무엇을 사야 할까? (0) | 2026.02.24 |