본문 바로가기

study/java

[Oracle] OUTER JOIN 사용 방법과 차이점 (LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)

OUTER(외부) JOIN 이란 조인 조건에서 동일한 값이 없는 행도 반환할 때 사용하는 구문이다.
즉 A, B 테이블을 JOIN 할 경우, 조건에 맞지 않는 데이터도 표시하고 싶을 때 OUTER JOIN을 사용한다.

 

오늘은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN을 살펴볼 것이다 !!

 

LEFT / RIGHT / OUTER JOIN 맛보기

 

 

 

OUTER JOIN은 조인 USING, ON 조건절을 필수적으로 사용해야 한다.

 

LEFT OUTER JOIN과 RIGHT OUTER JOIN은 기준이 되는 테이블이 조인 수행 시 무조건 드라이빙 테이블(첫번째로 ACCESS 되는 테이블)이 된다.

 

또한, 드라이빙 테이블이 어떤 테이블이냐에 따라 쿼리 성능이나 튜닝 부분에서 굉장히 중요한 영향을 끼치기 때문에 데이터 양보다는 무조건 적은 데이터를 추출하는 테이블을 드라이빙 테이블로 잡는 것이 중요하다. 

 

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다"

추천인 코드 : AF8800551

 

 

사용 방법

SELECT *                              -- 조회할 컬럼을 선택한다 (모든 컬럼 조회)
  FROM TABLE1  T1                             
  LEFT/RIGHT/FULL OUTER JOIN TABLE2  T2               
  ON (T1.KEY = T2.KEY)                -- 두 테이블을 연결할 조건을 명시한다

 

USING 조건절을 사용하는 경우는 조인하는 테이블 내에 있는 컬럼들이 동일한 이름을 가지고 있을 때 사용 가능하다.

SELECT *                     -- 조회할 컬럼을 선택한다 (모든 컬럼 조회)
  FROM TABLE1  T1                             
  LEFT/RIGHT/FULL OUTER JOIN TABLE2  T2                
  USING (KEY)                -- 두 테이블이 동일하게 갖고 있는 컬럼명으로 조건을 명시한다

예제

아래와 같이 KEY 컬럼이 TIMESTAMP NUM인 같은 구조의 테이블 A와 B가 있다.

 

 

 

LEFT JOIN (LEFT OUTER JOIN)

A 테이블에 LEFT OUTER JOIN B를 하는 경우

 

A,B 테이블의 조인 조건이 맞는 경우 B 테이블의 컬럼에서 해당 데이터를 가져오고, 조인 조건이 맞지 않는 경우 각 테이블의 레코드 중 A 테이블의 레코드는 무조건 결과값에 포함되어 나오고 B테이블에서 가져온 컬럼들은 NULL로 채운다.

SELECT A.TIMESTAMP
     , A.NUM
     , A.VERSION
     , A.MSG_ID
     , A.GRADE
     , B.TIMESTAMP
     , B.NUM
     , B.VERSION
     , B.MSG_ID
     , B.GRADE 
  FROM A
  LEFT JOIN B ON(B.TIMESTAMP = A.TIMESTAMP AND B.NUM = A.NUM)

 

키 값인 TIMESTAMP와 VIN이 매칭되는 데이터를 함께 보여주고 있지만, 왼쪽 테이블(A)를 기준으로 매칭되지 않는 데이터까지 보여주고 있다.

 

 

 RIGHT JOIN (RIGHT OUTER JOIN)

LEFT JOIN과 반대로 우측 테이블, 즉 테이블 B가 기준이 되어 결과를 보여준다.

SELECT A.TIMESTAMP
     , A.NUM
     , A.VERSION
     , A.MSG_ID
     , A.GRADE
     , B.TIMESTAMP
     , B.NUM
     , B.VERSION
     , B.MSG_ID
     , B.GRADE 
  FROM A
  RIGHT JOIN B ON(B.TIMESTAMP = A.TIMESTAMP AND B.NUM = A.NUM)

키 값인 TIMESTAMP와 VIN이 매칭되는 데이터를 함께 보여주고 있지만, 오른쪽 테이블(B)를 기준으로 매칭되지 않는 데이터까지 보여주고 있다.

 

 

 FULL OUTER JOIN

좌측테이블 A와 우측 테이블 B의 데이터를 모두 읽어 중복된 데이터는 삭제한 JOIN 결과를 보여준다. 

SELECT A.TIMESTAMP
     , A.NUM
     , A.VERSION
     , A.MSG_ID
     , A.GRADE
     , B.TIMESTAMP
     , B.NUM
     , B.VERSION
     , B.MSG_ID
     , B.GRADE 
  FROM A
  FULL OUTER JOIN B ON(B.TIMESTAMP = A.TIMESTAMP AND B.NUM = A.NUM)

 

 

키 값인 TIMESTAMP와 VIN이 매칭되는 데이터를 함께 보여주고 있고, 두 테이블 A와 B에서 매칭되지 않는 데이터도 함께 보여주고 있다.

 

 

 

 

 

만약 조인 조건으로 매칭되는 데이터만 보고 싶다면 INNER JOIN을 사용하면 된다.

자세한 내용은 아래 링크를 참고하자.

 

Link : https://haenny.tistory.com/35

 

[Oracle] INNER JOIN이란? 사용방법도 함께 알아보자

[Oracle] INNER JOIN이란? 사용방법도 함께 알아보자 INNER(내부) JOIN 이란, 두 테이블간 조인 조건을 만족하는 행을 반환할 때 사용하는 구문이다. 쉽게 조인하려는 두 테이블의 교집합이라고 생각하면 될 듯 하.....

haenny.tistory.com

 

 

FULL OUTER JOIN 의 같은 예제로 USING 사용 예시

SELECT A.TIMESTAMP
     , A.NUM
     , A.VERSION
     , A.MSG_ID
     , A.GRADE
     , B.TIMESTAMP
     , B.NUM
     , B.VERSION
     , B.MSG_ID
     , B.GRADE 
  FROM A
  FULL OUTER JOIN B USING (TIMESTAMP ,NUM)

 

단, USING 구문은 MS SQL Server와 Sybase에서는 지원하지 않는다고하니 참고하자.

 

 

https://haenny.tistory.com/34  에서 퍼옴 정리 잘됨