학창 시절 즈음, 수학을 배우실 때 (최소 중학생 추정) 교집합에 관해서 배워보신 적이 있죠? 이번 포스팅에 관한 것은 그와 유사합니다. 하지만 대상이 변수나 숫자가 아니고 표기도 커브가 아니며, 여기에서는 테이블끼리의 집합을 뜻하는 것이죠.

(출처: LearnSQl.comhttps://bit.ly/3RW75kJ)
좀 전에도 말했듯, 이는 두 개 이상의 테이블들을 서로 연결하여 데이터를 검색하는 행위를 뜻합니다. 이는 그 테이블들을 하나인 것처럼 보여주며 데이터를 표시합니다.
이 Join을 사용하기 위해서는 아래와 같이 필수 조건들이 있습니다:
1. 두 개 이상의 테이블에 같은 컬럼 존재
2. 두 컬럼의 값은 공유되어야 한다
3. 기본 키 (Primary Key) & 외래 키(Foreign Key) 활용한다
이 기능에는 두 가지 방법이 있는데요. 함께 알아보시겠습니다.

먼저, 안에서 집합하는 형식인 Inner Join입니다. 이는 각 테이블의 조인 조건에 맞는 데이터만을 가져오는데요. 이를 단순히 말하자면, 교집합이라고 합니다.
조건에 맞는 데이터만 병합
코드 작성 법은 이러합니다. TABLE_ A / B는 예시입니다.

예시로 엔티티 관계도를 보시겠습니다.

자세히는 모르겠지만 EMPLOYEES 와 DEPARTMENTS 테이블이 서로 연결되어 같은 컬럼 값이 있는걸 아실 수 있습니다.
이를 통해 부서가 있는 사원을 그 부서의 이름과 함께 조회해보겠습니다.

위의 코드는 사원 번호, EMPLOYEES의 부서 번호, DEPARTMENTS의 부서 번호, 그리고 그 부서 이름까지 테이블에서 출력하는 모습입니다. 이는 EMPLOYESS의 테이블을 기준으로 해 불러오는데요. 같은 컬럼은 ON 문으로 설정해주어 둘이 일치함을 나타냅니다.
ON: 기준 되는 같은 컬럼 기입

위와 같이 잘 출력된 모습을 보실 수 있습니다.

반면에, Outer Join은 정반대의 이야기가 됩니다. 이는 조건에 일치하지 않는 데이터도 같이 select하여 표시해주게 되는데요. 데이터가 없으면 그저 NULL 값을 가져옵니다.
Inner Join과 다른 점을 설명드리자면, 이는 주가 되는 테이블이 무엇이냐에 따라 LEFT, RIGHT, FULL 로 세분화될 수 있습니다.
그림에서 보시다시피 각각 의미에 맞게 왼쪽, 오른쪽, 아니면 양쪽 테이블을 중심으로 드는지에 여부에 따라 데이터가 달라집니다. 하지만 Full Outer Join은 어차피 다 병합하는 거, 데이터로서의 의미가 없어져 거의 사용하지 않습니다.
왼쪽!
이름 그대로 왼쪽에 위치한 테이블이 주가 되는 Outer Join 방식입니다.
이는 조인 조건에 부합하는 조인 당하는 테이블 (오른쪽)에 있으면 해당 데이터를, 아니면 NULL로 불러옵니다.
아래의 표를 봅시다. 이는 정영훈이라는 동명이인의 사원들이 많은 사원 테이블과 자격증 테이블입니다.

Left Outer Join을 할 경우, 이처럼 두 테이블을 병합할 때 사원 테이블의 모든 데이터는 불러오지만, 자격증 테이블의 빈 값은 전부 NULL로 처리되고 사원이 없는 자격증은 나타나지 않는 것을 보실 수 있습니다.
이처럼 이는 주가 되는 테이블에만 모든 데이터를 불러오는 모습을 볼 수 있습니다.
작성 방법은 아래처럼 Inner Join 과 흡사합니다.

코드로 볼까요?

이는 Inner Join의 예시와 같으므로 쿼리 설명은 하지 않겠습니다.
단순히 Left Outer Join으로 바꿔주었을 뿐인데요, 이 역시 ON을 사용합니다. 그럼 어떻게 나타나는지를 볼까요?

나타나는 값은 Inner Join 과 비슷하지만, 제가 표시해둔 것처럼 NULL값을 가지고 있는 사원을 발견하실 수 있습니다. 이처럼 DEPARTMENT_NAME에 NULL이 있다면 휴직자, 혹은 퇴사자, 혹은 부서이동하는데 전산에 관리가 안 되었다 등의 이유를 생각해볼 수 있겠죠.
오른쪽!
이 역시 이름 그대로 오른쪽 테이블이 주가 되는 방식입니다.
조인 조건에 부합하는 데이터 뽑아오는 거 역시 Left Outer Join과 이하동문이지만, 이번에는 조인 당하는 테이블이 왼쪽인 겁니다.
위에서 봤던 표를 토대로 다시 Right Outer Join을 설명해보겠습니다.

이번에는 자격증 (License) 테이블에는 모든 데이터를 불러오고, 사원은 자격증이 있는 사람들만 불러온 모습을 보실 수 있습니다.
정보처리산업기사 자격증은 사원 테이블에는 기록되어 있지 않아 NUll값을 받아오게 됩니다. 또한, 오른쪽 테이블이 기준이기 때문에 자격증 수만큼의 사원만 불러옵니다.
작성 방법 역시 위와 흡사하며, RIGHT라고만 바꿔주시면 됩니다.

코드로 볼까요?

위의 Left Outer Join 예시에서 Right로만 바꿔준 모습입니다.
그럼 이 경우, 결과가 어떻게 나타나는지 볼까요?

Left 때에는 사원은 있지만 부서는 없는 경우 Null이 나타났었죠.
하지만 이렇게 Right Outer Join을 해주면 사원이 없는 부서들이 사원 번호와 사원명에 Null값을 부여합니다. 이의 경우, 부서는 신설되었지만 아직 사원들을 배치하지 않은 경우를 생각해볼 수 있을 것 같습니다.
양쪽!
이는 왼쪽도, 오른쪽도 아닌 양쪽 테이블이 주가 되며 기준이 됩니다. 이는 위와 같이 조건에 부합되는 데이터를 select하지만 부합당하는 테이블은 왼쪽, 아니면 오른쪽으로 양쪽 다 됩니다. 이렇기에 데이터에 큰 의미가 없어 사용되지 않습니다.
작성 방법은 위의 것들과 같습니다. 다만, Full로 바꿨을 뿐입니다.

여태껏 예시를 들었던 사원과 자격증 표를 보겠습니다.
Full Outer Join을 할 경우, 표시되는 값은 아래와 같습니다.

이렇게 어느 쪽도 주가 되어 없는 값은 전부 Null로 처리되어 나타나는 것과 모든 데이터들이 나타나는 걸 보실 수 있습니다.
코드로 볼까요?
Left / Right에서 Full로 바꿔봤습니다. 예시는 위의 것들과 일치합니다.

그럼 결과는 아래와 같습니다.

Left에서 나왔던 부서명의 Null 값과...

Right에서 나왔던 사원번호, 사원명의 Null 값이 Full을 통해 한번에 조회됩니다. 이건.. 정리하는 의미가 없겠네요.

(출처: ANSIhttps://www.ansi.org/)
우리가 현재 사용하고 있는 건 ANSI Join 입니다.
이는 미국 국립 표준 협회에서 **보편적으로 제공하는 SQL 문법인데요. 이를 보통 ANSI Query**라고 부릅니다. 우리가 사용하고 있는 Join도 이 ANSI이고, 이를 사용하는 경우가 대부분인데요.

(출처: 위키백과 https://bit.ly/3IgZbz8)
Oracle에서 제공하는 Join 문법 또한 존재합니다. 이는 아래와 같이 적용 방법이 다릅니다.

(출처: Qurosityhttps://bit.ly/3RS9NI6)
SQL은 데이터베이스를 관리하기 위해 만들어진 프로그래밍 언어라고 설명드렸었죠. 이를 위해 DBMS는 대부분 SQL을 사용합니다. 물론 DBMS의 특수성 때문에 사용법이 Oracle Join처럼 달라지기도 하지만 큰 틀에서는 나름대로의 보편성을 가집니다.
한 테이블 안에서도 Join을 할 수 있습니다.
자세한 설명은 아래의 예시를 봅시다.

위의 코드는 문제 그대로 사원이름과 그 사원의 관리자 이름을 출력하는 문제의 풀이입니다. 관리자 이름을 불러오는 것이라니, 생소하죠. 이는 어느 외부 테이블도 사용하지 않습니다.
오히려 안의 그 테이블에서 Inner Join을 해줘야 합니다.
Inner Join을 통해서 사원 번호와 관리자 번호를 대조시켜 그에 부합하는 데이터를 출력해야 합니다. 그럼 표시한 것처럼 Inner Join은 그대로 Employees 테이블이 되고 앨리아스는 e2인 관리자 이름 값을 출력할 수 있게 됩니다. 이에 더해 e2에서 FIRST_NAME(성도 상관없습니다.)을 불러와주면 됩니다.
그럼, 결과 값을 볼까요?

그럼 이리 성공적으로 사원의 이름과 그 사원의 관리자 번호로 조회한 관리자 이름까지 출력이 됩니다.
이로서 join에 대한 설명을 마칩니다. 다음 포스팅에서는 서브쿼리(SubQuery)에 대해 알아보겠습니다.