본문 바로가기
데이터베이스

[SQLD] 조인(Join) 종류(1) - Equi, Non-Equi, 카테시안곱

by Data Lib 2023. 11. 22.

이번 포스팅에서는 관계형 데이터베이스에서 가장 기본적이고 중요한 조인(Join)에 대해 알아보도록 하겠습니다. 처음 데이터베이스를 배울 때 rdbms는 집합 계념이 중요하다고 선배들이 입버릇처럼 말했었죠. 다른 프로그램과 다르게 SQL은 이 걔념을 알아야 올바른 쿼리를 만들 수 있다는 이야기 였습니다. Join은 무엇을 말하고 Join 종류에는 어떤 것들이 있는지 알아보도록 하겠습니다. 

 

 

Join 이란

조인은 다른 말로 집합간의 곱(Product Of Set)이라고 말합니다. rdbms에서 서로 독립적인 데이터들간의 데이터를 연결을 위해  조인을 이용한다는 이야기입니다. 쉽게 말하면 조인은 두개의 데이터를 연결하는 방법입니다. 조인을 이용해 필요 시 원하는 다양한 정보를  참조하고 새롭게 구성할 수도 있습니다. 조인은 연결 연산자에 따라 Equi Join , Non-Equi Join , Anti Join 등 다양하게 존재합니다. 

 

Join을 안하면 어떻게 될까요? - 카테시안 

SQL을 배우는 초기에는 from절에 테이블에 대해 적합한 join 조건을 적지 않는 경우를 경험하게 됩니다. 이럴 경우 해당 테이블에 대한 모든 데이터를 전부 결합하여 존재하는 행 갯수를 곱한 만큼의 결과값이 반환됩니다. 이를 카테시안 곱(Cartesian Product) 라고 합니다. 예를 들어, 아래와 같이 emp와 dept 테이블이 조인한다고 {emp x dept}와 같은 형태로 출력되는 것이죠. 

 

Cartesian Product
Cartesian Product

 

경우에 따라서는 의도적으로 카테시안 곱을 활용하기도 합니다. 데이터를 복제해서 다른 집합을 만들 때죠. 하지만 대체적으로는 원하지 않는 데이터가 생겨버리는 결과가 나오기 때문에 주위해야 합니다. 아래와 같이 Equi-Join과 Non equi-Join으로 조건을 준다면 노란색 색깔 표시한 데이터만 나오게 됩니다.

1. Equi-Join

SELECT a, b, c, d, e
FROM emp, dept
WHERE a = b
;

 

2. Non equi-Join 

SELECT a, b, c, d, e
FROM emp, dept
WHERE a <> b
;

 

Equi-Join vs Non equi-Join
Equi-Join vs Non equi-Join

의도적 카테시안 곱

고급 SQL을 작성하려고 하면 기존 데이터셋을 분리해야 하는 경우가 생깁니다. 만약 3개의 row로 분리해야 한다면 아래와 같은 구문을 사용하면 1, 2, 3 의 row가 있는 집합이 만들어 지고 카테시안 곱을 활용하면 3개의 case에 따라 각각 다른 값으로 데이터를 만들 수 있습니다. 이렇게 의도적인 용도가 있긴 하지만 대규모 데이터에 대한 쿼리에서 성능 이슈가 발생할 수 있으므로 주의해야 합니다. 

 

SELECT level as no
FROM dual
CONNECT BY LEVEL <= 3
;