JOIN입문
LEFT OUTER JOIN
왼쪽 테이블의 모든 행을 유지하면서 오른쪽 테이블을 연결
정의
왼쪽(먼저 쓴) 테이블의 모든 행은 결과에 다 포함시키고, 오른쪽 테이블에서 매칭되는 게 없으면 NULL로 채운다. 예를 들어 고객 LEFT JOIN 주문이라고 하면, 주문을 한 번도 안 한 고객도 결과에 나오고 그 고객의 주문 정보 자리는 NULL로 비어있다. OUTER는 생략 가능. RIGHT JOIN은 방향만 다르므로 보통 LEFT JOIN으로 통일해서 쓴다.
왜 중요한가?
"매칭이 없어도 기준 테이블 행은 보여주고 싶을 때" 쓴다. 주문 안 한 고객도 보고 싶거나, 강의를 안 들은 학생도 명단에 넣고 싶을 때 필수. 흔한 실수는 WHERE 절에 오른쪽 테이블 조건을 거는 것 — 이렇게 하면 NULL 행이 다 제거되어 결국 INNER JOIN과 같아진다.
틀리기 쉬운 포인트
- !LEFT JOIN 후 WHERE에서 오른쪽 테이블 컬럼을 조건으로 걸면 NULL 행이 제거되어 INNER JOIN과 같아집니다. 오른쪽 테이블 조건은 ON 절에 넣어야 LEFT JOIN 효과가 유지됩니다.
- !LEFT JOIN과 RIGHT JOIN은 테이블 순서만 다릅니다. A LEFT JOIN B는 B RIGHT JOIN A와 동일합니다. 실무에서는 LEFT JOIN만 사용하는 것이 가독성에 좋습니다.
- !LEFT JOIN 결과에서 오른쪽 테이블 컬럼은 NULL일 수 있습니다. 이 NULL을 처리하지 않으면 계산이나 표시에서 문제가 생깁니다. COALESCE를 활용하세요.
예시
SELECT c.name, o.order_id FROM customers c LEFT JOIN orders o ON c.id = o.customer_id AND o.status = 'PAID';
성능 포인트
!LEFT JOIN은 NULL 처리 비용이 추가되고, 옵티마이저의 조인 순서 변경이 INNER JOIN보다 제한적이다. 가능하면 INNER JOIN을 우선 검토하라.