[Learning SQL] 내부 조인 vs 외부 조인

반응형
반응형

내부 조인과 외부 조인은 어떤 차이점이 있을까?
그림으로 그렸을때는 내부 조인과 외부 조인의 차이는 못느끼지만...

생각을 해보자

말 그대로 해석해보자.
내부 조인...

내부에서 조인을 한다는 것 같다.
그러니까

select * from block1;
select * from block2;

이러한 sql이 존재한다고 가정해보자.
그러면 내부니까...
보통은 내부조인은 다음처럼 작성한다.

select * from block1 b1
INNER JOIN block2 b2
ON b1.seq = b2.seq;

내부라는건...
뭔가 안에서 액션이 발생한다는 의미인데...
만약, 다른 요소가 존재하면 그것은 조인이 될까?

예를들어 block2에는 semi_color가 존재하는데
block1에는 semi_color가 존재하지 않는다고 생각해보자.
여기서 존재하지 않는다는 뜻은 열, 칼럼을 말하는 것이 아니라
데이터를 말하는 것이다.

 

내부 조인을 걸게 되면

이것이 모든 데이터는 아니고 특정 데이터를 가져온것이다.
그러면 이 두개를 내부조인을 걸면 어떤일이 발생할까?

애초에 block1에는 semi_color가 존재하지 않기 때문에 이 데이터는 조인을 걸수 없다.
왜냐하면 block1내부에는 semi_color라는 데이터가 존재할 수 도 없을 수 도 있기 때문이다.

그렇다면 이 데이터는 조인을 걸 수 없는 것일까?
그것은 아니다.

외부조인을 걸면 된다.

내부 조인이 내부에서 액션이 발생되는 의미라면
외부 조인은 외부에서 액션이 발생되는 의미로 해석해도 무방하다

block1입장에서는 semi_color라는 것이 외부에서 발생되어지는 것으로 해석할 수 있다.

외부조인은 다음처럼 작성한다.

select * from block1 b1
LEFT OUTER JOIN block2 b2
ON b1.seq = b2.seq;

참고로 외부조인은 left가 기준이다.
따라서

select * from block1 b1
LEFT JOIN block2 b2
ON b1.seq = b2.seq;

으로 작성해도 된다.

left의 의미는 나중에 말하도록 하고...
아무튼
위를 외부조인을 건상태로 그려보자,

확인 결과 모든 데이터의 칼럼을 만들어주는 것을 알 수 있다.

그러면 left의 의는 도대체 뭘까?
그것바로 방향이다. 어디를 기준을 가지고 잡을지 결정하면 된다.
쿼리를 다시 보자.

select * from block1 b1
LEFT JOIN block2 b2
ON b1.seq = b2.seq;

이것을 설명하기 위해서는 일부로 쿼리를 늘려보자.

select * from block1 b1 LEFT JOIN block2 b2 ON b1.seq = b2.seq;

이 말은 왼쪽에서 오른쪽으로 덮어쓰기를 한다는 의미다.
그러니까 block1에 있는 정보를 block2에 덮어쓰기 한다는 이야기다.
결국 이 말대로 하면 내부조인과 별 다를 게 없다.(지금 상황에서는)
물론 데이터가 더 추가 되면 이야기가 달라지겠지만 말이다.

반대로 right일 경우에는
block2에 있는 정보가 block1에 덮어쓰기 한다는 이야기다.

하지만 right보다는 left를 사용하는 것이 더 가독성이 있다.
왜냐하면 기준 값을 찾아야 되는데
항상 왼쪽이 기준이면 찾기 쉽기 때문이다.

그러니까 위 쿼리를 다음처럼 바꾸면 그림 과 같은 결과를 얻을 수 있다.

select * from block2 b2
LEFT JOIN block1 b1
ON b1.seq = b2.seq;

이것 말구
full outer join, natural join도 있지만.
잘 몰라서 포스팅을 하지 않으려 한다.

반응형

'sql' 카테고리의 다른 글

[database] ERD 표기 법 IE vs Barker  (0) 2022.02.13
[Learning SQL] 트랜잭션  (0) 2021.05.22
[Learning SQL] 내부 조인 vs 외부 조인  (0) 2021.05.12
[Learning SQL] 서브쿼리  (0) 2021.05.03
[Learning SQL] 그룹화와 집계  (0) 2021.04.28
[LearningSql] 집합 연산자  (0) 2021.04.20

댓글(0)

Designed by JB FACTORY