본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (2) [LEFT/RIGHT] OUTER JOIN

PostgreSQL logo image

 

 

[LEFT/RIGHT] OUTER JOIN의 개념은, 쿼리를 기반으로 직관적으로 이해하기 어려운 개념입니다. 그래서 일단 표나 구성을 통해서 관념을 이해하고, 이를 쿼리로 적용하는 순서로 설명을 진행해 보도록 하겠습니다. 

 

우선 다음과 같이 임의의 테이블 EMPLOYEE와 DEPARTMENT를 생성해 예제로 적용해 진행하겠습니다. 

 

CREATE TABLE department
(
 DepartmentID INT,
 DepartmentName VARCHAR(20)
);

CREATE TABLE employee
(
 LastName VARCHAR(20),
 DepartmentID INT
);

INSERT INTO department(DepartmentID, DepartmentName) VALUES(31, '영업부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(33, '기술부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(34, '사무부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(35, '마케팅');

INSERT INTO employee(LastName, DepartmentID) VALUES('Rafferty', 31);
INSERT INTO employee(LastName, DepartmentID) VALUES('Jones', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Steinberg', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Robinson', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('Smith', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('John', NULL);

 

DEPARTMENT 테이블

 

 

EMPLOYEE 테이블

 

 

우선 위와 같이 두 개의 테이블이 존재한다고 가정해 보겠습니다. 둘 다 공통적으로는 DEPARTMENTID를 갖고 있습니다. 

 

 

 


 

 

그럼 (LEFT 또는 RIGHT) OUTER JOIN의 관념을 바로 설명해 드리겠습니다. 일단 위 두 개의 EMPLOYEE  , DEPARTMENT 테이블을 LEFT OUTER JOIN으로 붙였다고 가정해 봅시다. 이런 경우에, 기본적으로 '왼쪽'의 테이블인 EMPLOYEE를 먼저 전체적으로 출력하고, 오른쪽에는 조건에 해당하는 DEPARTMENT의 테이블을 나열하게 됩니다. 만일 왼쪽 테이블의 조건과 매칭되지 않는 경우에는? 오른쪽에는 NULL을 그냥 표시하고 비워두게 됩니다. 

 

아래의 쿼리를 보겠습니다. 

 

select * 
from employee e
left outer join department d
on e.departmentid = d.departmentid ;

 

기본적으로 EMPLOYEE 테이블을 호출하면서 LEFT OUTER JOIN을 통해 DEPARTMENT 테이블을 조인했습니다. 그리고 두 개의 테이블에서 DEPARTMENTID가 동일한 것을 출력하도록 조건을 지정했습니다. 결과는 아래와 같습니다. 

 

 

위에서 설명했다시피, 일단 EMPLOYEE 테이블은 기본적으로 모두 출력이 됩니다. 그리고 LEFT OUTER JOIN으로 매칭한 DEPARTMENT 테이블에서 EMPLOYEE 테이블에서의 DEPARTMENTID가 일치하는 값들이 매칭되어 표시되었습니다. EMPLOYEE 중 John의 경우 DEPARTMENTID가 NULL인데, 이 경우에는 그냥 NULL로 표시되었습니다. 

 

굳이 그림으로 비유하면 아래 다이어그램과 비슷합니다. 

 

 

위의 경우에는, 수백 명의 정보가 담긴 EMPLOYEE 테이블이 있는 상황에서, DEPARTMENTID만을 통해 해당 인물들이 어떤 부서에 소속되었는지 이름을 출력할 때 사용할 수 있겠죠? 

 

참고로 여기서 ISNULL 조건을 사용한다면, 아래와 같이 매칭되는 값이 없는 사람만 찾는 것도 가능합니다. 

 

select * 
from employee e
left outer join department d
on e.departmentid = d.departmentid
where d.departmentid isnull;

 

 

 

RIGHT OUTER JOIN 역시 기준점만 좌측/우측으로 변동할 뿐, 원리는 동일합니다. 위에서 적용한 쿼리를 RIGHT로만 바꾸어 적용해 보면 다음과 같습니다. 두 개의 테이블을 매칭하되, 오른쪽에 있는 DEPARTMENT 테이블을 기준으로 매칭하게 됩니다. 

 

select * 
from employee e
right outer join department d
on e.departmentid = d.departmentid

 

 

 

 

 

정리해보면 LEFT/RIGHT OUTER JOIN은 결국 

 

- 두 개의 테이블을 붙여 매칭한다.

- LEFT 혹은 RIGHT로 지정된 기준 테이블은 모두 출력하고

- 여기에 매칭된 보조 테이블은, 조건에 해당하여 매칭되는 값들만 출력한다.

 

가 되겠습니다.