4.4 조인(Join) – Outer Join(LEFT, RIGHT, FULL OUTER JOIN)
오라클 클럽: http://www.oracleclub.com/lecture/1021
Outer(외부) Join
- Equi Join 문장들의 한 가지 제약점은 그것들이 조인을 생성하려는 두 개의 테이블의 두 개 컬럼에서
공통된 값이 없다면 테이블로부터 데이터 반환하지 못함
- 정상적으로 조인 조건을 만족하지 못하는 행들을 보기 위해 Outer Join 사용
- Outer Join연산자는 (+)
- 조인시킬 값이 없는 조인 측에 (+)를 위치
- Outer Join연산자는 표현식의 한 편에만 올 수 있음
Outer Join예제
-- 예제1) 일반 조인의 경우
SQL> SELECT DISTINCT(a.deptno), b.deptno
FROM emp a, dept b
WHERE a.deptno = b.deptno
DEPTNO DEPTNO
------ ----------
10 10
20 20
30 30
-- 예제2) Outer Join을 했을 경우
SQL> SELECT DISTINCT(a.deptno), b.deptno
FROM emp a, dept b
WHERE a.deptno(+) = b.deptno
DEPTNO DEPTNO
------- --------
10 10
20 20
30 30
40
-- 다음의 쿼리를 한번 잘 살펴보기 바란다.
SQL> SELECT DISTINCT(a.deptno), b.deptno
FROM emp a, dept b
WHERE a.deptno(+) = b.deptno
AND a.ename LIKE '%';
DEPTNO DEPTNO
---------- ----------
10 10
20 20
30 30
-- 쿼리 결과를 잘 보면 Outer Join이 되지 않은 것을 알 수 있다.
-- 위 쿼리를 Outer Join 시키기 위해서는 아래와 같이 고쳐야 한다.
SQL> SELECT DISTINCT(a.deptno), b.deptno
FROM emp a, dept b
WHERE a.deptno(+) = b.deptno
AND a.ename(+) LIKE '%'
DEPTNO DEPTNO
---------- ----------
10 10
20 20
30 30
40
-- Outer Join 조건이 걸려있는 테이블에는 다른 조건절이 들어와도
-- 똑같이 Outer Join 연산자인 (+)를 해주어야 한다.
표준 Outer Join
- Oracle9i부터는 ANSI/ISO SQL표준인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN를 지원
LEFT OUTER JOIN
- 오른쪽 테이블에 조인시킬 컬럼이 없는 경우 사용
SELECT DISTINCT(e.deptno), d.deptno
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno;
RIGHT OUTER JOIN
- 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용
SELECT DINSTINCT(e.deptno), d.deptno
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno;
FULL OUTER JOIN
- 양쪽 테이블에 다 Outer Join을 거는 것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN
SELECT DISTINCT(a.deptno), b.deptno
FROM emp a FULL OUTER JOIN dept b
ON a.deptno = b.deptno