RIGHT OUTER JOIN은 오른쪽 테이블의 모든 행을 결과에 포함시킨다. LEFT OUTER JOIN과 방향만 반대다. 왼쪽에 매칭되는 행이 없으면 왼쪽 컬럼은 NULL로 채운다.
동작 원리
피드 목록을 조회하는데, 작성자(User)가 없는 피드도 포함시켜야 하는 상황이다.
SELECT u.*, f.*
FROM user u
RIGHT OUTER JOIN feed f ON u.id = f.author_id
feed 기준으로 전체를 보여준다. feed.author_id에 대응하는 User가 없으면 user 컬럼이 NULL로 채워진다.
다이어그램 추가 예정
여기에 RIGHT JOIN의 집합 관계(오른쪽 전체 + 교집합)를 보여주는 다이어그램 필요.
LEFT JOIN으로 대체 가능
RIGHT JOIN은 테이블 순서를 바꾸면 LEFT JOIN과 동일한 결과가 나온다.
-- RIGHT JOIN
SELECT u.*, f.*
FROM user u
RIGHT OUTER JOIN feed f ON u.id = f.author_id
-- 위와 동일한 결과
SELECT u.*, f.*
FROM feed f
LEFT OUTER JOIN user u ON f.author_id = u.id
테이블 순서를 feed를 왼쪽으로 바꾸고 LEFT JOIN을 쓰면 같다. 이 때문에 실무에서는 RIGHT JOIN을 거의 쓰지 않는다. LEFT JOIN으로 통일하면 쿼리를 읽을 때 기준 테이블이 항상 왼쪽이라 가독성이 좋다.
JPA에서의 RIGHT JOIN
JPQL도 RIGHT JOIN을 지원한다.
@Query("SELECT f FROM Feed f RIGHT JOIN f.author a")
List<Feed> findAllRightJoined();
하지만 위에서 설명한 이유로 실무에서는 테이블 순서를 바꾸고 LEFT JOIN으로 쓰는 게 일반적이다.
RIGHT JOIN보다 LEFT JOIN 권장
팀 코드에서 LEFT JOIN으로 통일하면 "왼쪽이 기준"이라는 일관된 읽기 방식이 만들어진다. RIGHT JOIN을 섞으면 기준 테이블을 파악하는 데 인지 비용이 올라간다.
자주 하는 실수
RIGHT JOIN과 LEFT JOIN을 혼용
같은 팀 코드에서 RIGHT JOIN과 LEFT JOIN을 섞어 쓰면 가독성이 떨어진다. 기준 테이블이 왼쪽인지 오른쪽인지 매번 확인해야 하기 때문이다. LEFT JOIN으로 통일하는 것이 관례다.