CROSS JOIN과 데카르트 곱
조합적 쌍을 만들 때 CROSS JOIN을 의도적으로 사용하고, 조인 키가 없어 우발적으로 데카르트 곱이 폭발하는 상황을 피합니다.
CROSS JOIN과 데카르트 곱은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
CROSS JOIN이란?
CROSS JOIN은 행의 모든 조합을 생성하며, 출력 행 수는 m × n개입니다. ON 절은 사용하지 않습니다.
SELECT * FROM a CROSS JOIN b;
-- Equivalent:
SELECT * FROM a, b; -- comma join, no condition우발적인 데카르트 곱
대표적인 버그는 JOIN 조건을 빠뜨려 A의 모든 행이 B의 모든 행과 짝을 이루게 되는 것입니다.
SELECT u.email, o.id
FROM users u, orders o; -- missing WHERE u.id = o.user_id !
-- m users × n orders rows — millions!의도한 사용 사례
실제로 모든 쌍을 원할 때 CROSS JOIN이 유용합니다.
- 빈 구간 보고서를 위한 범주 × 기간 조합
- 테스트 데이터: 모든 사용자 × 모든 제품
- 달력: 모든 매장 × 모든 날짜
달력 × 매장 예제
모든 매장에 대해 판매가 없는 날도 채워 넣습니다.
SELECT d.day, s.id, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(CURRENT_DATE - 30, CURRENT_DATE, '1 day') AS d(day)
CROSS JOIN stores s
LEFT JOIN orders o ON o.store_id = s.id
AND date_trunc('day', o.created_at) = d.day
GROUP BY d.day, s.id
ORDER BY d.day, s.id;데카르트 곱과 EXPLAIN
의도하지 않은 데카르트 곱은 EXPLAIN ANALYZE에서 매우 큰 행 수로 나타납니다.
EXPLAIN ANALYZE
SELECT u.email, o.id FROM users u, orders o;
-- Nested Loop (rows=10000000) ← warning signLATERAL: 조건부 CROSS JOIN
LATERAL JOIN은 오른쪽에서 왼쪽을 참조할 수 있는 CROSS JOIN과 비슷합니다. 다음 레슨에서 다룹니다.
순열과 조합
중복 없는 쌍(A,B)을 만들려면 ON 절에 비교 조건을 추가하시면 됩니다.
SELECT a.id, b.id
FROM products a
JOIN products b ON a.id < b.id;
-- All unique pairs of products, no (A,A), no (B,A) duplicates of (A,B)VALUES와 함께 사용하는 CROSS JOIN
작은 집합을 인라인으로 삽입합니다.
SELECT u.email, c.code
FROM users u
CROSS JOIN (VALUES ('EUR'), ('USD'), ('GBP')) AS c(code);쉼표 JOIN 구문 피하기
암시적인 쉼표 JOIN(FROM a, b)은 사용할 수 있지만 의도가 드러나지 않습니다. 명시적인 CROSS JOIN을 사용하시는 편이 좋습니다.
-- Don't (looks like a typo):
FROM users, orders
-- Do:
FROM users CROSS JOIN orders성능
CROSS JOIN 자체는 저렴합니다. 평가할 조건이 없기 때문입니다. 비용은 출력 행 수에서 발생합니다. 10k × 10k = 100M개의 행이 됩니다.
복습
CROSS JOIN은 모든 쌍을 의미합니다.
- 조합을 만들 때 의도적으로 사용하기
- 우발적인 데카르트 곱(WHERE 누락)에 주의하기
- generate_series와 결합해 누락 구간을 채우는 보고서 만들기
빠른 확인
WHERE 없이 SELECT * FROM users u, orders o;를 작성했다면 출력 결과는 무엇일까요?
자주 묻는 질문
“CROSS JOIN과 데카르트 곱” 강의는 무료인가요?
네 — “CROSS JOIN과 데카르트 곱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“CROSS JOIN과 데카르트 곱”에서 뭘 배우나요?
조합적 쌍을 만들 때 CROSS JOIN을 의도적으로 사용하고, 조인 키가 없어 우발적으로 데카르트 곱이 폭발하는 상황을 피합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“CROSS JOIN과 데카르트 곱” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CROSS JOIN과 데카르트 곱
- LATERAL 조인(LATERAL JOIN)
- 안티 조인과 세미 조인(NOT EXISTS)
- 다중 테이블 조인 성능 조정