훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com
Join
join |
join 또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다. 따라서 조인은 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어 낸다. JOIN은 2개의 테이블에서 각각의 공통값을 이용함으로써 필드를 조합하는 수단이 된다. -위키백과- |
지난 시간에 join 기본에 대해서 알아보았었습니다.
이번에는 join에 대해 더 자세하게 알아보겠습니다.
기본
데이터베이스에서 데이터는 다수의 테이블에 나누어서 저장되어 있습니다.
모델링 초기 과정에서 정보가 한 테이블에 모여있다고 하더라도 정규화를 거치면서 큰 테이블이 작은 테이블로 나뉘고 중복을 제거하며 작은 테이블로 나뉘게 됩니다. 그러므로 내가 원하는 정보가 한 테이블 안에 있지 않을 수 있습니다. 아니, 그런 경우가 대부분일 것입니다.
그래서 내가 원하는 정보를 얻기 위해서는 여러 개의 테이블을 관계 맺어 한꺼번에 끌어와야 하는 경우가 많습니다. 이럴 때 사용하는 것이 JOIN입니다.
JOIN은 레코드 간 연산이 아니라 테이블 단위의 연산으로, 테이블과 테이블을 붙여버리는 것입니다.
마지막으로 JOIN을 할 때, 왼쪽에 붙는 테이블을 드라이빙 테이블, 오른쪽에 붙는 테이블을 드리븐 테이블이라고 합니다.
표준 조인과 비표준 조인
표준조인과 비표준조인 |
표준 조인과 비표준 조인이 존재하는 이유는, DB마다 조금씩 조인하는 문법이 다르기 때문입니다. 예를 들어서 MySQL과 ORACLE에서 조인 문법이 조금 상이합니다. 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/
'Java' 카테고리의 다른 글
추상 클래스 & 인터페이스 (0) | 2021.05.11 |
---|---|
인터페이스 (0) | 2021.05.11 |
추상 메서드와 추상 클래스 (0) | 2021.05.11 |
(상속) 메서드 오버라이딩과 다형성 (0) | 2021.05.11 |
(상속) 메서드 오버라이딩과 동적 바인딩 (0) | 2021.05.07 |