메인 콘텐츠로 건너뛰기

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개가 됩니다.

예제

  1. 모든 조합

Sakila에는 6개의 언어와 2개의 매장이 있습니다.
모든 언어가 매장마다 한 번씩 나타납니다. 여기의 어떤 것도 매장이 그 언어의 영화를 갖추고 있다고 말하지 않습니다: 행은 조합이지 데이터에 관한 사실이 아닙니다. 그것이 이 쿼리의 요점입니다. 이런 격자는 무언가 일어났든 아니든 모든 짝마다 행을 원할 때의 출발 형태입니다.

  1. 쉼표는 더 오래된 표기입니다

같은 12개의 행입니다. FROM에서 2개의 테이블 사이에 있는 쉼표는 교차 조인입니다. 오래된 SQL에서 만나게 될 텐데, 일치 조건은 흔히 아래쪽 WHERE에 있으며, 이것은 동작하지만 어떤 종류의 조인을 읽고 있는지 숨깁니다. 쉼표는 JOIN보다 느슨하게 결합하므로, ON 절은 쉼표 반대편에 있는 테이블에 닿을 수 없습니다. 실제 쿼리에서 2가지 표기가 함께 나타나기도 하며, 그럴 때 잘못되는 것이 이것입니다.
교차 조인을 의도할 때는 CROSS JOIN이라고 쓰고, 쿼리 하나에는 한 가지 표기만 쓰세요. 키워드가 규칙을 강제하지도 않습니다. MySQL은 CROSS JOIN에 붙은 ON 절을 받아들이고 그다음 INNER JOIN처럼 동작하므로, 쿼리의 단어는 어떤 조인을 얻었는지에 대한 증거가 아닙니다.
6,000이 아니라 1,000입니다: 모든 영화가 자기 언어와 일치했습니다. 조인이 하는 일을 알려면 키워드가 아니라 ON 절을 읽으세요.

숫자는 빠르게 커집니다

12개 행은 무해합니다. 평소에 쿼리하는 테이블에 같은 연산을 하면 그렇지 않습니다.
1,000편의 영화 곱하기 6개의 언어는 6,000개의 행이고, 이제 영화마다 6개 언어를 모두 가진 것으로 나옵니다. 10,000개 행짜리 테이블 2개를 교차하면 답은 1억 개의 행이 되며, 즉시 끝났어야 할 쿼리가 누군가 죽일 때까지 실행되는 방식이 이것입니다. MySQL은 ON 절이 없는 INNER JOIN을 받아들이고 이것으로 취급합니다. 그래서 조인이 의심스럽게 딱 떨어지고 의심스럽게 큰 숫자를 반환하면, 가장 먼저 확인할 것은 빠진 ON입니다. INNER JOIN 레슨이 그 실수를 보여 줍니다.

요약

  • 한 테이블의 모든 행을 다른 테이블의 모든 행과 짝지으려면 CROSS JOIN을 사용하세요.
  • 아무것도 일치시키지 않으므로 ON 절을 쓰지 마세요.
  • MySQL이 CROSS JOIN ... ON을 어쨌든 받아들이고 내부 조인으로 취급한다고 예상하세요.
  • 실행하기 전에 두 테이블의 행 수를 곱해서 크기를 알아 두세요.
  • FROM에서 테이블 사이의 쉼표를 교차 조인으로 읽고, 쿼리 하나에는 1가지 표기만 쓰세요.
  • 조인이 딱 떨어지는 큰 수의 행을 반환하면 빠진 ON을 의심하세요.

함께 보기