SQLite | 데이터 조인(Join) | 교차 조인 (CROSS JOIN)

2개의 테이블을 조인하여 데이터를 검색하는 방법 중에 두 테이블의 데이터의 모든 조합을 받아오는 방법이 교차 조인이다. 여기에서 교차 조인을 위한 CROSS JOIN 절 사용에 대해 설명한다.

교차 조인

먼저 교차 조인에 대해 간략하게 설명하겠다. 교차 조인은 두 테이블의 데이터의 모든 조합을 받아온다.

다음 그림을 보도록 하자. 왼쪽 테이블의 데이터 1개당 오른쪽 테이블 데이터를 처음부터 끝까지 하나씩 결합한다. 그리고 왼쪽의 데이터가 없어질 때까지 반복한다.

cross_join

조인된 데이터의 수는 왼쪽 테이블의 데이터가 n개이고 오른쪽 데이터가 m개이면 n × m 개가 되고, 경우에 따라서는 매우 많은 개수가 되므로 주의하길 바랍니다.

CROSS JOIN 절 사용 방법

SELECT 문과 CROSS JOIN에 절을 조합하여 두 테이블을 교차 조인시켜 데이터를 조회할 수 있다. 형식은 다음과 같다.

SELECT 테이블명.컬럼명, ... FROM 테이블명1
  CROSS JOIN 테이블명2
  ON 테이블명1.컬럼명1 = 테이블명2.컬럼명2;

이를 단순화하면 다음과 같다.

SELECT (조회 컬럼) FROM 테이블명1
  CROSS JOIN 테이블명2 ON (조인 조건);

ON 절을 지정할 수도 있지만 CROSS JOIN 절은 조인 조건을 지정하지 않고 사용하는 경우가 많을 것으로 생각되기에 다음의 설명에서도 조인 조건은 생략하도록 하겠다.

간단한 예를 통해 어떻게 사용하는지에 대해 확인해 보자. 제품 목록이 등록된 product 테이블과 색상이등록된 color 테이블을 만들고, INSERT 문을 사용하여 데이터도 같이 추가한다.

create table product (id integer, name text);

insert into product values (1, 'Desk');
insert into product values (2, 'Cabinet');
insert into product values (3, 'Chair');
sqlite> create table product (id integer, name text);
sqlite> 
sqlite> insert into product values (1, 'Desk');
sqlite> insert into product values (2, 'Cabinet');
sqlite> insert into product values (3, 'Chair');
sqlite> 
create table color (id integer, name text);

insert into color values (1, 'Red');
insert into color values (2, 'Blue');
insert into color values (3, 'White');
sqlite> create table color (id integer, name text);
sqlite> 
sqlite> insert into color values (1, 'Red');
sqlite> insert into color values (2, 'Blue');
sqlite> insert into color values (3, 'White');
sqlite> 

다음과 같이 교차 조인을 하여 데이터를 조회해 본다.

select * from product cross join color;
sqlite> select * from product cross join color;
id          name        id          name      
----------  ----------  ----------  ----------
1           Desk        1           Red       
1           Desk        2           Blue      
1           Desk        3           White     
2           Cabinet     1           Red       
2           Cabinet     2           Blue      
2           Cabinet     3           White     
3           Chair       1           Red       
3           Chair       2           Blue      
3           Chair       3           White     
sqlite> 

product 테이블의 데이터 하나씩해서 color 테이블의 데이터를 하나씩 조인된 데이터를 받아온 것을 확인할 수 있다.

조회할 데이터 컬럼 지정 방법

조회할 데이터 컬럼 지정 방법은 내부 조인의 경우와 동일하다. 자세한 내용은 내부 조인의 “조회할 데이터 컬럼 지정 방법"을 참조하도록 한다. 두 테이블에서 동일한 컬럼명이 있는 경우 “테이블명.컬럼명"과 같이 지정하고 그 중 하나의 테이블 밖에 없는 컬럼명의 경우 테이블명을 생략하고 “컬럼명"으로 지정한다.

교차 조인의 경우도 실제로 해보도록 한다.

select product.id, product.name, color.name from product cross join color;
sqlite> select product.id, product.name, color.name from product cross join color;
id          name        name      
----------  ----------  ----------
1           Desk        Red       
1           Desk        Blue      
1           Desk        White     
2           Cabinet     Red       
2           Cabinet     Blue      
2           Cabinet     White     
3           Chair       Red       
3           Chair       Blue      
3           Chair       White     
sqlite>