본문 바로가기

Database/sql 강의

sql 독학 강의 # Cartesian Product 카티션 곱 ansi SQL 문법 12편 -sTricky

sql 독학 강의 # Cartesian Product 카티션 곱 ansi SQL 문법 12편 -sTricky

컨텐츠 index

0. Cartesian Product, 카티션곱 의 정의

1. 카티션곱 활용방법

2. 카티션곱 SQL 작성방법

 

 

SQL 독학 강의 오늘은 join의 기법 중 하나인 카티션 곱에 관한 내용을 다루겠습니다.

 

앞선 시간에 소개해 드린 join의 기법을 각각 한편씩 나누어서 포스팅하도록 하겠습니다.

 

mysql SQL문법과 함께 Ansi SQL 문법도 같이 소개해 드리도록 하겠습니다.

 

Ansi SQL이란 앞에서도 안내를 한번 드리긴 했는데, 간단하게 다시 한번 말씀드리자면, 각각의 RDBMS가 서로 조금씩 다른 SQL문법을 사용하는데, 모든 RDBMS에서 사용될 수 있는 공통 문법이라고 생각하시면 쉽게 이해하실 수 있습니다.

 

바로 시작 하겠습니다.

 

오늘도 파이팅!!!!

 

 

#전편 보러 가기#

2020/04/16 - [Database/sql 강의] - sql 독학 강의 # mysql join (정의 및 종류) 11편 -sTricky

 

sql 독학 강의 # mysql join (정의 및 종류) 11편 -sTricky

sql 독학 강의 # mysql join (정의 및 종류) 11편 -sTricky 컨텐츠 index 0. join 수업용 데이터 생성 1. join 이란 무엇인가? 2. join의 종류는 무엇이 있을까? 안녕하세요. 오늘부터 mysql에서 join 하는 방법..

stricky.tistory.com

 

 

0. Cartesian Product, 카티션곱 의 정의

카티션 곱은 RDBMS에서 사용되는 join의 한 기법 중 하나입니다. where 절이나 on 절에 join 조건을 주지 않고 join을 수행하게 되면 카티션 곱이 수행됩니다.

 

Ansi SQL에서는 cross join 이라고도 합니다. 카티션 곱 join이 일어나게 되면 from 절에서 참조한 테이블들의 행 개수를 각각 모두 곱한 값만큼의 결과가 출력됩니다.

 

 

1. 카티션곱 활용방법

카티션곱은 사실 RDBMS의 개념과 상충하는 개념이 됩니다. RDBMS는 각각의 테이블이 키를 가지고 있고, 해당 키를 이용해서 다른 테이블과 관계를 형성하는 개념을 가지고 있는데, 이 카티션곱 join은 키를 이용하지 않고 그냥 모든 데이터를 1:1로 연결하는 join 방법이기 때문이죠.

 

저도 실무에서 일을 하면서 카티션곱 조인을 사용할 경우가 자주 없었습니다만, 간혹 꼭 필요할 때가 있습니다. 

1) 데이터를 대량으로 복제해야 할 때

2) 특정 데이터 튜플만 복제되어야 할 때

3) 연결고리가 없는 두 테이블의 데이터를 무작위로 합쳐야 할 때

 

이 정도 경우에 사용했던 것 같습니다. 이것 말고도 다른 케이스도 있겠지만 제가 필요로 했던 경우는 위 경우로 설명할 수 있을 것 같습니다.

 

2. 카티션곱 SQL 작성방법

예를 들어보겠습니다. 학과 테이블을 우선 보겠습니다.

※ 포스팅에서 사용되는 데이터는 <SQL 독학 강의 11편>을 참고하시면 됩니다.

select * from class.major;

총데이터가 5건이 출력된 것을 확인할 수 있습니다.

 

다음은, 교수 테이블의 데이터를 확인해 보도록 하겠습니다.

select * from class.professor;

모두 10건의 데이터가 출력이 되었습니다.

 

위 두 테이블을 카티션 곱으로 조인한다면 위에서 설명드린 바와 같이 5 * 10, 즉, 50건의 데이터가 출력되어야 합니다.

 

위 두 테이블을 카티션 곱으로 조인해보도록 하겠습니다. 아래와 같이 mysql 문법과 ansi SQL  문법으로 각각 SQL을 작성했습니다.

 

<mysql 문법>

select m.major_id,
       m.major_title,
       p.prfs_id,
       p.name
from class.major m,  class.professor p;

 

<ansi SQL 문법>

select m.major_id,
       m.major_title,
       p.prfs_id,
       p.name
from class.major m cross join  class.professor p;

mysql문법을 사용할 때는 major 테이블과 professor 테이블 사이에 ", "를 넣어서 구분했지만 ansi SQL에서는 "cross join"이라는 명령어를 사용했습니다.

 

참고로 각 테이블 명 뒤에 붙어있는 m과 p는 테이블의 alias 명입니다. select, where 절에서 칼럼명을 사용해야 하는 경우 어떤 테이블의 컬럼명인지를 알수 있도록 테이블 명을 컬럼명 앞에 붙여야 하는데, 그때마다 테이블 명을 다 쓰기엔 너무 길기 때문에 간단하게 alias 명을 대신 사용을 합니다. 

 

위 SQL문을 잘 보시면 이해가 가실 겁니다.

 

결과는 아래 그림과 같이 두 SQL 모두 같습니다.

그림과 같이 50건의 데이터가 출력이 되었음을 알 수 있습니다.

 

major_title 칼럼을 보시면 학과명 5개가 반복되면서 마지막 칼럼인 name에 있는 교수 이름이 하나씩 연결되는 것을 확인하실 수 있습니다.

 

실제로 한번 실행을 해보시면 이해가 더 빠르실 겁니다.

 

간단하죠? 

 

카티션곱을 금방 쉽게 이해하신다면 앞으로 나오는 다양한 join 기법들을 조금 더 편안하게 이해하실 수 있으리라 생각됩니다.

 

open.kakao.com/o/szfhqYec

 

Database/남/db개발님의 오픈프로필

DB 개발자, DB 개인 CLASS

open.kakao.com

 

 


#다음 강의 보러 가기#

2020/04/22 - [Database/sql 강의] - sql 독학 강의 # inner join with ansi SQL 13편 -sTricky

 

sql 독학 강의 # inner join with ansi SQL 13편 -sTricky

sql 독학 강의 #inner join with ansi SQL 13편 -sTricky 컨텐츠 index 0. inner join의 정의 1. inner join 사용 예제 2. inner join SQL 작성방법 3. inner join으로 3개의 테이블을 join 하는 예제 안녕하세요..

stricky.tistory.com

그럼 전 다음 포스팅에서 뵙겠습니다.

 

감사합니다.

 

 

 

by.sTricky