본문 바로가기

SQL

외부 조인) LEFT JOIN, RIGHT JOIN, FULL JOIN 차이 알아보기

OUTER JOIN은 외부 조인으로 기준이 되는 테이블이 조인 수행 시 드라이빙 테이블이 됩니다. 드라이빙 테이블이란 JOIN문을 실행했을 때 첫번째로 ACCESS되는 테이블을 의미합니다. 쿼리 수행 시 OUTER는 생략해도 무방합니다.

 

 

말로만 하면 헷갈릴 수 있기 때문에 실제 예시를 갖고 설명해보겠습니다. 위 테이블은 JOIN에 사용될 테이블입니다. EMP테이블의 기본키는 A컬럼, DEPT테이블의 기본키는 C컬럼이며 EMP테이블의 C컬럼은 DEPT테이블을 참조로 하는 외래키입니다.

 

 

LEFT JOIN

왼쪽 테이블을 기준으로 A, B 테이블을 비교해서 B테이블에서 조인 조건에 해당하는 값이 있다면 그 값을 가져오고 값이 없다면 NULL값을 가져옵니다. 즉, WHERE절로 조회 조건을 제한하지 않는 이상 왼쪽 테이블의 값은 모두 출력되는 것입니다.

 

SELECT *
 FROM EMP A
 LEFT JOIN DEPT B
 		ON A.C = B.C;

EMP 테이블을 기준으로 JOIN문이 수행됩니다. C=y인 경우는 DEPT 테이블에 없기 때문에 해당 열의 D,E컬럼은 NULL값으로 출력됩니다.

 

 

RIGHT JOIN

RIGHT JOIN은 반대로 우측 테이블을 기준으로 조인을 수행하기 때문에 우측 테이블의 값은 모두 출력됩니다.

 

DEPT테이블을 기준으로 JOIN하는데 C=w인 값이 EMP테이블에 2개가 있기 때문에 두 값이 모두 출력됩니다. C=z, C=v인 값은 EMP테이블에 없기 때문에 A,B 컬럼은 NULL로 출력됩니다.

 

 

FULL JOIN

마지막으로 FULL JOIN은 양쪽 테이블 모두가 기준이 됩니다. LEFT JOIN과 RIGHT JOIN의 결과를 합집합으로 처리한 결과와 동일합니다. 단, UNION ALL이 아닌 UNION 기능과 같기 때문에 중복 데이터는 삭제합니다.

 

 

추가로 FULL JOIN과 동일한 결과값을 가져오는 쿼리는 아래와 같습니다.

 

--1. UNION 사용
SELECT A.*, B.*
 FROM EMP A
 LEFT JOIN DEPT B
 		ON A.C = B.C
UNION
SELECT A.*, B.*
 FROM EMP A
 RIGHT JOIN DEPT B
 		ON A.C = B.C
        
--2. UNION ALL과 NOT EXISTS조건 사용
SELECT A.*, B.*
 FROM EMP A
 WHERE A.C = B.C
UNION ALL
SELECT A.*, NULL
 FROM EMP A
 WHERE NOT EXISTS (SELECT 1 FROM DEPT B WHERE A.C = B.C)
UNION ALL
SELECT NULL, B.*
 FROM DEPT B
 WHERE NOT EXISTS (SELECT 1 FROM EMP A WHERE B.C = A.C)