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>