본문 바로가기

데이터베이스/SQL & PL/SQL

[SQL] CROSS JOIN 또다른 이름 카타시안 프로덕트(Cartesian Product)


이글에서는 CROSS JOIN, 크로스 조인에 대해서 알아볼까 합니다.
타이틀에서 명시했듯이 카타시안 프로덕트라고 하는 이름도 있는데요.
원래 존재하던 SQL 키워드인 카타시안 프로덕트가 SQL이 표준화가 진행되면서
ANSI 표준으로 바뀌었는데 그 이름이 CROSS JOIN 이 된것입니다.

이런 이야기는 앞에서 이야기 했구요.
개념적인 것을 먼저 살펴 보도록 할게요.

'모든 경우를 고려한다!'

이것이 바로 크로스 조인의 핵심입니다.
사실 크로스 조인은 개념적인 조인이라고도 하는데요. 이유는 실제 프로젝트에서
이 크로스 조인이 쓰이는 경우는 없기 때문이죠. 그래서 조인이 아니다라고도 한답니다.

위의 말처럼 모든 경우를 고려하기 때문에
우리가 적던 ON절이나 USING절을 배제한체 조인조건을 적지 않습니다.

그렇기 때문에 JOIN의  해당 테이블인 두테이블간의 모든 데이터의가 조합이 되는 것이죠.
employees테이블과 departments 테이블을 크로스 조인한다 그러면
employees 테이블에 첫번째 로우값에 departments 테이블의 모든 로우(ROW) 값이 적용되는 것인데요.
말인 즉슨, departments에 100개의 로우, 데이터가 있다면
employees 테이블의 로우 한개당 departments 테이블의 모든 로우 100이 조합이 된다는 겁니다.

그러면 employees 테이블에 50의 데이터 로우가 있다면 크로스 조인으로 조회되는 모든 로우는
50 * 100 =500이 되겠군요.

일단 각 테이블 로우를 세어 보겠습니다.
COUNT()함수를 사용합니다.
SELECT COUNT(*)
FROM hr.employees;

SELECT COUNT(*)
FROM hr.departments;

SELECT COUNT(*)
FROM hr.employees CROSS JOIN hr.departments;

자 결과 입니다. employees 테이블의 로우가 107개, departments 테이블의 로우가 27개
그리고 그 조합인 크로스 조인의 모든 테이블수가 107*27 =2889 개입니다.

1. employees 테이블



2. departments 테이블



3. 크로스 조인한 테이블



그렇다면 크로스 조인한 테이블을 보실텐데요.조합이라 감이 안잡히 신분들은 다음 두 이미지를 보면 되겠네요.
전체결과의 일부분인데, 어떻게 조합된다는 것을 보여주기 위해 같은 해당부분만 잘라왔어요.

1.


2.


보시면 알겠지만 위의 위의 Administration과 Marketing에 대응 되는 사원들이 동일합니다.
그러니까 위의 결과는 각 부서별로 employees 테이블에 해당하는 모든 사원을 조합한 것이죠.
실제로는 그런 부서에 그 사원이 일을 하지 않는데 말이죠.

크로스 조인에 대해서 이해가 되셨나요?
합칠수 없는 행들이기는 하나 합쳐야 할때 사용되는 것이 크로스 조인입니다.
위에도 말했듯이 크로스 조인은 개념적일뿐 실제로 사용하지는 않는 답니다.

다음글에서 NATURAL JOIN과 SELF JOIN 에 대해서 알아볼게요 ^^.