JOIN 이란
SQL에서 JOIN은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현하는 것이다. 정규화된 테이블들 사이에서 필요한 데이터의 조합을 상황에 맞게 추출해 내는 역할을 한다. JOIN의 종류에 따라 아래와 같이 분류할 수 있다.
- INNER JOIN
- CROSS JOIN
- OUTER JOIN
- FULL OUTER JOIN
- SELF JOIN
지금부터 각각의 조인에 대해서 자세히 알아보겠다.
INNER JOIN
가장 기본적인 조인 형식이다. 내부 조인은 구문에 기반한 2개의 테이블의 컬럼 값을 결합함으로써 새로운 결과 테이블을 생성한다. 결합할 때, 조건에서 동일한 값이 있는 튜플만을 반환한다. 예를 들어 100개의 튜플을 가지는 두개의 테이블이 있을 때 결합되는 컬럼값이 50개라면 50개의 튜플을 가진 새로운 테이블을 반환한다. 결국 일치되는 컬럼값의 개수만큼의 테이블 크기를 갖는 것이다. 아래는 INNER JOIN의 예시이다.
INNER 조인을 더 세부적으로 분류하여 동일 조인(Equi-Join), 자연 조인(Natural join) 으로도 나눌 수 있다.
- 동일 조인(Equi-Join)
'<' 와 같은 비교연산자가 아니라 동등 비교만을 사용하는 조인 구문. 위 내부조인의 예시도 동일 조인의 일종이다. 위 구문을 아래와 같은 SQL문을 사용할 수도 있다.
내부 조인의 경우 두테이블의 컬럼값이 일치하는 경우에만 튜플을 만들기 떄문에 on 절과 where 의 결과가 같다. 이 둘의 차이는 외부조인에서 나타난다. 이는 아래에서 다시 얘기 하겠다.
- 자연 조인(Natural join)
조인 구문이 조인된 테이블에서 '동일한 컬럼명'을 가진 2개의테이블에서 모든 컬럼들을 비교함으로써, 암시적으로 일어나는 구문이다. 명시적이지 않기 떄문에 변경등의 상황에 위험성을 가지고 있어 비권장된다.
CROSS JOIN
교차 조인 절은 조인되는 두 테입르에서 곱집합을 반환한다. 100행의 테이블이 두개 있으면 첫번쨰 테이블에 각 행마다 두번째 테이블의 모든 행이 결합되어 100 x 100 크기의 테이블을 반환한다. 예시는 아래와 같다.
아래 링크는 CROSS JOIN이 어떤 경우에 필요한지에 대한 답글이다. 개인적으로 지금까지 CROSS JOIN를 통해 문제를 해결했던 적은 없지만 특수한 경우에는 필요할 수도 있을 것 같다.
https://stackoverflow.com/questions/219716/what-are-the-uses-for-cross-join
OUTER JOIN
내부 조인이 두테이블의 컬럼값이 일치하는 행만을 결합하여 테이블을 만든다면, OUTER JOIN은 한 테이블을 기준으로 일치하지 않는 컬럼이 없는 테이블에 대해서는 NULL값으로 채운 테이블을 반환한다. 예를들어 기준 테이블이 100개의 튜플을 갖고 있고, 조인되는 테이블이 50개의 튜플을 갖고있다면, 일치하는 컬럼을 가지는 조인 테이블의 개수가 1개이든 10개든 30개이든 100개의 튜플을 가진 테이블을 반환한다. 예시는 아래와 같다.
기본적으로 OUTER JOIN에는 LEFT JOIN과 RIGHT JOIN 으로 나뉜다. 이 둘의 차이는 기준 테이블을 어떤 테이블로 잡느냐이다. 위에서 LEFT JOIN을 RIGHT JOIN으로 바꾸면 아래와 같다.
RIGHT JOIN을 통해 ITEM을 기준 테이블로 삼았기 때문에 이와같은 결과 테이블을 만든다.
FULL OUTER JOIN
FULL OUTER JOIN은 LEFT JOIN과 RIGHT JOIN을 통해 얻을 수 있는 테이블을 합친 테이블을 얻는다. MYSQL 등의 데이터베이스는 이를 지원하지 않지만 UNION 을 통해서 같은 결과를 얻을 수 있다.
SELF JOIN
SELF JOIN은 한 테이블에 컬럼값을 기준으로 자기 자신에 조인을 시키는 것이다. 이러한 SELF JOIN이 필요한 경우는 아래 글에서 자세히 확인할 수 있다. 간단히 요약하면 한 테이블 안에서도 튜플마다 의미있는 연관관계를 가질 수 있다. 멤버 테이블에서 어떤 한 멤버와 연관관계를 가지는 튜플들이 필요하거나, 위계성 등이 필요할 때 SELF JOIN을 사용한다.
JOIN의 세가지 방식
위에까지 JOIN의 종류에 대해서 알아봤다. 이 종류들은 논리적으로 어떠한 테이블을 생성해 낼 것인가에 대한 종류이다. 이러한 JOIN을 어떠한 방식으로(물리적인 개념) 구현할 것인가에 대한 세가지 방식이 있다.
- Nested loop JOIN(중첩반복)
- Merge JOIN(정렬병합)
- Hash JOIN(해시매치)
이러한 테이블 조인 방식은 테이블의 각 로우를 매핑 시 어떤 메커니즘을 사용하는지에 따라 달라지는 것이다.이 세가지에 대해 조금더 자세히 알아보겠다. 또 이러한 개념들은 Index와 밀접한 연관을 갖기 때문에 나중에 내용을 추가해서 다시 정리 하도록 하겠다.
Nested loop JOIN(중첩반복)
- 중첩 반복문과 같은 방법으로 작동하는 조인 방법
- 드라이빙 테이블(먼저 엑세스되는 테이블로 Outer table이라고도 함)을 기준으로 드리븐 테이블(나중에 액세스되는 테이블로 Inner table이라고도 함)을 한 행씩 순차적으로 모두 조회하면서 조인 컬럼값이 일치하는 경우 두 행을 연결
- 조인해야 할 데이터가 많지 않은 경우에 유용하게 사용
- 드라이빙 테이블의 데이터 개수에 영향을 많이 받음
Merge JOIN(정렬병합)
- 조회의 범위가 많을 때 주로 사용하는 조인 방법
- 양쪽 테이블을 각각 엑세스하여 그 결과를 정렬하고, 정렬한 결과를 차례로 스캔하면서 열결고리의 조건으로 병합
-
Hash JOIN(해시매치)
'데이터베이스' 카테고리의 다른 글
Transaction (4) | 2022.03.18 |
---|---|
정규화와 반정규화 (0) | 2022.03.18 |
SQL vs NO SQL (0) | 2022.03.18 |
SQL Injection (0) | 2022.03.17 |
관계형 데이터베이스의 키(Key) (0) | 2022.03.12 |