본문 바로가기

database

oracle - OUTER JOIN

19.12.02. OUTER JOIN

데이터베이스 구현

2019-12-02 22:53:41


▶OUTER JOIN

컬럼 연결이 실패해도(JOIN이 실패해도) 기준이 되는 테이블의 데이터가 나오도록 하는 JOIN 방법.

1. left[right] outer join

  : 테이블 1 LEFT[RIGHT] OUTER JOIN 테이블2

   테이블 1과 테이블 2를 조인할 때 조인에 실패하더라도 테이블 1쪽의 테이터는 조회되도록 한다.

   조인에 실패한 행에서 테이블 2의 컬럼값은 존재하지 않으므로 NULL 로 표시.

   RIGHT 의 경우 테이블 2쪽의 데이터가 조회되고, 테이블 1이 NULL로 표시.

2. full outer join

  : LEFT OUTER JOIN + RIGHT OUTER JOIN 에 중복된 것을 제거한 것.

 

SELECT e.ename, e.empno, m.ename, m.empno

FROM emp e LEFT OUTER JOIN emp m ON (e.mgr = m.empno);

 

--

SELECT e.ename, e.empno, e.deptno, m.ename, m.empno, m.deptno

FROM emp e LEFT OUTER JOIN emp m ON (e.mgr = m.empno)

WHERE m.deptno = 10;

--

SELECT e.ename, e.empno, e.deptno, m.ename, m.empno, m.deptno

FROM emp e LEFT OUTER JOIN emp m

ON (e.mgr = m.empno AND m.deptno = 10);

  => 두 개의 차이 :  위 쿼리에서는 WHERE 절이 애초에 deptno 가 10 인 것만 조회해서

    NULL 값을 가진 것은 미리 삭제해버렸고, 아래 쿼리에서는 NULL 값인 것도 조회된다.

 

-- ANSI SQL

SELECT e.ename, e.empno, m.ename, m.empno

FROM emp e LEFT OUTER JOIN emp m ON (e.mgr = m.empno);

-- ORACLE SQL

SELECT e.ename, e.empno, m.ename, m.empno

FROM emp e, emp m

WHERE e.mgr = m.empno(+);

  => 오라클 문법에서는 매니저의 직원 번호가 NULL 이 있기 때문에 이쪽에 (+) 를 붙여주었다.

    WHERE 절에 오는 모든 NULL값을 가지는 부분에 (+) 을 써주어야 한다.