- 여러 책과 인터넷을 찾아보면서 공부하고 이해한 것을 정리하였습니다.
- 저도 공부 중입니다.. 틀리거나 이상한 부분이 있으면 댓글 달아주셔요..^^
- 새롭게 알게 된 부분이 있으면 꾸준히 업데이트하겠습니다.
[2] JOIN의 종류
뭔가 엄청 복잡해 보이시죠? 저도 매번 여기서 포기하고 했었는데 말이죠...ㅎㅎ 그러나 그렇게 걱정 안 하셔도 괜찮습니다. 지금까지 이해한 수준과 크게 다르지 않습니다.
그림을 간단히 설명하자면, 파란 부분은 해당하는 영역, 하얀색은 해당되지 않은 영역으로 이해하시고, 그리고 중학교, 고등학교 1학년 수학 맨 처음에 있던 집합을 떠올리시면 되겠습니다. JOIN의 개념은 집합과 같다고 봐도 무방하기 때문입니다.
일반적으로 조인은 위 그림 1과 같은 형태로 정리가 되는데, 두 집합 간의 가능한 경우를 모두 벤다이어그램으로 표현한 것입니다. JOIN은 크게 2가지로 구분되는데, INNER와 OUTER입니다. 윗 그림 1에서 안에 있는 A와 B의 교집합을 나타내는 것 하나만 INNER JOIN이고 나머지 밖은 모두 OUTER JOIN입니다. 그럼 이제 INNER JOIN부터 하나씩 알아보도록 하겠습니다.
(1) INNER JOIN
INNER JOIN은 조인될 조건이 부합하는 행만을 가지고 오는 것입니다. 즉, 위 그림 2에서의 가장 중간에 있는 교집합을 떠올리시면, 이해가 빠르게 될 것으로 생각합니다. 예를 들어 보겠습니다.
사원 테이블과 직책 테이블이 존재합니다. 이 상황에서 INNER JOIN을 수행해서 이 두 테이블의 모든 정보를 가지고 오려고 합니다. 이런 경우에는 어떻게 해야 할까요?
우선, 앞 글에서 언급했던, 포인트인 두 테이블의 관계를 연결해주는 연결고리가 필요합니다! 이것이 있으므로, 연결을 할 수 있기 때문입니다. 그 연결고리 역할은 여기서 공통적으로 들어 있는 직책 번호라는 칼럼(필드)이 되겠네요. 그러면 다음과 같은 SQL문을 작성할 수 있습니다.
-JOIN 명령어를 사용하는 방법은 아래와 같습니다.
-조인하려는 테이블 명을 JOIN을 기준으로 양쪽에 써줍니다.
-교집합이 되는 각 테이블의 칼럼명을 ON이나 혹은 WHERE로 위와 같이 명시해 줍니다.
SELECT * #해당되는 모든 컬럼을 가지고온다.
FROM 사원 # 사원테이블을 가져온다.
INNER JOIN 직책 # 사원테이블과 직책 테이블을 inner join한다.
ON 사원.직책번호 = 직책.직책번호; #사원테이블과 직책 테이블은 직책번호로 연결된다.
SELECT * #해당되는 모든 컬럼을 가지고온다.
FROM 사원 # 사원테이블을 가져온다.
INNER JOIN 직책 # 사원테이블과 직책 테이블을 inner join한다.
WHERE사원.직책번호 = 직책.직책번호; #사원테이블과 직책 테이블은 직책번호로 연결된다.
결과는 다음과 같습니다.
하나 참고할 점은 INNER JOIN은 두 테이블 간의 교집합, 즉 겹치는 칼럼이 존재하는 경우에만 사용이 가능하다는 점입니다. 그렇지 않은 경우는 어떻게 처리해야 할까요? 아래 OUTER JOIN이 그 역할을 해주게 됩니다.
(2) OUTER JOIN
우선 위 그림4를 보시면, OUTER JOIN이 무엇인지 바로 이해가 갈 수 있습니다. 해당되는 부분은 초록색으로 표시가 되어있습니다. 예전에 배웠던 차집합, 합집합이 떠오르실 것입니다.
OUTER JOIN은 INNER JOIN과 마찬가지로 두 테이블의 정보를 가지고 오게 됩니다. INNER JOIN은 단순히 교집합이 되는 칼럼만 가지고 오는 것이라면, OUTER JOIN은 조금 다른 관점을 가지고 있는데요.
1. 두 테이블 간의 교집합이 되는 데이터뿐만 아닌, 해당되지 않는 값까지 가져온다.
2. 드라이빙 테이블(처음으로 가져오는 기준이 되는 테이블)이 필요하다.
우선 기준 테이블과 대상 테이블이라는 명칭을 가지고 설명드리도록 하겠습니다. OUTER JOIN은 기준이 되는 테이블과 대상이 되는 테이블이 있습니다. 기준이 되는 테이블은 위에서 언급한 드라이빙 테이블로 됩니다.
OUTER JOIN은 기준이 되는 테이블의 모든 정보는 가지고 오고, 대상이 되는 테이블은 JOIN 조건이 일치하지 않아도, 가지고 오게 됩니다.
그렇다면 기준이 되는 테이블인 드라이빙 테이블은 항상 잘 선택해야 할 것 같습니다. 왜냐하면 테이블의 모든 영역을 가지고 오기 때문에, 쿼리의 성능에 있어서도 많은 영향을 끼칠 것이기 때문입니다.
OUTER JOIN의 일반적인 특징
1. OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 3가지가 존재
2. LEFT, RIGHT OUTER JOIN은 중간에 OUTER를 빼고 부르기도 한다.
자 이제는 예시를 들어, OUTER JOIN에 대하여 알아봅시다. 테이블은 아래와 같이 2개가 존재합니다. 왼쪽 살색은 A 테이블, 오른쪽 초록색은 B 테이블로 이름을 명명하도록 하겠습니다.
-LEFT (OUTER) JOIN
우선 LEFT OUTER JOIN을 알아보도록 하겠습니다.
LEFT OUTER JOIN은 기준 테이블을 왼쪽에 두고, OUTER JOIN을 수행하는 것입니다.
기준 테이블은 움직이거나 변형이 없고, 대상이 되는 테이블이 변형이 되는데요.
아래는 A LEFT OUTER JOIN B 쿼리입니다. 이를 통해 결과를 통해 이해하도록 하겠습니다.
SELECT *
FROM A
LEFT OUTER JOIN B
ON A.학번 = B.학번
결과는 아래와 같습니다.
하나씩 보도록 하겠습니다. 우선 살색으로 색칠된 부분이 제가 기준 테이블로 설정한 A 테이블, 즉 기준 테이블입니다. 이 기준 테이블에 학번이라는 연결고리를 가지고 B 테이블이 붙게 되는데요. 우선 INNER JOIN처럼 연결해 줍니다. 그렇게 되면 초록색 부분이 추가되는데요. 나머지 10, 21, 99학번 분들은 B 테이블에 존재하지 않기 때문에 아이디와 동아리 값이 없습니다. 그렇기에 NULL이라는 빈 값 표시로 칸이 채워지게 되는 것이지요.
-RIGHT (OUTER) JOIN
이번엔 RIGHT OUTER JOIN을 알아보도록 하겠습니다.
RIGHT OUTER JOIN은 기준 테이블을 오른쪽에 두고, OUTER JOIN을 수행하는 것입니다.
기준 테이블은 움직이거나 변형이 없고, 대상이 되는 테이블이 변형이 되는데요.
아래는 A RIGHT OUTER JOIN B 쿼리입니다. 이를 통해 결과를 통해 이해하도록 하겠습니다.
SELECT *
FROM A
RIGHT OUTER JOIN B
ON A.학번 = B.학번
결과는 아래와 같습니다.
이번에는 B 테이블이 기준이기에, 이를 모두 가지고 옵니다. 그러고 난 뒤, 학번으로 연결하게 되는데요. 그렇게 되면, A 테이블에는 11, 13, 14 학번이 없기 때문에 나이 성별 이름이 모두 NULL이 됩니다.
-FULL OUTER JOIN
이번엔 FULL OUTER JOIN을 알아보도록 하겠습니다.
FULL OUTER JOIN은 왼쪽과 오른쪽 테이블의 모든 데이터를 읽어 결과를 생성합니다. 즉, RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합한 결과라고 볼 수도 있습니다.
아래는 A FULL OUTER JOIN B 쿼리입니다. 이를 통해 결과를 통해 이해하도록 하겠습니다.
SELECT *
FROM A
FULL OUTER JOIN B
ON A.학번 = B.학번
결과는 다음과 같습니다.
A 테이블과 B 테이블 모두 들어가게 되고, 그것에 따른 빈칸들까지도 모두 NULL로 되어, 표현됩니다.
이렇게 JOIN에 대한 이야기를 알아보았습니다. 다음 글은 SELF JOIN이 되겠습니다. 감사합니다.
'DataBase > E.T.C.' 카테고리의 다른 글
[DB] ODBC라는 것은 무엇인가. (0) | 2022.02.12 |
---|---|
[SQL]SUBQUERY (0) | 2021.08.30 |
[1][SQL] JOIN 총 정리 - JOIN의 정의 (0) | 2021.07.16 |
[0][SQL] JOIN 총 정리 (0) | 2021.07.16 |
댓글