[MySQL, Oracle] LEFT JOIN과 비교하기 (LEFT OUTER JOIN, RIGHT JOIN, INNER JOIN, COMMA JOIN, CROSS JOIN)

이도형·2025년 12월 31일

쿼리 튜닝🔧

목록 보기
2/4

LEFT JOIN

왼쪽 테이블을 기준으로 오른쪽 테이블을 결합하는 방식, 결합할 데이터가 없으면 NULL 처리.

SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
 FROM USER u 
 LEFT JOIN CODE c
   ON u.CODE_SEQ = c.CODE_SEQ;

RIGHT JOIN

RIGHT JOIN 특징

  • 오른쪽 테이블을 기준으로 왼쪽 테이블을 결합하는 방식, 결합할 데이터가 없으면 NULL 처리.

예시

-- 위 LEFT JOIN과 같은 결과 출력
SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
  FROM CODE c 
 RIGHT JOIN USER u
    ON c.CODE_SEQ = u.CODE_SEQ;

RIGHT JOIN (vs. LEFT JOIN)

보통 왼쪽에서 오른쪽으로 읽는 습관이 있어서 RIGHT JOIN 보다는,
LEFT JOIN을 압도적으로 많이 사용

결과는 완벽하게 동일

LEFT OUTER JOIN

LEFT OUTER JOIN 특징

  • OUTER는 문법적인 명확성을 위해 존재하는 특징으로, LEFT JOINLEFT OUTER JOIN의 차이는 없음

예시

-- 위 LEFT JOIN과 같은 결과 출력
SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
 FROM USER u 
 LEFT OUTER JOIN CODE c
   ON u.CODE_SEQ = c.CODE_SEQ;

LEFT OUTER JOIN (vs. LEFT JOIN)

LEFT OUTER JOIN은
매칭되지 않는 데이터도 포함이라는 의미를 명시적으로 강조

LEFT JOIN = LEFT OUTER JOIN

LEFT INNER JOIN (= JOIN)

LEFT INNER JOIN 특징

  • 두 테이블에서 조인 조건을 만족하는 교집합만 결과에 포함

예시

SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
  FROM USER u
 INNER JOIN CODE c
    ON u.CODE_SEQ = c.CODE_SEQ;

JOIN

JOIN 역시 교집합을 표시해주고, INNER JOIN과 같은 결과를 보여줌

-- 위 INNER JOIN과 같은 결과 출력
SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
  FROM USER u 
  JOIN CODE c
    ON u.CODE_SEQ = c.CODE_SEQ;

LEFT INNER JOIN (vs. LEFT JOIN)

데이터 처리량

  • JOIN (INNER) : 양쪽 테이블에 모두 데이터가 있는 경우 찾으므로, 계산 제외(Pruning)할 수 있으며, 결과 집합(Result Set)이 작음
  • LEFT JOIN : 왼쪽 테이블 전체 행을 유지하며 NULL 채우기 작업이 추가됨

인덱스 및 최적화

  • *JOIN (INNER) : DBMS 옵티마이저가 더 효과적인 조인 순서 (Nested Loop, Hash Join 등..)을 선택해, 불필요한 행을 조기에 필터링
  • LEFT JOIN : 전체 스캔을 보장해야 하므로 풀 테이블 스캔 위험이 높음

종합

구분JOIN (INNER JOIN)LEFT JOIN
결과 범위매칭 행만 (교집합)왼쪽 테이블 전체 + 매칭/NULL
매칭 실패행 제외오른쪽 NULL로 채움
성능상대적으로 빠름느릴 수 있음

단, 인덱스(Index)가 잘 설정되어 있다면 성능 차이가 미미해질 수 있음.

COMMA JOIN

FROM 절에 테이블들을 쉼표(,)로 나열하는 방식으로, JOIN 조건은 WHERE절에서 처리

COMMA JOIN 특징

  • JOIN 키워드를 직접 쓰지 않음

예시

-- 위 INNER JOIN과 같은 결과 출력
SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
  FROM USER u
     , CODE c
 WHERE u.CODE_SEQ = c.CODE_SEQ;

COMMA JOIN (vs. INNER JOIN)

INNER JOINWHERE에서 조건을 정의하므로, COMMA JOIN에 비해 오류 발생 가능성이 높다

구분INNER JOINCOMMA JOIN
문법ON 절 명시적WHERE 절 조건 (구식)
우선순위높음 (LEFT JOIN 등과 혼용 안전)낮음 (오류 발생 가능)
가독성높음 (JOIN 조건 명확)낮음 (복잡 쿼리에서 혼란)
표준현재 권장 표준과거 방식 (지양)

COMMA JOIN에서 조건이 없으면 카티션 곱 (Cartesian Product)이 발생하여 많은 양의 데이터가 출력될 수 있음

CROSS JOIN

두 테이블의 모든 행을 조합해 카티션 곱을 생성

CROSS JOIN의 특징

  • JOIN 조건 없이 모든 가능한 행 쌍을 반환
  • ON절이 없음 (JOIN 조건이 없음)
  • 모든 경우의 수 생성 시 사용

예시

SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
  FROM USER u
 CROSS JOIN CODE c

CROSS JOIN (vs. LEFT JOIN)

구분CROSS JOINLEFT JOIN
핵심 키워드모든 조합 (카티션 곱)기존 테이블 보존
조인 조건 (ON)없음필수
결과 행(A 테이블 행 수) ×\times (B 테이블 행 수)최소 (A 테이블 행 수) 이상
NULL 발생발생하지 않음오른쪽 테이블 매칭 안 될 시 발생
성능대용량 시 폭발적 증가조건 최적화 가능

이어서

지금까지 내가 실전에서 활용해본 JOIN만 리마인드차 정리해보았다.
이어서는 FULL OUTER JOIN, SELF JOIN 그 외 ANTI JOIN, SEMI JOIN등을 학습할 것이다.

profile
열심히 살고 싶습니다! 일하고 싶습니다 :)

0개의 댓글