개발/기타 개인 공부

SQL 기본 2. Outer/Non Euqi Join

잠수돌침대 2022. 12. 19. 16:31

Inner Join은 뭔데?

 

첫 번째 장에서 다루었던 Join에 대한 내용이 Inner Join에 대한 내용이었다.

테이블 A와 B의 Join 방향은 어느 방향으로 가든 그 결과는 같다는 이야기 또한 했던 것으로 기억

 

이야기를 하기에 앞서서 Inner/Outer의 근본 개념

💡 A → B로 Join 되는 Table이라 할 때, A가 B 속으로 들어간다 하여 A를 Outer, B를 Inner라 칭한다.

 

여기서 Inner가 의미하는 것은 내부. 즉, A와 B가 모두 속하는 키값이 존재하는 경우에만 M 집합의 테이블을 구성하여 반환하는 것을 의미한다(1:M Join 기준).

출처 : https://www.programiz.com/sql/inner-join

상기 테이블은 키값이 되는 customer_id와 customer의 컬럼을 이용하여 Join을 시킨 결과이다.

결과에서도 보다시피 각각의 공통분모에 해당되지 않는 1,2,4,10,6,8 값에 대해서는 배제하는 것을 알 수 있다.

💡 이를 배제하게 됨으로 Null(결측치)를 최소화할 수 있는 장점이 존재하는 Inner Join

 

하지만 상황에 따라서는 배제되는 값 또한 결과값으로 출력하고 싶은 상황이 충분히 발생할 것이다.

이러한 이유로 존재하는 Outer Join

 


Left (Outer) Join

출처 : https://www.programiz.com/sql/left-join

 

Left 값에 해당되는 A(상기 그림에서는 Customers 테이블)을 기준으로 Join 되어 작성되는 것을 알 수 있다.

기준 Table인 Customers를 모두 살리되, 공통점이 있는 부분에는 값을 넣고 아니라면 Null 값을 넣는 Left Outer Join

 

여기서 Outer는 어떤 테이블을 기준으로 덮어씌울 것이냐?라는 의미로 해석해도 이해에 많은 도움이 될 것 같다.

 

💡 Outer라는 표현은 SQL 작성 시 실제로 작성을 하지 않아도 무방하다.

이를 이용하여 데이터의 정합성을 체크하고 싶을 때 많이 사용하는 방법이기도 하다.

 


Right (Outer) Join

출처 : https://www.programiz.com/sql/right-join

 

원리는 상기 Left (Outer) Join과 완전히 같음. 하지만 Left Join의 위치를 바꾸는 것으로 충분히 활용이 가능하기 때문에 Left/Right 모두를 사용하는 것은 헷갈릴 여지가 있다. 알고만 넘어가도록 하자.

 


Full (Outer) Join

 

출처 : https://www.programiz.com/sql/full-outer-join

 

사실 여기까지 오면 어느 정도 감이 잡힌다. 때려 박을 수 있는 모든 것을 때려 박는 Full Outer Join

Batch Processing에서 많이 사용하는 기법이자, 데이터의 손실이 하나도 일어나지 않는다는 특징을 가진다.

하지만 다른 Join에 비해 많은 결측치가 발생할 수 있는 것은 흠.

 

 

위의 Join을 통해 상황에 따라 어떠한 방식을 사용할 것인지, 사용한다면 (Inner) Join, Left, Full Join 정도로 버무려 사용하는 것이 실무적으로 도움이 많이 될 것 같다.

 


Non Equi Join

 

Equi Join : Join 시 연결하는 키값이 서로 같은 경우를 Equi Join이라고 함

등호로 연결되는 상태(=)이며 2장까지 진행했던 모든 Join은 Equi Join이라고도 할 수 있음

 

Non Equi Join : 키 값으로 연결시 등호가 아닌 다른 연산자(Between, >, >=, <. <=)를 사용하는 Join

 

Between Join : 범위값에 해당하는 컬럼값을 주어 Join 시키는 방법

-- 상기 생략
from a.table_a a join b.table_b on a.salary
between b.low_limit and b.high_limit

 

Cross Join(Cartesian Product Join) : 가능한한 모든 연결을 이용하여 결합하는 Join 방식

N열의 테이블A와 M열의 테이블 B를 Cross Join 한 결과는 N*M 크기의 테이블

select a.*, b.* from table a cross join table b

 

 


여기는 실습을 진행하면서 알아두면 좋을 SQL 문법들

데이터가 존재하지 않은지를 확인하기 위해서는 is null을 사용하면 된다

-- 상기 생략
where a.customers_id is null;

 

COALESCE : null 값을 다른 값으로 대체하기 위해 사용하는 키워드

해당 키워드를 사용하게 되면 컬럼 이름도 날아가기 때문에 as를 붙여 이름을 다시 지어줘야 한다.

아래의 코드는 null값을 0으로 바꾸어주는 코드

select coalesce(b.customer_id, 0) as customer_id