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 기준).
상기 테이블은 키값이 되는 customer_id와 customer의 컬럼을 이용하여 Join을 시킨 결과이다.
결과에서도 보다시피 각각의 공통분모에 해당되지 않는 1,2,4,10,6,8 값에 대해서는 배제하는 것을 알 수 있다.
💡 이를 배제하게 됨으로 Null(결측치)를 최소화할 수 있는 장점이 존재하는 Inner Join
하지만 상황에 따라서는 배제되는 값 또한 결과값으로 출력하고 싶은 상황이 충분히 발생할 것이다.
이러한 이유로 존재하는 Outer Join
Left (Outer) Join
Left 값에 해당되는 A(상기 그림에서는 Customers 테이블)을 기준으로 Join 되어 작성되는 것을 알 수 있다.
기준 Table인 Customers를 모두 살리되, 공통점이 있는 부분에는 값을 넣고 아니라면 Null 값을 넣는 Left Outer Join
여기서 Outer는 어떤 테이블을 기준으로 덮어씌울 것이냐?라는 의미로 해석해도 이해에 많은 도움이 될 것 같다.
💡 Outer라는 표현은 SQL 작성 시 실제로 작성을 하지 않아도 무방하다.
이를 이용하여 데이터의 정합성을 체크하고 싶을 때 많이 사용하는 방법이기도 하다.
Right (Outer) Join
원리는 상기 Left (Outer) Join과 완전히 같음. 하지만 Left Join의 위치를 바꾸는 것으로 충분히 활용이 가능하기 때문에 Left/Right 모두를 사용하는 것은 헷갈릴 여지가 있다. 알고만 넘어가도록 하자.
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
'개발 > 기타 개인 공부' 카테고리의 다른 글
SQL 기본 6. 서브 쿼리(Subquery, Where 절) (0) | 2022.12.29 |
---|---|
SQL 기본 5. Group by 응용(가공 컬럼, case when/rollup/cube) (2) | 2022.12.22 |
SQL 기본 4. 그룹/집계 함수의 이해 (2) | 2022.12.21 |
SQL 기본 3. 시간 정보와 추출(Date, Timestamp, Time, Interval) (0) | 2022.12.20 |
SQL 기본 1. Join 메커니즘(Inner) (0) | 2022.12.17 |