Quick Comparison
JOIN은 column 방향 관계 결합, UNION 계열은 row 방향 결과 결합입니다.
| 연산 | 결과 |
|---|---|
| INNER JOIN | 양쪽 조건이 맞는 row만 결합 |
| LEFT JOIN | 왼쪽 row를 유지하고 오른쪽이 없으면 NULL |
| CROSS JOIN | 모든 조합 |
| UNION | compatible한 두 결과를 합치고 중복 제거 |
| UNION ALL | compatible한 두 결과를 중복 포함해 연결 |
Outer Join 조건
LEFT JOIN에서 오른쪽 table 조건을 WHERE에 두면 NULL row가 제거되어 의도치 않게 INNER JOIN처럼 동작할 수 있습니다. 오른쪽 일치 조건인지 전체 결과 filter인지 구분해 ON과 WHERE에 배치합니다.
sql
SELECT p.id, i.item_id
FROM players AS p
LEFT JOIN items AS i
ON i.player_id = p.id
AND i.active = true;중복 처리
UNION은 중복 제거 비용이 추가될 수 있습니다. 중복을 유지해도 되는 log나 shard 결과 결합에는 UNION ALL이 더 직접적입니다. 중복의 정의는 선택한 모든 column 값 기준입니다.
자주 틀리는 점
- JOIN 뒤 row 수가 원본보다 늘 수 있습니다. 일대다 관계를 확인합니다.
- NULL은 equality 비교가 true가 아니므로 별도 조건이 필요합니다.
SELECT DISTINCT로 잘못된 join 중복을 가리지 않습니다.- 결과 순서는
ORDER BY없이는 보장되지 않습니다.
참고 링크
2 sources