[SQL] RIGHT (OUTER) JOIN

FinDer178·2025년 5월 27일
0

SQL

목록 보기
3/5

RIGHT (OUTER) JOIN 절 개념

RIGHT JOIN 도 이전에 배운 INNER JOINLEFT JOIN 과 마찬가지로 SELECT 문의 optional 절이다.

단지 LEFT JOIN 과 차이가 있다면, RIGHT JOIN 은 오른쪽 테이블에 있는 모든 행들을 리턴하고, 왼쪽 테이블에 있는 매칭되는 행들을 리턴 한다는 점이다.

문법은 다음과 같다.

SELECT COLUMN_LIST
FROM X RIGHT JOIN Y ON X.ID = Y.ID;

RIGHT JOIN 말고도 RIGHT OUTER JOIN으로 표현해도 된다. 여기서는 표기의 편리함을 위해 RIGHT JOIN으로 표시하고자 한다.

SELECT COLUMN_LIST
FROM X RIGHT OUTER JOIN Y ON X.ID = Y.ID;

RIGHT JOIN절 동작 원리

두 테이블 XY 가 있다고 하자. 그리고 RIGHT JOIN 을 이용해서 두 테이블에 있는 행들을 하나로 병합할려고 한다.

위와 같이 X 테이블에는 2개의 컬럼인 id (키)와 x 가 있다고 하자. 그리고 Y 테이블에는 id (키)와 y 가 있다고 하자.

RIGHT JOIN을 통해서 오른쪽 테이블인 Y 테이블에 있는 모든 행들과 왼쪽 테이블 Y 에서 매칭되는 행들을 반환한다. 만약, 오른쪽 테이블의 행이 왼쪽 테이블 X 에 있는 행과 매칭되는게 없다면, 왼쪽 테이블 X 의 컬럼들에 대해 NULL 값을 사용한다.

정말 말 그대로 LEFT JOIN의 반대라고 생각하면 된다. 그리고 이를 벤 다이어그램으로 표현하면 테이블 Y 전체를 표현하는 것과 같다. 모습은 아래와 같다.

RIGHT JOIN 쿼리 예시

지난 번과 마찬가지로 ORDER 테이블과 EMPLOYEES 테이블을 사용할 것이다. 각 테이블들의 연관관계는 다음과 같다.

판매 사원이 최소 1개에서 많게는 여러 개의 판매 주문을 담당할 수 있다는 것을 가정해보자. 하지만, 몇몇 주문들은 판매 사원의 담당이 아닐 수가 있다.

이를 쿼리로 표현하면 다음과 같다.

SELECT FIRST_NAME, LAST_NAME, ORDER_ID, STATUS 
FROM ORDERS RIGHT JOIN EMPLOYEES ON EMPLOYEE_ID = SALESMAN_ID
WHERE JOB_TITLE = 'Sales Representative'
ORDER BY FIRST_NAME, LAST_NAME;

해당 쿼리를 실행하면 결과는 다음과 같이 나온다.

여기서 주목해야 될 점은, 단 하나의 판매 주문을 담당하지 않는 판매 사원에 대해서는 ORDER_IDSTATUS 컬럼들에 대해 NULL 값을 채운다는 것이다.

USING 절을 이용한 RIGHT OUTER JOIN 표현

USING 절을 이용해서 INNER JOIN, LEFT JOIN을 배웠을 때와 마찬가지로 RIGHT OUTER JOIN을 표현할 수 있다. 문법은 다음과 같고 아래 쿼리를 실행하면 다음과 같다.

SELECT COLUMN_LIST
FROM X RIGHT JOIN Y USING(ID);

고객이 판매 주문 정보를 가지지 않는다면, ORDER_IDSTATUS 칼럼이 NULL 값으로 채워져 있는 것을 알 수 있다.

즉, RIGHT JOIN 을 사용해서 오른쪽 테이블에 있는 모든 행들과 왼쪽 테이블에 이와 매칭되는 행들을 포함시킬 수 있다.

참고

Oracle RIGHT OUTER JOIN Clause

profile
낙관적 개발자

0개의 댓글