MySQL에서 하나의 테이블에 저장된 값들을 서로 다른 조합으로 모두 조회하고 싶을 때가 있습니다. 이럴 때는 교차 조인(Cross Join) 개념을 활용하여 동일한 테이블을 여러 번 참조하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable622 (Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Value1 int, Value2 int);
Query OK, 0 rows affected (1.08 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable622(Value1,Value2) values(1000,1000);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable622(Value1,Value2) values(2000,3000);
Query OK, 1 row affected (1.04 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from DemoTable622;
실행 결과는 다음과 같습니다.
+----+--------+--------+
| Id | Value1 | Value2 |
+----+--------+--------+
| 1 | 1000 | 1000 |
| 2 | 2000 | 3000 |
+----+--------+--------+
2 rows in set (0.00 sec)
4. 모든 조합을 조회하는 쿼리
테이블의 값들로 만들 수 있는 모든 조합을 얻으려면, 동일한 테이블에 별칭(alias)을 붙여 세 번 참조하는 쿼리를 작성합니다.
mysql> select tbl1.Id, tbl2.Value1, tbl3.Value2
from DemoTable622 tbl1, DemoTable622 tbl2, DemoTable622 tbl3;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+----+--------+--------+
| Id | Value1 | Value2 |
+----+--------+--------+
| 1 | 1000 | 1000 |
| 2 | 1000 | 1000 |
| 1 | 2000 | 1000 |
| 2 | 2000 | 1000 |
| 1 | 1000 | 3000 |
| 2 | 1000 | 3000 |
| 1 | 2000 | 3000 |
| 2 | 2000 | 3000 |
+----+--------+--------+
8 rows in set (0.01 sec)
동작 원리
위 쿼리는 WHERE 절 없이 세 개의 테이블 인스턴스를 나열했기 때문에 카티션 곱(Cartesian Product), 즉 교차 조인이 수행됩니다. 레코드가 2개인 테이블 세 개를 조합하면 2 × 2 × 2 = 8개의 행이 생성됩니다.
- tbl1: Id 컬럼의 값 제공
- tbl2: Value1 컬럼의 값 제공
- tbl3: Value2 컬럼의 값 제공
이처럼 각 인스턴스가 독립적으로 모든 행을 반환하기 때문에, 테이블에 저장된 값들이 만들 수 있는 모든 경우의 수를 손쉽게 조회할 수 있습니다. 단, 원본 테이블의 레코드 수가 많아지면 결과 행 수는 레코드 수의 거듭제곱으로 증가하므로 대량 데이터에는 주의가 필요합니다.