더북(TheBook)

부서정보 테이블에 새로 입력한 ‘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을 실행한 결과

 

LEFTRIGHT 대신 FULL OUTER 구문을 사용했습니다. 여기서도 ‘OUTER’는 생략할 수 있습니다. 예상했던 대로 두 테이블 데이터가 모두 조회되었습니다. 다만 ‘왕건’ 데이터의 경우 부서정보 테이블 데이터가 모두 NULL이고, ‘IT팀’의 경우에는 사원정보 테이블의 데이터가 모두 NULL입니다.

외부 조인은 종류가 세 가지나 되지만 실제로 작성해야 하는 경우는 그리 많지 않습니다. 주로 내부 조인을 사용하죠.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.