핵심 요약
JOIN은 두 테이블을 특정 조건으로 이어 붙이는 것이다. 핵심은 "짝이 없는 행을 어떻게 처리하느냐"다. INNER JOIN은 양쪽에 짝이 있는 행만(교집합), LEFT JOIN은 왼쪽 테이블은 전부 남기고 짝 없으면 NULL로 채운다. 이 차이를 모르면 데이터가 조용히 누락된다.
1. 종류별 동작
| JOIN | 결과 |
|---|---|
| INNER | 양쪽 모두 짝이 있는 행만 |
| LEFT | 왼쪽 전부 + 오른쪽은 짝 있으면, 없으면 NULL |
| RIGHT | 오른쪽 전부 + 왼쪽은 있으면, 없으면 NULL |
| FULL OUTER | 양쪽 전부, 짝 없으면 NULL |
2. 예시로 보기
-- 주문한 적 있는 사용자만 (짝 있는 것만)
SELECT u.name, o.id
FROM users u
INNER JOIN orders o ON o.user_id = u.id;
-- 모든 사용자 + 주문(없으면 NULL)
SELECT u.name, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
"주문이 한 번도 없는 사용자도 보고 싶다"면 LEFT, "주문한 사용자만"이면 INNER다.
3. 자주 쓰는 패턴 — "없는 것" 찾기
-- 주문이 하나도 없는 사용자
SELECT u.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL; -- 짝이 없어 NULL인 행
4. 흔한 함정
- LEFT JOIN인데 WHERE에서 오른쪽 컬럼 조건 —
WHERE o.status = 'paid'를 걸면 NULL 행이 걸러져 사실상 INNER가 된다. 이 조건은ON에 넣어야 LEFT가 유지된다. - 일대다 JOIN에서 행 수 증가 — 한 사용자에 주문이 3개면 그 사용자가 3행으로 나온다. 집계 시 중복 주의.
- RIGHT JOIN은 거의 안 쓴다 — 테이블 순서를 바꿔 LEFT로 쓰는 게 읽기 쉽다.
자주 묻는 질문
INNER와 LEFT 중 뭘 기본으로 써야 하나요?
"짝이 반드시 있어야 의미 있는" 관계면 INNER, "왼쪽 데이터는 다 보여줘야 하는데 부가 정보만 붙이는" 경우면 LEFT입니다. 의도가 헷갈릴 땐 결과 행 수를 확인해 누락이 없는지 검증하세요.
LEFT JOIN 조건을 ON과 WHERE 중 어디에 넣나요?
오른쪽 테이블을 거르는 조건은 ON에 넣어야 합니다. WHERE에 넣으면 짝 없는(NULL) 행이 제거돼 LEFT가 INNER처럼 동작합니다. 왼쪽 테이블 필터는 WHERE에 넣어도 됩니다.
JOIN이 느린데 어떻게 하나요?
JOIN 조건에 쓰이는 컬럼(주로 외래키)에 인덱스가 있는지 먼저 확인하세요. 인덱스가 없으면 조인마다 풀스캔이 일어납니다. EXPLAIN으로 실행 계획을 보고 인덱스를 타는지 점검하는 게 첫 단계입니다.

댓글 0