VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
CROSS JOIN은 한 테이블의 모든 행을 다른 테이블의 모든 행과 짝짓습니다. 아무것도 일치시키지 않으므로 ON 조건을 쓰지 않습니다. 모든 조합을 원할 때 요청하는 조인이고, ON 절을 빠뜨렸을 때 실수로 얻게 되는 조인입니다.
시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.
CROSS JOIN의 동작 방식
COLUMN_LIST를 원하는 열로, FIRST_TABLE과 SECOND_TABLE을 결합할 테이블로 바꾸세요. 결과는 가능한 모든 짝마다 1개의 행을 담으므로, 그 크기는 첫 번째 테이블의 행 수에 두 번째 테이블의 행 수를 곱한 것입니다. 6개 행과 2개 행을 교차하면 12개가 됩니다.
예제
- 모든 조합
Sakila에는 6개의 언어와 2개의 매장이 있습니다.
- 쉼표는 더 오래된 표기입니다
FROM에서 2개의 테이블 사이에 있는 쉼표는 교차 조인입니다. 오래된 SQL에서 만나게 될 텐데, 일치 조건은 흔히 아래쪽 WHERE에 있으며, 이것은 동작하지만 어떤 종류의 조인을 읽고 있는지 숨깁니다.
쉼표는 JOIN보다 느슨하게 결합하므로, ON 절은 쉼표 반대편에 있는 테이블에 닿을 수 없습니다. 실제 쿼리에서 2가지 표기가 함께 나타나기도 하며, 그럴 때 잘못되는 것이 이것입니다.
CROSS JOIN이라고 쓰고, 쿼리 하나에는 한 가지 표기만 쓰세요.
키워드가 규칙을 강제하지도 않습니다. MySQL은 CROSS JOIN에 붙은 ON 절을 받아들이고 그다음 INNER JOIN처럼 동작하므로, 쿼리의 단어는 어떤 조인을 얻었는지에 대한 증거가 아닙니다.
ON 절을 읽으세요.
숫자는 빠르게 커집니다
12개 행은 무해합니다. 평소에 쿼리하는 테이블에 같은 연산을 하면 그렇지 않습니다.ON 절이 없는 INNER JOIN을 받아들이고 이것으로 취급합니다. 그래서 조인이 의심스럽게 딱 떨어지고 의심스럽게 큰 숫자를 반환하면, 가장 먼저 확인할 것은 빠진 ON입니다. INNER JOIN 레슨이 그 실수를 보여 줍니다.
요약
- 한 테이블의 모든 행을 다른 테이블의 모든 행과 짝지으려면
CROSS JOIN을 사용하세요. - 아무것도 일치시키지 않으므로
ON절을 쓰지 마세요. - MySQL이
CROSS JOIN ... ON을 어쨌든 받아들이고 내부 조인으로 취급한다고 예상하세요. - 실행하기 전에 두 테이블의 행 수를 곱해서 크기를 알아 두세요.
FROM에서 테이블 사이의 쉼표를 교차 조인으로 읽고, 쿼리 하나에는 1가지 표기만 쓰세요.- 조인이 딱 떨어지는 큰 수의 행을 반환하면 빠진
ON을 의심하세요.
함께 보기
- 조인의 동작 방식 — 다른 종류들 사이에서 이것이 차지하는 자리
- INNER JOIN — 대신 행을 일치시키는 조인
- 테이블 별칭 — 이 쿼리들이 쓰는 짧은 이름
- MySQL JOIN 성능과 흔한 실수 — 반대편에서 본 그 실수