OUTER JOIN
조인 조건에 맞지 않는 행까지 보여 주는 OUTER JOIN을 Oracle (+) 문법과 ANSI LEFT, RIGHT, FULL OUTER JOIN으로 쓰는 방법과 (+) 연산자의 제약
#핵심 요약
outer join은 equi join으로는 볼 수 없는 결과(상대 테이블에 짝이 없는 행)를 볼 때 씀
Oracle 문법은 데이터가 모자란 쪽 컬럼에 (+)를 붙임e.deptno (+) = d.deptno는 사원이 없는 부서까지 보여 줌
ANSI 문법은 LEFT, RIGHT, FULL OUTER JOIN ... ON임
양쪽 모두를 보려면 FULL OUTER JOIN을 씀
Oracle은 (+) 연산자보다 FROM 절의 OUTER JOIN 문법을 쓰라고 권함
#개념과 동작 원리
| 보고 싶은 행 | Oracle 문법 | ANSI 문법 |
|---|---|---|
| 사원이 없는 부서(40번)까지 | e.deptno (+) = d.deptno |
emp e RIGHT OUTER JOIN dept d ON (...) |
| 부서가 없는 사원(부서 70 사원)까지 | e.deptno = d.deptno (+) |
emp e LEFT OUTER JOIN dept d ON (...) |
| 메모리와 SPFILE | 실습에서는 (+) = (+)로 시도한 뒤 ANSI로 해야 한다고 적음 |
emp e FULL OUTER JOIN dept d ON (...) |
(+) 연산자의 제약:
(+)는WHERE절(또는TABLE절의 왼쪽 상관 문맥)에만 쓸 수 있음- 바깥 쿼리와 안쪽 쿼리에 나뉜 두 테이블에는 outer join이 되지 않음
- 테이블을 자기 자신과
(+)로 outer join할 수 없음
셀프 조인 자체는 됨 (+)는 컬럼에만 붙일 수 있고 임의의 식에는 붙일 수 없음
식 안의 컬럼에는 붙일 수 있음(+)가 있는 조건은OR로 다른 조건과 묶을 수 없고,IN으로 식과 비교할 수 없음- 테이블 B의 컬럼을 상수와 비교하는 조건이 있으면 그 컬럼에도
(+)를 붙여야 함
아니면 경고나 오류 없이 일반 조인 결과만 나옴
#필수 명령어 또는 SQL
#사원이 없는 부서까지
SELECT e.ename, e.job, e.sal, d.loc
FROM emp e, dept d
WHERE e.deptno (+) = d.deptno;
SELECT e.ename, e.job, e.sal, d.loc
FROM emp e RIGHT OUTER JOIN dept d
ON (e.deptno = d.deptno);결과 해석: 개별 실행 출력은 기재 없음
#부서가 없는 사원까지
실습에서는 dept에 없는 부서번호 70의 사원을 넣었음
INSERT INTO emp (empno, ename, sal, deptno)
VALUES (8392, 'JACK', 3400, 70);
COMMIT;SELECT e.ename, d.loc
FROM emp e LEFT OUTER JOIN dept d
ON (e.deptno = d.deptno);결과 해석: 개별 실행 출력은 기재 없음
#양쪽 모두
SELECT e.ename, e.job, e.sal, d.loc
FROM emp e FULL OUTER JOIN dept d
ON (e.deptno = d.deptno);결과 해석: 부서가 없는 사원(JACK)과 사원이 없는 부서(BOSTON)가 함께 나옴(실습 데이터 기준 해석)
실습에서는 같은 결과를 e.deptno (+) = d.deptno (+)로 시도했고 "반드시 1999 ANSI 문법으로 수행해야 한다"고 적었음
양쪽에 (+)를 붙인 문장의 오류 내용은 기재 없음
#사용 조건과 주의사항
실습 쇼핑몰 실습의 비회원 주문(고객번호 NULL)은 고객 테이블과 equi join하면 빠지고, 주문 테이블 쪽을 살리는 outer join으로 볼 수 있음(동등 조인과 비동등 조인)