[TIL / 데이터관리] JOIN 3형제 INNER, LEFT, RIGHT. 이제 머리 속에 그려보자

알락·2022년 10월 20일
0

Data Banner

우선 MySQL의 JOIN 구문이라는 것을 주의하기 바란다

이번에 제대로 JOIN 사용 방법을 익혀서, 의도한 자료만 뽑아오기 위해 준비해봤다.

⌞ JOIN

JOIN, 테이블이 조금 늘어나기만 해도 JOIN을 금세 찾게 된다.
간단히 JOIN은 어떤 컬럼의 내용을 공유하는 테이블끼리, 해당 컬럼을 기준으로 테이블을 이어붙여주는 작업이다. 다음과 같이 수영장 고객 테이블과 방문 기록 테이블이 있다고 생각해 보자.

-> 수영장 고객 테이블

ID이름성별전화번호등록일
1AliceXX-XXX-XXXX2022-09-19
2BobOO-OOO-OOOO2022-09-19
3Charlieㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ2022-09-20

-> 방문 기록 테이블

ID고객ID방문날짜
112022-10-19
232022-10-19
322022-10-20
432022-10-20

이 두 테이블을 어떤 필요에 의해서 일치되는 수영장 고객 테이블의 고객 ID와 방문 기록 테이블의 고객 ID를 기준으로 횡으로 이어붙여보자.

-> JOIN 한 테이블

방문 ID방문날짜고객 ID이름성별전화번호등록일
12022-10-191ALICEXX-XXX-XXXX2022-09-19
22022-10-193Charlieㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ2022-09-20
32022-10-202BobOO-OOO-OOOO2022-09-19
42022-10-203Charlieㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ2022-09-20

위와 같은 테이블을 만드는 행위를 JOIN 이라고 한다.


⌞ JOIN 사용방법

-- MySQL JOIN 구문 사용방법
[LEFT or RIGHT or INNER] JOIN [테이블 명] ON [조건식]

사용하는 것은 위처럼 간단하다. 보통 JOIN 구문을 사용하기 이전에 다른 테이블 명이 오는 것이 일반적이다. 이외에는 서브쿼리로 만들어져 있는 테이블에 JOIN을 하는 방법 등도 있겠다.

JOIN을 이용하여 나타나는 결과는 결코 간단하지 않다.


⌞ 사용할 예제 설명

MySQL Example

위에서 설명했던 예제랑 거의 비슷한데 내용은 살짝 다르다.
CUSTOMER 테이블은 고객 ID, 이름, 성별,전화번호, 등록일, 마지막 방문 컬럼으로 구성되었다.
VISIT 테이블은 방문 기록 순번(ID), 고객 ID, 방문 날짜, 기록 수정 날짜 컬럼으로 구성되어있다.

현재 CUSTOMER 테이블에는 "JIN"이라는 이름을 갖고 있는 고객이 있는데, VISIT 테이블에는 해당 고객 ID가 없는 것으로 보아 등록 이후 방문한 적이 없는 고객이 존재한다는 것을 알 수 있다.


⌞ INNER JOIN

inner join pic

INNER JOIN은 구문 앞에 불려온 테이블과 이제 참조할 테이블을ON에 지정한 조건에 맞는 레코드만 찾아 컬럼을 이어 붙여 반환하는 테이블 연산이다.
사용할 때에 주의할 점은 모든 조건이 만족하는 레코드만 반환한다는 점이다.
만약 두 테이블 중 어느 한 쪽이라도 조건이 안 맞는 레코드가 있다면 해당 레코드는 버려진다.
다음의 예시를 살펴보겠다.

inner join example

"JIN"은 CUSTOMER 테이블에 존재하지만 JOIN 이후 사라져버렸다. 이는 VISIT테이블에 해당 고객의 정보가 아예 없기 때문이다.

⌞ LEFT JOIN

