부서정보 테이블에 새로 입력한 ‘IT팀’의 dept_id 값(5)을 가진 사원은 없습니다. 하지만 ‘IT팀’까지 모든 부서정보를 조회하고자 할 때는 다음과 같이 쿼리를 작성합니다.
쿼리 9-12 부서정보 테이블 기준 외부 조인
--오라클 기본 구문 SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_id, b.dept_name, b.use_yn FROM emp_master a ,dept_master b WHERE a.dept_id(+) = b.dept_id ORDER BY a.emp_id; --ANSI 구문 SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_id, b.dept_name, b.use_yn FROM emp_master a RIGHT JOIN dept_master b ON a.dept_id = b.dept_id ORDER BY a.emp_id;
▲ 그림 9-9 쿼리 9-12를 실행한 결과
이번에는 기준이 되는 테이블이 부서정보 테이블이므로 오라클 기본 구문에서는 사원정보 테이블 조인 컬럼 쪽에 (+)가 붙었습니다. ANSI 구문의 경우에는 LEFT 대신 RIGHT를 사용했죠. 즉, 오른쪽 테이블인 부서정보 테이블을 기준으로 삼는다는 의미입니다. 따라서 조회 결과를 보면 ‘IT팀’ 데이터의 경우 사원정보 테이블의 컬럼 값은 모두 NULL로 나온 것을 알 수 있습니다.
그렇다면 두 테이블의 데이터를 모두 조회할 수는 없을까요? 즉, 그림 9-8과 그림 9-9의 결과를 합쳐 조회할 수는 없을까요? 결론부터 말하면 가능합니다. 하지만 오라클 기본 구문으로는 작성할 수 없고(WHERE 절에서 조인 컬럼 양쪽에 모두 (+) 기호를 붙이면 오류가 납니다) ANSI 문법을 사용해야 합니다. 이런 유형의 외부 조인을 FULL OUTER JOIN이라고 합니다. 즉, 조인에 참여하는 두 테이블의 값을 모두 조회하는 것이죠. 먼저 ANSI 문법을 사용한 쿼리를 살펴보도록 하죠.
쿼리 9-13 FULL OUTER JOIN
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, b.dept_name, b.use_yn
FROM emp_master a
FULL OUTER JOIN dept_master b
ON a.dept_id = b.dept_id
ORDER BY a.emp_id;
▲ 그림 9-10 쿼리 9-13을 실행한 결과
LEFT나 RIGHT 대신 FULL OUTER 구문을 사용했습니다. 여기서도 ‘OUTER’는 생략할 수 있습니다. 예상했던 대로 두 테이블 데이터가 모두 조회되었습니다. 다만 ‘왕건’ 데이터의 경우 부서정보 테이블 데이터가 모두 NULL이고, ‘IT팀’의 경우에는 사원정보 테이블의 데이터가 모두 NULL입니다.
외부 조인은 종류가 세 가지나 되지만 실제로 작성해야 하는 경우는 그리 많지 않습니다. 주로 내부 조인을 사용하죠.