MySQL에서 CROSS JOIN과 INNER JOIN은 오직 조인 조건(join predicate), 즉 지정된 조건의 유무에 따라서만 구별할 수 있습니다. INNER JOIN 쿼리를 작성할 때는 반드시 조건을 명시해야 하지만, 반대로 CROSS JOIN 쿼리를 작성할 때는 조건을 지정할 필요가 없습니다.
조건 없이 작성된 조인은 두 테이블의 모든 행 조합을 반환하는 데카르트 곱(Cartesian Product) 결과를 생성하며, 이것이 바로 CROSS JOIN입니다.
이해를 돕기 위해 다음과 같은 데이터를 가진 두 개의 테이블 tbl_1과 tbl_2를 예로 들어 살펴보겠습니다.
mysql> Select * from tbl_1; +----+--------+ | Id | Name | +----+--------+ | 1 | Gaurav | | 2 | Rahul | | 3 | Raman | | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from tbl_2; +----+---------+ | Id | Name | +----+---------+ | A | Aarav | | B | Mohan | | C | Jai | | D | Harshit | +----+---------+ 4 rows in set (0.00 sec)
INNER JOIN 쿼리 작성하기
INNER JOIN은 ON 절을 사용하여 조인 조건을 명시합니다. 두 테이블에서 이름(Name)이 일치하는 행만 반환되며, 쿼리와 실행 결과는 다음과 같습니다.
mysql> SELECT tbl_1.id, tbl_2.id FROM tbl_1 JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
위 결과에서 볼 수 있듯이, 두 테이블 모두 'Aarav'라는 이름을 가진 행이 존재하기 때문에 일치하는 단 하나의 행만 반환되었습니다.
조건을 생략하면 CROSS JOIN이 된다
이제 위의 쿼리에서 조건(ON 절)을 제거하고 작성하면 어떻게 될까요? 조건이 없는 조인은 자동으로 CROSS JOIN처럼 동작하여 두 테이블의 모든 가능한 행 조합을 반환합니다.
mysql> Select tbl_1.id, tbl_2.id FROM tbl_1 JOIN tbl_2; +----+----+ | id | id | +----+----+ | 1 | A | | 2 | A | | 3 | A | | 4 | A | | 1 | B | | 2 | B | | 3 | B | | 4 | B | | 1 | C | | 2 | C | | 3 | C | | 4 | C | | 1 | D | | 2 | D | | 3 | D | | 4 | D | +----+----+ 16 rows in set (0.00 sec)
결과를 보면 tbl_1의 4개 행과 tbl_2의 4개 행이 모두 조합되어 총 16개(4 × 4)의 행이 반환된 것을 확인할 수 있습니다. 이것이 바로 데카르트 곱입니다.
핵심 정리
- INNER JOIN:
ON절 등으로 조인 조건을 명시하며, 조건을 만족하는 행만 반환합니다. - CROSS JOIN: 조인 조건 없이 두 테이블의 모든 행 조합(데카르트 곱)을 반환합니다.
- MySQL에서는
JOIN키워드를 사용하더라도 조건을 생략하면 CROSS JOIN과 동일하게 동작합니다.