CROSS JOIN과 카테시안 곱
조합을 만들기 위한 의도적인 CROSS JOIN과 행 수를 폭증시키는 실수로 인한 CROSS JOIN을 알아봅니다.
CROSS JOIN과 카테시안 곱은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 함정으로 사용하는 조인
CROSS JOIN은 왼쪽 테이블의 모든 행을 오른쪽 테이블의 모든 행과 짝짓습니다. ON 조건이 없습니다. 테이블 A에 4개 행이 있고 테이블 B에 3개 행이 있다면 결과는 4 x 3 = 12개 행입니다.
이를 카테시안 곱이라고 합니다. 면접관이 이를 묻는 이유는 두 가지입니다. 의도적으로 조합을 생성할 수 있는지 확인하고, 결과 집합을 폭발적으로 늘리는 우발적인 교차 조인을 알아차리는지 보기 위해서입니다.
명시적 CROSS JOIN 구문
카테시안 곱을 작성하는 현대적이고 읽기 쉬운 방법은 명시적인 CROSS JOIN 키워드를 사용하는 것입니다. ON 절이 없다는 점에 주목하십시오. 이는 검토자에게 의도를 명확하게 전달합니다.
여기서는 모든 사이즈와 모든 색상을 조합하여 전체 제품 매트릭스를 만듭니다.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;기존 쉼표 구문
카테시안 곱을 FROM 절에 쉼표를 사용하고 조인 조건을 지정하지 않는 방식으로 작성한 코드도 여전히 볼 수 있습니다. 이것은 기존 ANSI 구문입니다.
CROSS JOIN과 정확히 같은 결과를 만들지만 위험합니다. 조인 조건을 추가하려고 했지만 잊어버리면 오류가 발생하지 않고 조용히 CROSS JOIN이 수행되기 때문입니다. 명시적인 CROSS JOIN을 사용하십시오.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;실습 예제: 사이즈 차트 만들기
어떤 상점에서 티셔츠를 3가지 사이즈와 4가지 색상으로 판매하며, 아직 재고가 없는 변형까지 포함해 가능한 모든 변형에 대한 행을 만들려고 한다고 가정해 보겠습니다. CROSS JOIN을 사용하면 한 단계로 12개의 조합을 모두 생성할 수 있습니다.
이는 가장 일반적인 의도적 사용 사례로, 선택 항목의 완전한 격자를 만드는 것입니다.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;달력 격자 생성하기
CROSS JOIN의 또 다른 전형적인 면접 활용 사례는 데이터가 누락된 경우에도 모든 조합이 포함되도록 조밀한 격자를 만드는 것입니다.
여기서는 모든 매장과 모든 날짜를 조합합니다. 그러면 이후의 판매 데이터에 대한 LEFT JOIN이 매장별 날짜당 한 행을 반환하고, 누락된 부분은 0으로 채웁니다. CROSS JOIN은 어떤 매장과 날짜의 조합도 빠지지 않도록 보장합니다.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';뜻하지 않은 카테시안 폭발
면접관이 확인하려는 위험 요소는 다음과 같습니다. 두 테이블을 조인하면서 조인 조건을 잊는 경우입니다. 오류가 발생하는 대신 데이터베이스는 모든 조합을 아무 문제 없이 반환합니다.
orders에 100,000개의 행이 있고 customers에 50,000개의 행이 있다면 결과는 50억 개의 행이 됩니다. 쿼리는 멈춘 것처럼 되고 메모리는 고갈되며 수치가 터무니없이 부풀려집니다. 코드 검토에서 이러한 패턴을 알아보는 것은 좋은 신호입니다.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rows뜻하지 않은 CROSS JOIN을 발견하는 방법
면접관이 답변으로 기대하는 증상은 다음과 같습니다.
- 행 수가 두 테이블 크기의 합이 아니라 두 크기의 곱과 대략 같습니다.
SUM과 같은 집계 결과가 일정한 배수만큼 부풀려집니다.- 쿼리 실행 계획에 조인 필터가 없는 중첩 루프가 표시됩니다.
해결 방법은 거의 항상 두 테이블 사이에 누락된 ON 또는 WHERE 동등 조건을 추가하는 것입니다.
항상 참인 ON을 사용하는 CROSS JOIN과 INNER JOIN 비교
CROSS JOIN은 논리적으로 INNER JOIN ... ON 1=1과 동일합니다. 둘 다 완전한 카테시안 곱을 생성합니다.
실제로 INNER JOIN은 CROSS JOIN을 수행한 다음 ON 조건으로 필터링하는 것과 같습니다. 이 개념적 모델을 이해하면 조건이 누락되었을 때 INNER JOIN이 CROSS JOIN으로 축소되는 이유를 알 수 있습니다.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;숫자 테이블과 CROSS JOIN하기
강력한 기법 중 하나는 작은 numbers 또는 generate_series 테이블과 CROSS JOIN하여 의도적으로 행을 늘리는 것입니다. 이 기법은 하나의 행을 여러 행으로 확장할 때 사용합니다. 예를 들어 수량을 개별 단위 행으로 바꿀 수 있습니다.
여기서는 각 제품 행을 시퀀스와 조인하고 수량 이하의 숫자만 유지하여 qty만큼 반복합니다.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;성능과 안전한 사용 방법
출력 크기는 곱셈적으로 증가하므로 큰 테이블 두 개를 CROSS JOIN하지 마십시오. 최소한 한쪽은 작게 유지해야 합니다(사이즈 목록, 작은 달력, 숫자 테이블 등).
면접에서는 다음을 명확히 말하십시오. 'CROSS JOIN은 한쪽이 작고 크기가 제한된 경우에만 안전하며, 그렇지 않으면 결과를 감당할 수 없습니다.' 이 문장은 단순히 구문을 아는 것을 넘어 판단력을 보여 줍니다.
CROSS JOIN을 사용해야 하는 경우
두 집합의 모든 조합이 필요할 때 의도적으로 CROSS JOIN을 사용하십시오.
- 선택 항목 매트릭스 생성(사이즈 x 색상)
- LEFT JOIN 전에 시계열을 조밀하게 만들기(매장 x 날짜)
- 숫자 테이블을 사용하여 행 확장하기
모든 조합을 원하지 않는다면 거의 확실히 ON 조건이 있는 조인을 사용해야 합니다.
빠른 확인
카테시안 곱에 대한 이해도를 확인해 보십시오.
복습: CROSS JOIN
핵심 요점:
- CROSS JOIN은 왼쪽의 모든 행을 오른쪽의 모든 행과 조합하므로 출력 크기는 입력 크기의 곱입니다.
- 조건이 없는 쉼표 구문은 동일한 카테시안 곱을 생성하며, 흔히 실수로 사용됩니다.
- 조합 격자, 시계열 조밀화, 숫자 테이블을 통한 행 확장에 의도적으로 사용하십시오.
ON이 누락된 INNER JOIN은 조용히 CROSS JOIN으로 변합니다. 이는 면접관이 즐겨 묻는 폭발적인 결과를 만드는 버그입니다.
자주 묻는 질문
“CROSS JOIN과 카테시안 곱” 강의는 무료인가요?
네 — “CROSS JOIN과 카테시안 곱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“CROSS JOIN과 카테시안 곱”에서 뭘 배우나요?
조합을 만들기 위한 의도적인 CROSS JOIN과 행 수를 폭증시키는 실수로 인한 CROSS JOIN을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“CROSS JOIN과 카테시안 곱” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CROSS JOIN과 카테시안 곱
- SELF JOIN으로 계층 구조 다루기
- 하나의 표 안에서 행 비교하기
- 적절한 JOIN 유형 선택하기