테이블을 정규화해 중복과 이상 현상은 줄이되, 여러 테이블의 데이터를 한 번에 조회하려면 조인이 필수입니다.
이 글에서는 외래 키(FK) 설정을 시작으로, INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, SELF JOIN의 개념·문법·흔한 실수 예제를 모두 다룹니다.
목차
- 외래 키(FK) 설정
- 조인의 개념과 종류
- INNER JOIN
3.1. 개념
3.2. 문법
3.3. 잘못된 예제
3.4. 올바른 예제 - LEFT OUTER JOIN
4.1. 개념
4.2. 문법
4.3. 잘못된 예제
4.4. 올바른 예제 - RIGHT OUTER JOIN
5.1. 개념
5.2. 문법 - FULL OUTER JOIN
6.1. 개념
6.2. 문법 - SELF JOIN
7.1. 개념
7.2. 문법 - 다중 테이블 조인 실전 예제
- 조인 활용 팁
1. 외래 키(FK) 설정
ALTER TABLE sawon
ADD CONSTRAINT fk_sawon_deptno
FOREIGN KEY(deptno)
REFERENCES dept(deptno);
ALTER TABLE sawon
ADD CONSTRAINT fk_sawon_samgr
FOREIGN KEY(samgr)
REFERENCES sawon(sabun);
ALTER TABLE gogek
ADD CONSTRAINT fk_gogek_godam
FOREIGN KEY(godam)
REFERENCES sawon(sabun);
설정된 제약 조건은 USER_CONSTRAINTS 뷰에서 확인할 수 있습니다.
SELECT constraint_type, constraint_name
FROM user_constraints
WHERE table_name = 'SAWON';
SELECT constraint_type, constraint_name
FROM user_constraints
WHERE table_name = 'GOGEK';
2. 조인의 개념과 종류
- 조인(JOIN): 둘 이상의 테이블을 특정 조건으로 연결해 결과를 반환
- 정규화된 데이터를 조합해 보고서, 통계, 분석 등에 사용
- 정규화의 목적 : 데이터 중복 배제, 이상현상 배제
3. INNER JOIN
3.1. 개념
- 두 테이블의 조인 조건을 모두 만족하는 행만 추출
- 관련 데이터만 조회할 때 사용
3.2. 잘못된 예제
- ON 절 없이 조인
- -- 의도: deptno 기준 결합 SELECT * FROM sawon, dept -- CROSS JOIN 발생 WHERE sawon.deptno = dept.deptno AND deptno = 10; -- ORA-00918: 열의 정의가 애매합니다
- WHERE 절에만 조인 조건 + 일반 필터
SELECT * FROM sawon, dept WHERE sawon.deptno = dept.deptno AND sawon.deptno = 10; -- 기능은 하지만, 테이블이 많아질수록 조건이 섞여 헷갈립니다.
3.3. 바른 예제 (ANSI-92 SQL)
- INNER JOIN + ON 절
SELECT * FROM sawon INNER JOIN dept ON sawon.deptno = dept.deptno WHERE sawon.deptno = 10;
3.4. NATURAL JOIN / USING
- 공통 컬럼을 자동 매칭
SELECT * FROM sawon NATURAL JOIN dept; SELECT * FROM sawon JOIN dept USING(deptno);
3.5. 자기 참조(Self JOIN)
사원 테이블에서 사원 ↔ 상사 정보를 함께 조회할 때 사용합니다.
- 크로스 조인
- SELECT * FROM sawon s1, sawon s2; -- 모든 조합 반환
- 잘못된 WHERE 조인
- SELECT * FROM sawon s1, sawon s2 WHERE s1.samgr = s2.sabun ORDER BY s1.sabun;
- ANSI-92 INNER JOIN
SELECT s1.sabun, s1.sajob, s1.saname, s2.sabun, s2.sajob, s2.saname FROM sawon s1 INNER JOIN sawon s2 ON s1.samgr = s2.sabun ORDER BY s1.sabun;
4. LEFT OUTER JOIN
4.1. 개념
- 왼쪽(LEFT) 테이블의 모든 행을 우선 반환
- 조인 조건에 맞지 않는 오른쪽(OUTER) 테이블 컬럼은 NULL로 채움
4.2. 잘못된 예제
SELECT
s1.sabun, s1.saname, s2.saname AS manager_name
FROM sawon s1
LEFT OUTER JOIN sawon s2
ON s1.samgr = s2.sabun
WHERE s2.sajob = '부장';
-- WHERE 절에서 필터링하면 NULL인 행이 모두 제거되어
-- LEFT OUTER JOIN 효과가 사라집니다.
4.3. 바른 예제 (ANSI-92 SQL)
SELECT
s1.sabun, s1.saname,
s2.sabun AS manager_id,
s2.saname AS manager_name
FROM sawon s1
LEFT OUTER JOIN sawon s2
ON s1.samgr = s2.sabun
AND s2.sajob = '부장' -- 필터를 ON 절로 이동
ORDER BY s1.sabun;
4.4. Oracle 전통 문법
SELECT
s1.sabun, s1.saname, s1.samgr,
s2.sabun, s2.sajob, s2.saname
FROM sawon s1, sawon s2
WHERE s1.samgr = s2.sabun(+)
ORDER BY s1.sabun;
5. RIGHT OUTER JOIN
5.1. 개념
- 오른쪽 테이블의 모든 행 반환
- 조건 미충족 시 왼쪽 컬럼 NULL
5.2. 문법
SELECT *
FROM A
RIGHT OUTER JOIN B
ON A.key = B.key;
6. FULL OUTER JOIN
6.1. 개념
- A, B 양쪽 테이블의 모든 행 반환
- 불일치하는 컬럼은 NULL
6.2. 문법
SELECT *
FROM A
FULL OUTER JOIN B
ON A.key = B.key;
7. SELF JOIN
7.1. 개념
- 자기 자신 테이블을 두 번 참조해 조인
7.2. 문법
SELECT s1.sabun, s1.saname, s2.saname AS manager
FROM sawon s1
INNER JOIN sawon s2
ON s1.samgr = s2.sabun;
8. 다중 테이블 조인 실전 예제
SELECT
s.sabun AS 사원번호,
s.saname AS 사원명,
d.dname AS 부서명,
g.gobun AS 고객번호,
g.goname AS 고객명,
s2.sabun AS 상사번호,
s2.saname AS 상사명,
g2.gobun AS 상사고객번호,
g2.goname AS 상사고객명
FROM sawon s
INNER JOIN dept d ON d.deptno = s.deptno
LEFT OUTER JOIN gogek g ON g.godam = s.sabun
LEFT OUTER JOIN sawon s2 ON s2.sabun = s.samgr
LEFT OUTER JOIN gogek g2 ON g2.godam = s2.sabun
ORDER BY s.sabun;
9. 조인 활용 팁
- 조인 조건은 항상 ON 절에 명시
- 별칭(Alias) 활용해 컬럼 모호성 방지
- INNER vs OUTER 조인 선택 기준:
- INNER: 양쪽 모두에서 일치하는 데이터만
- OUTER: 한쪽 테이블의 모든 데이터 유지
- 복잡한 조인은 **뷰(View)**로 분리해 재사용성↑
- 대용량 조인은 성능 고려(인덱스·파티셔닝 활용)
다양한 조인 방식을 익혀 실무에 바로 적용해 보세요!
'Oracle' 카테고리의 다른 글
Oracle GROUP BY 활용 가이드 (2) | 2025.08.14 |
---|---|
Oracle 뷰(View) 이해 및 활용 가이드 (4) | 2025.08.13 |
Oracle 집계 함수(aggregate functions) 정리 및 실습 (0) | 2025.08.13 |
Oracle SQL 서브쿼리(Subquery)와 집합 연산자 (5) | 2025.08.13 |
Oracle DECODE, CASE, NVL/NVL2, VIEW 함수 정리 및 예제 (4) | 2025.08.08 |