DB를 다루는 대부분의 서비스 로직에서 JOIN은 필수다.
특히 MSSQL을 사용하는 환경에서는 JOIN 문법을 정확히 이해하지 못하면
쿼리 성능 저하나 의도하지 않은 결과를 만들기 쉽다.
예제 테이블 구조
아래 테이블을 기준으로 설명한다.
Member
Orders
| order_id | member_id | price |
|---|
| 101 | 1 | 10000 |
| 102 | 1 | 20000 |
| 103 | 3 | 15000 |
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_id | name | manager_id |
|---|
| 1 | CEO | NULL |
| 2 | Dev1 | 1 |
| 3 | Dev2 | 1 |
문법
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 차이
SELECT *
FROM Member m
LEFT JOIN Orders o
ON m.member_id = o.member_id
AND o.price >= 15000;
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