left join pic
LEFT JOIN은 구문 앞에 불려온 원본 테이블은 그대로 두고, 참조할 테이블의 레코드를 ON에 지정한 조건에 맞게 원본 테이블에 있는 레코드를 찾아 컬럼을 이어 붙이는 테이블 연산이다.
사용할 때에 주의할 점은 원본 테이블의 레코드는 그대로 존재한다는 것이다. 그래서 조건에 안 맞는 레코드에 억지로 컬럼을 이어 붙이면서 NULL값이 들어가 있는 것을 확인할 수 있다.
참조할 테이블의 레코드는 조건이 맞지 않는 다면 다 버려진다.
다음의 예시를 살펴보겠다.
left join example

확인해보면, 원본 테이블의 JIN이 살아있는 것을 확인할 수 있다. 대신 억지로 붙인 컬럼에는 NULL값이 들어가 있는 것을 확인할 수 있다.

⌞ RIGHT JOIN

right join pic
RIGHT JOIN은 참조하는 테이블을 그대로 두고, 원본 테이블의 레코드를 ON에 지정한 조건에 맞게 참조 테이블에 있는 레코드를 찾아 컬럼을 이어 붙이는 테이블 연산이다.
LEFT JOIN과 완전히 반대다.
현재의 준비한 예시는 사실 RIGHT JOIN을 제대로 보여줄 수 없는 예시다. 왜냐 하면 이어 붙일 테이블이 사실 원래 테이블의 CUTOMER_ID를 참조하고 있기 때문이다. 애초에 참조하고 있는 ID값이 같은 것을 찾아 이어 붙이는 작업이기 때문에 INNER JOIN과 결과가 다르지 않다.

⌞ JOIN 을 쓸 때 알면 좋은 점.

JOIN을 쓸 때 인지 해두면 좋을 팁들을 두 개 정리해 놓겠다.

1. 복잡합을 피하기 위해 고유한 값을 기준으로 JOIN 하자.

사실 이렇게만 사용하면 JOIN 사용은 걱정할 문제가 없다. 1:1 관계나 1:N 관게까지도 JOIN을 사용하면 결과가 예상되게 깔끔하게 사용 가능하다.

2. FOR 반복문처럼 작동한다고 생각하자.

LEFT JOIN을 기준으로 생각해보자.

  1. 원본 테이블의 첫 레코드부터 시작된다.
  2. 참조 테이블을 전체를 조회하면서 조건에 맞는 레코드를 찾는다.
    2-1. 조건에 맞는 레코드를 찾았을 경우 원본 테이블의 레코드에 해당 레코드를 횡으로 이어 붙인다.
    2-2. 또 조건에 맞는 게 생기면 마찬가지로 원본 테이블 레코드를 한 줄 더 추가하고 해당 레코드를 횡으로 이어 붙인다.
    2-a. 조건이 맞는 경우가 아예 없다면, 원복 테이블 레코드에 참조 테이블 컬럼만 NULL을 넣어 이어 붙인다.
  3. 참조테이블 전체를 조회했을 경우, 원본 테이블의 다음 레코드로 넘어간다.

INNER JOIN을 기준으로 생각해보자

  1. 원본 테이블 첫 레코드부터 시작한다.
  2. 참조 테이블 전체를 조회하면서 조건에 맞는 레코드를 찾는다.
    2-1. 현재 레코드와 조건이 일치하는 참조 테이블 레코드가 있다면 횡으로 이어 붙인다.
    2-2. 또 위와 같은 상황이 있다면 레코드를 추가하여 해당 참조 테이블 레코드를 이어 붙인다.
  3. 참조테이블 전체를 조회했을 경우, 원본 테이블의 다음 레코드로 넘어간다.

RIGHT JOIN은 생략하겠다.
위의 원리만 기억하고 있다면, 본인이 작성한 SQL문의 어떤 결과를 만들지 예상을 할 수 있게 될 것이다.

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!

0개의 댓글

관련 채용 정보