# JOIN

여러 데이터를 연결해서 데이터를 보고 싶은 경우 사용합니다.

TIP

Q) 왜 데이터는 여러 Table에 나눠서 저장되나요?

관계형 데이터베이스(RDBMS) 설계시 정규화 과정을 거칩니다. 정규화는 중복을 최소화하게 데이터를 구조화하는 프로세스로, 하나의 데이터는 한 곳에 있도록 만듭니다.

이런 이유로 데이터를 다양한 Table에 저장해서 필요시 JOIN해서 사용합니다.

데이터 분석하는 관점에선 미리 JOIN되어 있는 것이 좋을 수 있어서, 데이터 조직이 데이터 마트를 구축하는 과정에서 JOIN이 필요없도록 만드는 곳도 있습니다.

예를 들어 데이터는 다음과 같다고 가정하겠습니다

  • 고객(user) 테이블엔 고객의 가입일, 성별, 연령대 등이 저장
  • 주문(order) 테이블엔 언제 어느 고객(user)이 어떤 물건(product)들을 구매했는지, 어떤 쿠폰을 적용했는지 등이 저장
  • 물건(product) 테이블엔 물건의 가격, 물건의 이미지, 물건이 속한 카테고리 등이 저장

    1. 어떤 물건을 구매한 사람이 얼마나 되는가가 궁금한 경우
    • JOIN이 필요없고, 주문 테이블만 확인하면 알 수 있음

    1. 어떤 물건을 어느 성별, 어느 연령대에서 많이 구입하는지가 궁금한 경우
    • user 테이블과 order 테이블을 함께 봐야 알 수 있음

    1. 특정 연령대별로 구매하는 물건의 가격대가 다를 것이다
    • 예를 들어 10대는 저렴한 가격의 물건을 구매하고, 30대는 구매력이 있으므로 많은 것을 구매할 것이다라는 가설이 있는 경우
    • user 테이블과 order 테이블, product 테이블을 JOIN해서 봐야 알 수 있음

  • 문법 : FROM 절의 table1(왼쪽 테이블)에 JOIN table2(오른쪽 테이블)을 명시하고, ON에 JOIN할 때 사용할 Table들의 Key 명시
SELECT
	table_1.col1
	table_1.col2
	table_2.col11
	table_2.col12
FROM table1 AS table_1
LEFT JOIN table2 AS table_2
ON table_1.key = table_2.key

TIP

어떤 Key를 합쳐야하는지 어렵다면, Table의 컬럼을 천천히 확인해주세요

order 테이블에 다음과 같은 컬럼이 존재합니다

  • id
  • user_id
  • product_id
  • created_at
  • is_used_coupon
  • coupon

order.id = 다른 테이블에선 order_id로 사용됩니다

user_id = user 테이블의 id

product_id = product 테이블의 id

SELECT
	order.datetime AS datetime,
	product.id AS id,
	COUNT(product.id) AS product_cnt
FROM order AS order
LEFT JOIN product AS product
ON order.product_id = product.id
LEFT JOIN user AS user
ON order.user_id = user.id
GROUP BY datetime, id


# JOIN의 종류

JOIN은 어느 테이블을 기준으로 하는지, 혹은 공통의 값만 추출하는지 등에 따라 다양한 JOIN을 사용할 수 있습니다.

왼쪽 테이블을 기준으로 하는 경우 LEFT JOIN을 사용하고, 교집합을 추출하고 싶은 경우 INNER JOIN을 사용합니다.

JOIN이 처음이라면 LEFT JOININNER JOIN만 먼저 사용하시고, 그 후에 다른 방식을 확장하시는걸 추천합니다.

TIP

LEFT JOIN을 사용할 경우, LEFT Table엔 값이 존재하지만 RIGHT Table에 값이 존재하지 않는 경우

RIGHT Table의 컬럼에 NULL값으로 남습니다(JOIN해도 데이터가 없으니)



# JOIN 정리

SQL을 처음 공부하면 첫 고비는 JOIN이라 생각합니다. 이 부분은 계속 쿼리를 작성하며 연습하시면 빠르게 이해하실 수 있을거에요.

핵심은 내가 보고 싶은 테이블들을 "연결(JOIN)"하는 일

  • 어떤 테이블이 있을까?
  • 어떤 테이블을 연결해야 할까?
  • 어떤 테이블에서 공통의 값이 있을까?

ERD나 테이블의 관계를 직접 그려보시면, 더욱 수월합니다

JOIN이 어려운 것이 아니고 테이블 구조에 익숙하지 않아서 어려움을 느낄 확률이 높습니다