[LearningSql] 다중 테이블 쿼리

반응형
반응형

지금까지 단일 테이블에 대해 공부하였습니다.
테이블이 여러개라면, 어떻게 될까요?

이것을 우리는 JOIN이라고 부릅니다.
이것을 설명하기 위해서는 그림을 다시 그려야 될것 같습니다.

다중 테이블인 만큼 테이블도 2개를 준비하였습니다.
JOIN을 하는 방법은 여러개가 존재하지만,
여기에서는 내부 조인에 대해 학습할 예정입니다. 참고로 외부 조인은 추후에 공부할 예정입니다.

교차 JOIN

교차 JOIN은 2개의 테이블을 교차되었다는 뜻으로 데카르타 곱입니다.
그럼 위 그림을 교차 JOIN을 하게 되면 어떤 일이 발생할까요?

이런 끔찍한 혼종을 출력할 수 있습니다.
이것을 해석하면 윗줄 1번부터 7번까지의 인덱스가 하위 인덱스들을 가진다는 의미입니다.

sql구문으로 다시 작성해보죠.

select * from block1
JOIN block2;

그러니까 가로는 block1이 차지하고
세로열은 block2가 차지하게 됩니다.
다행히 sql구문을 출력하면 위 그림처럼 나오지는 않습니다.

idx color idx color
1 green 1 green
1 green 2 yellow
1 green 3 green
1 green 4 yellow
1 green 5 green
1 green 6 green
1 green 7 yellow

이 짓을 idx가 7이 될때까지 반복하면 됩니다.
이러면 위 그림이 조금이해가 될까요?

하지만 이 방식은 잘 사용되지 않는 방식입니다.
왜냐하면 지금 칼럼이 각각7개씩이기 때문에 기껏해야 총 49개이지만,
칼럼 하나가 666개이구 다른 하나가 9999개라면 6659334개의 데이터를 출력하게 되며,
또 다른 문제는 데이터의 양이 고정된다는 보장이 없다는 것입니다.
데이터는 계속 늘어나는데... 데이터가 각각 2개씩이었던것이 데이터가 하나씩 추가되면
출력되는 데이터는 4개에서 9개로 증가하게 되어집니다. 
분명히 데이터는 2개밖에 추가하지 않았음에도 불구하구요.

하지만 이 방식은 모든 조인의 기초가 되어지는 방법이기 때문에 알고 있으면 도움이 된다고 생각합니다.

내부 조인

본격적으로 내부조인에 대해 학습해봅시다.
내부조인의 가장 큰 특징은
두 테이블 모두 포함되어진다는 점입니다.

예를들어 다음과 같은 그림이 있다고 생각해봅시다.

두 번째 블럭에는 빨간줄이 존재하는것이 있지만 없는것도 존재합니다.
이것들을 조인을 시키면 다음과 처럼 나옵니다.

내부 조인을 학습하신분들은 아마  🤔 이런 표정을 지을 지도 모릅니다.
하지만 그림상으로는 이게 최선입니다.

이것으로 sql출력을 해보면 알 수 있는데...
그전에 내부 조인은 어떻게 작성하는지에 대해 알아봅시다.

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

이렇게 작성됩니다.
이것을 출력하면 다음과 같은 결과를 얻을 수 있습니다.

bock1.idx block1.color block2.idx block.color
1 green 1 green
2 brown 2 yellow
3 green 3 green
4 brown 4 yellow
5 green 5 green
6 brown 6 green
7 green 7 yellow

이런식으로 출력이 되어집니다.
그런데.. block2는 빨간줄이 존재하는 것을 알 수 있습니다.
참고로 block2의 테이블은 다음과 같습니다.

idx color line
1 green 1
2 yellow 0
3 green 1
4 yellow 1
5 green 0
6 green 1
7 yellow 1

애초에 block1에는 그런 칼럼이 존재하지 않기 때문에 출력이 되지 않는다는 것을 알 수 있습니다.
그러면 우리는 내부 조인이란 모든 테이블에 같은 칼럼이 존재해야 된다는 것을 알 수 있습니다.
만약, line에대한 정보도 추가하고 싶다면 외부조인을 사용하면 됩니다.

ANSI 표준

사실 INNER JOIN을 사용하지 않고 내부 조인하는 방법이 있습니다.
다음처럼 작성하면 됩니다.

select * from
block1 b1,block2 b2
where b1.idx = b2.idx;

어떻게 보면 이것이 더 간단하다고 느껴질것입니다.
왜냐하면 짧기 때문이죠.
하지만 여기에 조건이 추가 된다면 어떨까요?

select * from
block1 b1,block2 b2
where b1.idx = b2.idx
AND b1.color = 'brown';

생각을 해봅시다. 
어떤것이 조인할때 사용하는것이고 어떤것이 조건문인지 헷갈립니다.

그러면 위 방식은 어땠나요?
다시 한번 가져와보죠.

select * from block1 b1
INNER JOIN block2 b2
ON b1.idx = b2.idx
where b1.color = 'brown';

누가봐도 ON절에서 어떤식으로 조인하는지 결정하고
where에서 그외 조건들을 사용한다는 것을 알 수 있습니다.
이것은 SQL ANSI표준중 하나입니다.
물론 ANSI표준을 지키라는건 이와 같은 이유도 존재하지만,
만약 고대 sql조인문을 지원하지 않는 모던한 db라면 분명히 출력이 되지 않을 겁니다.
왜냐하면 모던 db들은 ANSI표준만을 지원할지도 모르거든요.

내부 조인은 테이블을 2개일때만 사용하는 것이 아니라
3개 이상일때도 사용이 가능하며,
심지어 자기자신이 스스로 참조하는 경우로도 사용할 수 있습니다. 이것을 셀프 조인이라고 부릅니다.

 

 

반응형

'sql' 카테고리의 다른 글

[Learning SQL] 그룹화와 집계  (0) 2021.04.28
[LearningSql] 집합 연산자  (0) 2021.04.20
[LearningSql] 필터링  (0) 2021.04.11
[Leaning SQL] select  (0) 2021.04.10
데이터 베이스 설계  (0) 2020.09.11

댓글

Designed by JB FACTORY