[SQL] JOIN 문법 정리 (INNER, OUTER, CROSS, SELF JOIN)

khj·2025년 12월 28일

SQL

목록 보기
2/6
post-thumbnail

DB를 다루는 대부분의 서비스 로직에서 JOIN은 필수다.
특히 MSSQL을 사용하는 환경에서는 JOIN 문법을 정확히 이해하지 못하면
쿼리 성능 저하나 의도하지 않은 결과를 만들기 쉽다.


예제 테이블 구조

아래 테이블을 기준으로 설명한다.

Member

member_idname
1Alice
2Bob

Orders

order_idmember_idprice
101110000
102120000
103315000

INNER JOIN

개념

  • 양쪽 테이블에 모두 존재하는 데이터만 조회
  • 가장 많이 사용되는 JOIN

문법

SELECT *
FROM Member m
INNER JOIN Orders o
  ON m.member_id = o.member_id;

결과

  • member_id = 1 인 데이터만 조회
  • Bob(2)은 주문이 없으므로 제외
  • Orders의 member_id = 3은 Member에 없으므로 제외

📌 JOIN만 써도 MSSQL에서는 INNER JOIN으로 동작한다.

SELECT *
FROM Member m
JOIN Orders o
  ON m.member_id = o.member_id;

LEFT OUTER JOIN

개념

  • 왼쪽 테이블 기준으로 모두 조회
  • 오른쪽 테이블에 매칭 데이터가 없으면 NULL

문법

SELECT *
FROM Member m
LEFT JOIN Orders o
  ON m.member_id = o.member_id;

결과

  • Alice → 주문 2건
  • Bob → 주문 없음 (Orders 컬럼은 NULL)

📌 회원 목록을 기준으로 주문 정보를 조회할 때 자주 사용


RIGHT OUTER JOIN

개념

  • 오른쪽 테이블 기준으로 모두 조회
  • 왼쪽 테이블에 매칭 데이터가 없으면 NULL

문법

SELECT *
FROM Member m
RIGHT JOIN Orders o
  ON m.member_id = o.member_id;

결과

  • member_id = 3 주문도 조회됨
  • Member 컬럼은 NULL

📌 실무에서는 보통 LEFT JOIN으로 방향을 바꿔서 사용함


FULL OUTER JOIN

개념

  • 양쪽 테이블의 모든 데이터 조회
  • 매칭 안 되는 부분은 NULL

문법

SELECT *
FROM Member m
FULL OUTER JOIN Orders o
  ON m.member_id = o.member_id;

결과

  • Alice 주문 데이터
  • Bob (주문 없음)
  • member_id = 3 주문 데이터

📌 데이터 정합성 검증, 누락 데이터 확인 시 유용


CROSS JOIN

개념

  • 모든 경우의 수 조합 (카테시안 곱)
  • ON 조건 없음

문법

SELECT *
FROM Member m
CROSS JOIN Orders o;

결과

  • Member 2건 × Orders 3건 = 6건

📌 주의사항

  • 데이터 많으면 폭발적으로 증가
  • 테스트 데이터 생성, 기준 데이터 조합에만 사용

SELF JOIN

개념

  • 같은 테이블을 자기 자신과 JOIN
  • 계층 구조 표현에 자주 사용
emp_idnamemanager_id
1CEONULL
2Dev11
3Dev21

문법

SELECT e.name AS employee,
       m.name AS manager
FROM Employee e
LEFT JOIN Employee m
  ON e.manager_id = m.emp_id;

📌 테이블 별칭(alias)은 필수


JOIN 조건 위치 주의사항

ON vs WHERE 차이

-- LEFT JOIN 유지됨
SELECT *
FROM Member m
LEFT JOIN Orders o
  ON m.member_id = o.member_id
 AND o.price >= 15000;
 
-- 사실상 INNER JOIN처럼 동작
SELECT *
FROM Member m
LEFT JOIN Orders o
  ON m.member_id = o.member_id
WHERE o.price >= 15000;

📌 LEFT JOIN에서 조건은 ON 절에 작성해야 의미가 유지됨

다중 JOIN 예제

SELECT m.name, o.order_id, o.price
FROM Member m
LEFT JOIN Orders o
  ON m.member_id = o.member_id
LEFT JOIN Payment p
  ON o.order_id = p.order_id;

📌 JOIN 순서보다 기준 테이블이 중요


정리

  • INNER JOIN : 공통 데이터만
  • LEFT JOIN : 왼쪽 기준
  • RIGHT JOIN : 오른쪽 기준
  • FULL OUTER JOIN : 전체
  • CROSS JOIN : 모든 조합
  • SELF JOIN : 자기 자신과 JOIN
profile
Spring, Django 개발 블로그

0개의 댓글