본문 바로가기

데이터베이스/SQL & PL/SQL

[SQL] OUTER JOIN, 외부조인(LEFT, RIGHT, FULL)

INNER JOIN, 내부조인에 이은 외부조인 입니다.
내부조인을 접한후에 외부조인을 접하면 개념이 이해가 안갈데가 더 많은데요.

요렇게 생각해보는건 어떨까요?

내부조인 결과+@

제가 이렇게 한건 결국 외부조인은
내부조인처럼 조인조건을 만족하는 결과에다가(내부조인의 결과와 같습니다.)
내가 조인을 건 어느 테이블의 데이터를 더 보겠다는 겁니다.

그러니 외부조인을 이용해서 데이터를 조회했을 경우에 어느 한쪽 테이블의 값이 null이고  
다른 테이블의 데이터는 값이 나오게 되는거죠.

일단 이렇게 알고나서 구문형식을 보도록 할게요.
SELECT  테미블명.컬럼명1, 테미블명.컬럼명2, 테미블명.컬럼명3, ..
FROM     테이블 명1 (LEFT, RIGHT, FULL) OUTER JOIN 테이블명2
ON         조인조건;

어때요. INNER JOIN과 동일한 형태라는 것을 알 수 있죠?
다만 OUTER JOIN으로 이름이 바뀐것과 LEFT, RIGHT, FULL이라는 외부조인의 종류 3가지를 해당 위치에다 적을 수 있습니다.

일단 LEFT 외부조인을 먼저 살펴보도록 할게요.
제가 쿼리를 검색할 조건은 department_id를 조인조건으로 LEFT 외부조인을 할겁니다.

SELECT emp.department_id, emp.first_name || emp.last_name AS "NAME", dep.department_name
FROM     hr.departments dep LEFT OUTER JOIN hr.employees emp
ON         emp.department_id = dep.department_id
ORDER BY 3;

결과를 보기 전에 쿼리를 잠시 보시면 'LEFT OUTER JOIN' 부분을 빼면 모두 내부조인과 동일함을 알수 있습니다.
하지만 여기서 뜻하는 외부조인의 뜻은 나는 LEFT, 왼쪽에 있는 테이블에 대해서 정보를 더 보겠다~ 라는 겁니다.
조인조건에 만족하지는 않지만 departments 테이블이 가지고 있는 정보가 조회할 컬럼 SELECT에 의해 더 보이게 되는거죠.

여기서 LEFT, RIGHT, FULL 은 FROM 절에 적어놓은 테이블중에 JOIN 키워드를 기준으로 어느 쪽의 데이터를 더 볼것이냐를 나타냅니다.
FULL은 양쪽 테이블에 대한 LEFT, RIGHT 외부조인을 합쳐놓은 것이라 보면 되겠군요.

그래도 이해가 가지 않는다 하시면 위의 쿼리를 실행시켜 봅시다.

(참고로 전체결과의 일부결과 입니다.)

결과에서 NULL인 공간이 보이죠?? 여기서 눈여겨 보아야 할 사항은 NULL 을 포함하고 있는 컬럼입니다.
DEPARTMENT_ID 와 NAME 컬럼은 지금 현재 어느 테이블에 속해 있나요?
hr스키마의 employees 테이블에 속해 있습니다.

자, FROM 절에는 LEFT를 이용해서 departments 테이블의 정보를 더 보겠다~ 라고 했죠?
그러니 조인 조건에 해당되지 않는 departments 테이블의 데이터는 위와같이 조회되는 반면에
그 조회되는 데이터의 employees 테이블에 속하는 컬럼의 데이터 값은 조회가 안되는거죠.
그러니 NULL 상태로 표시가 되는겁니다.

또 생각하셔야 할것이 무엇이냐면, 제가 이 쿼리를 통해 어떤 결과를 얻고 싶었을까 입니다.
제가 이 쿼리에서 의도한건 "회사에 혹시 사원들이 존재하지 않는 불필요한 부서가 있나?" 를 조회해보고 싶은겁니다.
만일에 사원이 있었다면 조인조건 department_id에 기준을 해서 각 사원들이 표시가 되었겠죠?
하지만 저기 위에 표시된 부서들은 employees 테이블에 해당하는 데이터가 없는 것으로 볼수 있는데,
제가 원하는 결과, 즉 사원들이 없는 부서인 것(!) 입니다.

내부조인이였다면 해당 조인조건에 부합되는 결과만 나오기 대문에 저런결과를 알아볼 수가 없죠.
이렇게 어떤 특별한 의도로 정보를 보고싶을때 사용되는 것이 외부조인 입니다.

그럼 반대로 한번 해볼까요?
RIGHT JOIN을 써서 회사의 사원인데 부서에 속해있지 않는 사람을 조회하겠습니다.

SELECT emp.department_id, emp.first_name || emp.last_name AS "NAME", dep.department_name
FROM    hr.departments dep RIGHT OUTER JOIN hr.employees emp
ON        emp.department_id = dep.department_id
ORDER BY 3;


(전체결과의 일부 입니다.)

자 저기 KimberelyGrant 라는 사람을 보세요. DEPARTMENT_ID와 DEPARTMENT_NAME 의 데이터값이 NULL이죠?
이는 해석을 두가지로 해볼 수 있는데요. 회사의 사원이나 아직 부서배정을 받지 못한 사람이라든지,
부서 배정이 없는 유일한 사람. 사장님과 회장님이시죠.

자~ 아셨죠? FULL 외부조인은 위에 보이 결과 둘을 합쳐 놓은것과 동일합니다.
사원이 없는 부서와 부서에 속해있지 않은 사람을 동시에 조회해보고 싶다~ 라고 할때 사용될 수 있습니다.

이상 외부조인을 끝내도록 할게요~
도움 되셨나 모르겠어요~ 오늘 하루도 공부 열심히 합시다~