본문 바로가기

Java

Join 종류

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

Join


join
join 또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다.
따라서 조인은 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어 낸다.
JOIN은 2개의 테이블에서 각각의 공통값을 이용함으로써 필드를 조합하는 수단이 된다.
-위키백과-

지난 시간에 join 기본에 대해서 알아보았었습니다.

이번에는 join에 대해 더 자세하게 알아보겠습니다.


기본

데이터베이스에서 데이터는 다수의 테이블에 나누어서 저장되어 있습니다.

 

모델링 초기 과정에서 정보가 한 테이블에 모여있다고 하더라도 정규화를 거치면서 큰 테이블이 작은 테이블로 나뉘고 중복을 제거하며 작은 테이블로 나뉘게 됩니다. 그러므로 내가 원하는 정보가 한 테이블 안에 있지 않을 수 있습니다. 아니, 그런 경우가 대부분일 것입니다.

 

그래서 내가 원하는 정보를 얻기 위해서는 여러 개의 테이블을 관계 맺어 한꺼번에 끌어와야 하는 경우가 많습니다. 이럴 때 사용하는 것이 JOIN입니다.

 

JOIN은 레코드 간 연산이 아니라 테이블 단위의 연산으로, 테이블과 테이블을 붙여버리는 것입니다.

 

마지막으로 JOIN을 할 때, 왼쪽에 붙는 테이블을 드라이빙 테이블, 오른쪽에 붙는 테이블을 드리븐 테이블이라고 합니다.


표준 조인과 비표준 조인

표준조인과 비표준조인

표준 조인과 비표준 조인이 존재하는 이유는, DB마다 조금씩 조인하는 문법이 다르기 때문입니다.

예를 들어서 MySQL ORACLE에서 조인 문법이 조금 상이합니다. 
각기 다른 조인의 방식을 하나로 통일하기 위해서 만든 것이 표준 조인, ANSI join입니다.

ANSI SQL을 이용한 조인을 사용하면 DBMS종류에 제약을 받지 않고 어디에서나 동일한 조인 결과를 보장받을 수 있습니다.


조인의 종류

조인의 종류
조인의 종류에는 5가지가 있습니다.

1. CROSS JOIN
2. EQUI JOIN
3. NON-EQUI JOIN
4. SELF JOIN
5. OUTER JOIN

하나씩 알아보겠습니다.


CROSS JOIN

 

드라이빙 테이블의 각 record에서 드리븐 테이블의 모든 record에 join 하여 결괏값을 내는 JOIN을 의미합니다.

1A, 1B, 1C, 2A, 2B, 2C, 3A, 3B, 3C의 모든 레코드가 생성됩니다.


EQUI JOIN

 

Oracle에서 EQUI JOIN이라는 이름으로 사용하는 방식이

ANSI JOIN에서는 inner join, natural join이라는 방식으로 사용하게 됩니다.

정리하면 ORACLE equi == ANSI inner + natural입니다.

 

또한 우리에게 가장 친숙한 JOIN입니다.

테이블과 B테이블을 Join 할 때 겹치는 부분만을 찾아내어 join 하는 방식입니다

주로 외래 키를 기반으로 이루어집니다.

 

마지막으로 natural join은

inner join과 다른 달리 자동적으로 모든 column을 대상으로공통 column을 조사하여

내부적으로 join sql query를 생성하는 join입니다.


NON-EQUI JOIN

EQUI JOIN은 특정한 column을 기준으로 동등 비교(=)를 통해 합쳐서 데이터를 표현하는 것을 의미했었습니다.

 

NON-EQUI JOIN>=, < 처럼 비교 연산자를 통해서 Join을 하는 경우를 의미합니다.

예를 들어 성적의 범위에 따라서 A, B, C, D, F 등으로 등급을 매길 때 사용합니다.

 

NON-EQUI JOIN은 예기치 않은 결과가 발생할 수 있기도 하고, 완벽하게 쿼리를 짜는 것이 쉽지 않기 때문에 사용에 매우 주의를 기울여야 합니다.


SELF JOIN

Self join은 한 테이블이 자기 자신과 조인하는 것을 의미합니다.

 

예를 들어사원과 사원의 관리자는 동일한 테이블에서 데이터를 구할 수가 있으나, join을 하지 않고 바로는 구할 수 없습니다. 이럴 때 self join을 활용하여 자기 자신 테이블을 한번 join 해주는 것입니다. 사용할 때 주의할 것은 join 하는 두 테이블의 column이름이 모두 동일하기 때문에 식별을 위해서 반드시 별칭을 사용해야 한다는 것입니다.


OUTER JOIN

Outer join equi join과 달리 합칠 때 비교하는 특정 column에 대해서 NULL. 즉, record 간 관계를 맺고 있지 않더라도, 비어있다면 비어 있는 대로 join 하는 방식입니다

 

1. left outer join

Left outer join은 드라이빙 테이블에서 드리븐 테이블에 관계를 맺지 않은, 즉 드라이빙 테이블에서 FK로 드리븐 테이블이 연결되어있지 않더라도 드라이빙 테이블을 전부 다 가져오고 드리븐 테이블은 비어있는 대로 NULL값을 채워서 결과를 출력해주는 join을 의미합니다

 

 

 

 

2. right outer join

Right outer join은 드리븐 테이블에서 드라이빙 테이블에 관계를 맺지 않은, 즉 드리븐 테이블에서 FK로 드라이빙 테이블이 연결되어있지 않더라도 드리븐 테이블을 전부 다 가져오고 드라이빙 테이블은 비어있는 대로 NULL값을 채워서 결과를 출력해주는 join을 의미합니다

 

 

 

 

 

 

3. full outer join

Full outer join left outer join right outer join을 합친 것과 같습니다. 어느 한쪽에서 관계를 맺고 있지 않다고 해도 그냥 join 테이블로 가져와서 반대쪽 테이블에 NULL값을 넣어주는 형태입니다.

 

이런 특징 때문에 MySQL에서는 FULL JOIN을 할 때

(left outer join) union (right outer join) 방식을 사용합니다.

 

 


 

join의 종류와 개념에 대해서 알아보았습니다.

 

참고 출처

 

https://sparkdia.tistory.com/17

https://mainichibenkyo.tistory.com/74

https://velog.io/@gillog/ANSI-SQL%EC%9D%B4%EB%9E%80

https://www.tutorialgateway.org/sql-cross-join/

https://myjamong.tistory.com/174

https://365datascience.com/tutorials/sql-tutorials/sql-self-join/

https://continuous-development.tistory.com/24