MySQL에서 ON 조건 없이 조인을 수행해야 할 때는 CROSS JOIN(크로스 조인)을 사용할 수 있습니다. 크로스 조인은 결과를 카테시안 곱(Cartesian Product, 데카르트 곱) 형태로 반환합니다.
예를 들어, 한 테이블에 3개의 레코드가 있고 다른 테이블에 2개의 레코드가 있다면, 첫 번째 테이블의 각 레코드가 두 번째 테이블의 모든 레코드와 차례대로 매칭됩니다. 즉, 첫 번째 레코드가 상대 테이블 전체와 조합된 후, 같은 과정이 두 번째 레코드에 대해 반복되는 방식입니다. 따라서 결과 행의 총 개수는 두 테이블 행 수의 곱(3 × 2 = 6)이 됩니다.
크로스 조인 예제 준비
1. 첫 번째 테이블 생성
mysql> CREATE table ForeignTableDemo
- > (
- > Id int,
- > Name varchar(100),
- > FK int
- > );
Query OK, 0 rows affected (0.47 sec)
위 명령으로 Id, Name, FK 세 개의 컬럼을 가진 외래 테이블을 생성합니다.
2. 두 번째 테이블 생성
mysql> CREATE table PrimaryTableDemo
- > (
- > FK int,
- > Address varchar(100),
- > primary key(FK)
- > );
Query OK, 0 rows affected (0.47 sec)
FK 컬럼을 기본 키(primary key)로 지정하여 기준 테이블을 생성합니다.
외래 키 제약 조건 추가
두 테이블을 연결하기 위해 외래 키 제약 조건을 설정합니다.
mysql> ALTER table ForeignTableDemo add constraint FKConst foreign key(FK) references PrimaryTableDemo(FK);
Query OK, 0 rows affected (1.54 sec)
Records: 0 Duplicates: 0 Warnings: 0
데이터 입력 및 조회
두 번째 테이블에 레코드 추가
mysql> INSERT into PrimaryTableDemo values(1,'US');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT into PrimaryTableDemo values(2,'UK');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT into PrimaryTableDemo values(3,'Unknown');
Query OK, 1 row affected (0.08 sec)
SELECT 문으로 두 번째 테이블의 데이터를 확인합니다.
mysql> SELECT * from PrimaryTableDemo;
실행 결과는 다음과 같습니다.
+----+---------+
| FK | Address |
+----+---------+
| 1 | US |
| 2 | UK |
| 3 | Unknown |
+----+---------+
3 rows in set (0.00 sec)
첫 번째 테이블에 레코드 추가
mysql> INSERT into ForeignTableDemo values (1,'John',1);
Query OK, 1 row affected (0.20 sec)
mysql> INSERT into ForeignTableDemo values (2,'Bob',2);
Query OK, 1 row affected (0.27 sec)
SELECT 문으로 첫 번째 테이블의 데이터를 조회합니다.
mysql> SELECT * from ForeignTableDemo;
실행 결과는 아래와 같습니다.
+------+------+------+
| Id | Name | FK |
+------+------+------+
| 1 | John | 1 |
| 2 | Bob | 2 |
+------+------+------+
2 rows in set (0.00 sec)
ON 조건 없는 CROSS JOIN 실행하기
이제 두 테이블 모두 준비되었으므로, ON 절 없이 크로스 조인을 사용하는 구문을 살펴보겠습니다.
mysql> SELECT ForeignTableDemo.Id, ForeignTableDemo.Name, PrimaryTableDemo.Address
- > from ForeignTableDemo
- > cross join PrimaryTableDemo;
실행 결과는 다음과 같습니다.
+------+------+---------+
| Id | Name | Address |
+------+------+---------+
| 1 | John | US |
| 2 | Bob | US |
| 1 | John | UK |
| 2 | Bob | UK |
| 1 | John | Unknown |
| 2 | Bob | Unknown |
+------+------+---------+
6 rows in set (0.00 sec)
정리
실행 결과를 보면 첫 번째 테이블의 각 행(John, Bob)이 두 번째 테이블의 모든 행(US, UK, Unknown)과 조합되어 총 6개(2 × 3)의 행이 반환되었습니다. 이처럼 CROSS JOIN은 ON 조건 없이 사용할 수 있으며, 두 테이블의 가능한 모든 행 조합을 생성합니다. 참고로 MySQL에서는 CROSS JOIN 대신 쉼표(,)를 사용한 FROM A, B 형식이나 일반 JOIN을 ON 절 없이 작성해도 동일한 카테시안 곱 결과가 나오지만, 의도를 명확히 드러내기 위해 CROSS JOIN 키워드를 사용하는 것이 좋습니다.