SQL과 데이터베이스 - 조인과 집계 데이터 : FULL OUTER JOIN
  카테고리 : SQL >> Sqlgrammar 
   
FULL OUTER JOIN
이 학습은 패스트캠퍼스의 올인원 패키지 : 모두를 위한 SQL/DB 강의를 듣고 복습하는 내용입니다.

: 두 테이블 간 출력가능한 모든 데이터를 포함한 집합을 출력한다.
(INNER 조인, LEFT OUTER 조인, RIGHT OUTER 조인 모두 포함).
FULL OUTER 조인 실습
● 기본 실습
: 아래그림과 같이 만들었던 BASKET_A, BASKET_B 테이블 이용


SELECT
	  A.ID ID_A,
	  A.FRUIT FRUIT_A,
	  B.ID ID_B,
	  B.FRUIT FRUIT_B
FROM  BASKET_A A
FULL OUTER JOIN BASKET_B B 
ON A.FRUIT = B.FRUIT;

-> 모든 집합이 출력되었다.

● ONLY OUTER 조인
SELECT
	  A.ID ID_A,
	  A.FRUIT FRUIT_A,
	  B.ID ID_B,
	  B.FRUIT FRUIT_B
FROM  BASKET_A A
FULL OUTER JOIN BASKET_B B 
ON A.FRUIT = B.FRUIT
WHERE A.ID IS NULL          -- right outer
   OR B.ID IS NULL;         -- left outer

-> FULL OUTER JOIN에서 A.ID가 NULL 혹은 B.ID가 널인 값들만 추출한다.

추가 실습
● 테이블 생성
CREATE TABLE
IF NOT EXISTS DEPARTMENTS 
(
  DEPARTMENT_ID SERIAL PRIMARY KEY
, DEPARTMENT_NAME VARCHAR (255) NOT NULL
);
CREATE TABLE
IF NOT EXISTS EMPLOYEES 
(
  EMPLOYEE_ID SERIAL PRIMARY KEY
, EMPLOYEE_NAME VARCHAR (255)
, DEPARTMENT_ID INTEGER
);
INSERT INTO DEPARTMENTS (DEPARTMENT_NAME)
VALUES
  ('Sales')
, ('Marketing')
, ('HR')
, ('IT')
, ('Production');
COMMIT;
INSERT INTO EMPLOYEES (
  EMPLOYEE_NAME
, DEPARTMENT_ID
)
VALUES
('Bette Nicholson', 1),
('Christian Gable', 1),
('Joe Swank', 2),
('Fred Costner', 3),
('Sandra Kilmer', 4),
('Julia Mcqueen', NULL);
COMMIT; 
SELECT * FROM DEPARTMENTS; 

SELECT  * FROM EMPLOYEES; 

● FULL OUTER 조인 실습
SELECT
       E.EMPLOYEE_NAME
     , D.DEPARTMENT_NAME
  FROM
      EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D 
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID;

-> 모든 집합이 출력되었다.
-> 소속된 부서가 없는 직원, 소속한 직원이 없는 부서 둘다 출력
● RIGHT ONLY
SELECT
       E.EMPLOYEE_NAME
     , D.DEPARTMENT_NAME
  FROM
      EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D 
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
WHERE E.EMPLOYEE_NAME IS NULL;  -- 소속된 직원이 없는 부서

-> 소속된 직원이 없는 부서만 출력
-> FULL OUTER JOIN을 RIGHT JOIN 으로 바꾸어도 같은 결과가 나온다.
● LEFT ONLY
SELECT
       E.EMPLOYEE_NAME
     , D.DEPARTMENT_NAME
  FROM
      EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D 
ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
WHERE D.DEPARTMENT_NAME IS NULL; -- 소속한 부서가 없는 직원

-> 소속한 부서가 없는 직원만 출력
-> FULL OUTER JOIN을 LEFT JOIN으로 바꾸어도 같은 결과가 나온다.
