본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (5) CROSS JOIN

PostgreSQL logo image

 

 

이번 아티클에서는 CROSS JOIN을 살펴보겠습니다. 우선 CROSS JOIN은 또 무엇을 의미하는가? 이해를 하고 넘어가야겠죠. 100% 정확한 학술적 정의는 아니지만, 간단히 말해서 '곱집합'의 형태인 catesian product 연산을 구현합니다. 예를 들어 두 개의 테이블이 있을 경우, 각각의 값들이 모두 매치되는 경우의 수를 전부 표현하게 되는 것이죠. 

 

만일 2명의 사람 A, B가 있고 색깔이 3개가 있다면 - 두 사람과 3개의 색상을 매칭할 수 있는 경우의 수는 (A, 빨강) (A, 파랑) (A, 노랑) (B, 빨강) (B, 파랑) (B, 노랑)의 형태로 6개가 나오겠죠? CROSS JOIN 역시 이러한 케이스를 테이블에서 연산하게 됩니다. 

 


 

간단한 CROSS JOIN 실습을 위해, 아래와 같이 예제 테이블을 생성해 보겠습니다. 

 

create table cross_ex1
(label char(10) primary key);

create table cross_ex2
(score int primary key);

insert into cross_ex1 (label)
values ('TOM'), ('JOHN');

insert into cross_ex2 (score)
values (100), (83), (75);

select * from cross_ex1;
select * from cross_ex2;

 

 

 

결과적으로 위와 같은 두 개의 테이블이 생성되었습니다. 여기서 가장 기본적인 두 테이블의 매칭을 진행해 보겠습니다. 

 

select *
  from cross_ex1
 cross join cross_ex2;

 

 

 

위의 결과물처럼, 톰과 존 각각에게 모든 점수를 한 번씩 매칭하여 출력합니다. CROSS_EX1을 기준으로('FROM') CROSS_EX2를 조인하였고 - 그 결과 톰과 존에게 각각 점수를 매칭하는 형태가 되었습니다. 

 

 


 

 

그런데 CROSS JOIN 말고도 위와 같은 결과를 낼 수 있는 쿼리가 있습니다. 아래와 같이 실습해 봅시다. 이는 사실상 INNER JOIN을 보여주는 것과 동일한 쿼리이니, 참고하세요.

 

select *
  from cross_ex1, cross_ex2;

 

 


 

위에서 보면 정렬이 톰/존/톰/존 형태로 한번씩 반복됩니다. 여기서 쿼리에 ORDER BY LABEL을 추가해 주면, 아래와 같이 깔끔하게 결과를 정리할 수 있습니다. 

 

select *
  from cross_ex1
 cross join cross_ex2
 order by label;

--또는

select *
  from cross_ex1, cross_ex2
 order by label;