Day34 - JOIN

2021. 4. 2. 18:35Oracle 공부

오늘은 JOIN 에 대해서 알아 봅시다.

 

JOIN

 

위와 같은 테이블을 만든다면....?

job에 있는 값이 중복되어 있는 것을 확인 할 수 있습니다.

이럴 경우에, 만약 홍길동의 직업이 바뀐다면, job에 있는 내용을 전부 수정해야 합니다.

그리고, 이 데이터가 저장된 공간이 1개당 1원이라고 생각해 보죠. 만약, 홍길동의 데이터가 많다면, 그만큼 손해가 커지는 것 입니다.

 

그래서 위와 같은 테이블은 분해해서 만들어 주어야 합니다. (정규화)

- 장점 -

1. 중복을 피할 수 있다.

2. 홍길동의 직업을 변경할 때도 하나만 변경하면 전부 다 바뀐다.

3. 다른 홍길동이 존재한다고 했을 때, 알아보기 편하다.

4. info 테이블에 존재하지 않는 user를 가지고 있을 수 있다.

이렇게 분해한 테이블 들을 다시 합쳐서 사용하기 위해서 JOIN 이라는 기능이 있습니다.

 

먼저, 테이블을 아래와 같이 생성해 주세요

auth 기본키 ID , info 기본키 BNO

 

join 은 , 두 개의 테이블을 합치는 기능 입니다.

두 개의 테이블을 합칠 때는 기준이 되는 속성이 있어야 합니다.

기본키(PK) , 외래키(FK)

위의 두 테이블에서 auth의 ID가 기본키, info의 ID가 외래키가 되겠습니다.

 

SELECT 속성(Column) FROM 테이블1 JOIN 테이블2 ON 조건

 

INNER JOIN

※ INNER JOIN은 어제 했지만, 같이 정리하는게 좋을 것 같아서 한번 더 썻습니다.

 

INNER JOIN 은 조건이 서로 같은 행을 조회합니다. 교집합 이라고 생각해도 무방 합니다.

ON절에 온, info_id = auth_id 즉. info에 있는 id와 auth에 있는 id가 같은 행만 조회 하겠다. 라는 뜻입니다.

그런데, info에 있는 id와 auth에 있는 id. 2개 다 조회가 되었습니다. 원하는 속성만 조회하는 방법을 알아보도록 합시다.

SELECT 뒤에 조회하고 싶은 속성을 적어주면 되는데, JOIN 하고 있는 2개의 테이블이 같이 가지고 있는 속성이라면, 어떤 테이블의 속성인지 명시를 해주면 됩니다. info.id 처럼요

그리고, JOIN을 했을 때, 어떤 테이블이 가지고 있는 속성인지 사용자가 쉽게 확인할 수 있도록, 곂치는 속성 뿐 아니라, 조회할 속성 모두에 테이블을 명시해 주는 것이 좋다고 합니다.

 

※테이블 명이 길 경우, 별칭을 사용할 수도 있습니다.

위와 같이 'FROM 절 뒤에 테이블이름 띄어쓰기1칸 별칭이름' 으로 사용 해주시면 됩니다.

 

- join 된 테이블에 where 절 사용하기.

JOIN은 FROM절의 일부이기 때문에, JOIN 뒤에 WHERE를 사용해주면 됩니다

OUTER JOIN

OUTER JOIN 은 기준이 되는 테이블에 있는 행은 전부 다 조회합니다.

LEFT OUTER JOIN -> 왼쪽 테이블 기준

왼쪽 테이블인 info 에는 id가 null인 행이 있고, 오른쪽 테이블인 auth에는 없습니다. 이럴 때, 왼쪽 테이블인 info의 행은 그대로 가져오고, 오른쪽 행에는 null 을 붙여 줍니다.

 

RIGHT OUTER JOIN -> 오른쪽 테이블 기준

오른쪽 테이블인 auth에는 5번째 행 ID가 5인 행이 있는데, 왼쪽 테이블 info에는 없습니다. 이럴 때 오른쪽 테이블 auth의 행은 그대로 가져오고, 왼쪽 행에는 null을 붙여 줍니다.

 

FULL OUTER JOIN -> 양측 테이블 다 나옴

먼저, 왼쪽 테이블의 값을 가져오고, 오른쪽에 없는 행일 경우 null을 채운 후, 오른쪽에 안가져 온 행이 있다면 가져오고, 왼쪽에 null을 채워 줍니다.

양측 테이블이 다 조회된다고 생각하시면 되겠습니다.

 

CROSS JOIN -> 왼쪽 테이블 행 * 오른쪽 테이블 행 ( 잘못된 조인 )

잘못된 조인으로 알고만 있으면 된다고 합니다. 결과는 총 35행이 조회가 되는데, 왼쪽의 7행 x 오른쪽의 5행 입니다.

 

3개 테이블의 조인

이렇게 3개의 테이블이 있고, 각각 중복되는 속성(PK , FK)가 있다면, 같이 조회를 할 수 있습니다.

※ 조회되는 속성이 많기 때문에 따로, 결과값을 올리지는 않겠습니다.

 

이렇게, JOIN에 대해서 알아 보았습니다.

 

고생하셨습니다.