brunch

You can make anything
by writing

C.S.Lewis

by 김유환 Oct 18. 2019

20. JOIN 이해하기

데이터베이스에서 JOIN은 왜 필요하고 어떻게 사용하는 걸까?

배경

지난 글 외래키 이해하기 에서는 크게 묶여져있던 하나의 테이블을 나누는 과정을 보여드렸습니다. 하나의 테이블이 2개로 나누어지는 과정에서 서로 다시 연결할 수 있도록 연결 다리를 놓아둔 것이 외래 키(Foriegn Key)라고 설명했습니다. 우리는 중복된 데이터를 줄여 효율적인 구조를 만들기위해 테이블을 나눠야하는 이유도 이해했고 그 가교 역할을 외래키가 한다는 것을 이해했습니다.


하지만, 아직 나누어진 테이블을 어떻게 다시 합치는지는 다루지 않았습니다. 오늘 글에서는 데이터분석 과정에서 나누어졌던 테이블을 다시 조합하는 방법에 대해서 배워보도록 하겠습니다. 바로, 나누어진 테이블을 하나로 합치기 위해 데이터베이스가 제공하는 강력한 기능인 JOIN (조인)입니다.


JOIN 필요성

JOIN 문법에 대해 본격적으로 배우기 전에 언제 JOIN 기능이 필요한지 살펴봅시다. 지난 외래키 이해하기 글에서 다뤘던 예제를 다시 가져와봅시다. 아래와 같이 사용자와 관련된 정보만을 가지고 있는 사용자(users) 테이블이 있고, 주문 정보를 가지고 있는 주문(orders) 테이블이 있습니다. 주문 테이블에는 사용자 테이블을 참조하는 사용자 아이디가 외래키로 존재합니다.


JOIN 기능이 필요하지 않는 데이터분석 먼저 다뤄보도록 합시다. 장사가 얼마나 잘되는지 확인하기 위해서는 매일 팔리는 총 물량을 살펴봐야합니다. 매일 매일 들어온 주문의 총량 분석을 위한 SQL 문은 GROUP BY 기능을 사용해 아래와 같이 작성하면 됩니다. SUM 함수를 이용해 총 수량을 구했고, ORDER BY 기능을 이용해 날짜를 오름차순으로 정렬했습니다.


회사에서 판매 촉진을 위해 마켓팅을 시작하려고 합니다. 이때 마켓팅의 대상자가 남자로 할지 여자로 할지에 따라 포스터 색상, 문구, 판촉 제품 등이 달라질 것입니다. 이를 분석하기 위해서, 남자와 여자가 주문하는 총량을 비교해서 살펴보려고 한다고 가정합시다. 문제는 주문 테이블(orders)에는 사용자 아이디가 있지만, 해당 사용자가 남자인지 여자인지에 대한 성별 정보는 사용자 테이블(users)에 있습니다.


이 분석이 가능하기 위해서는 주문 테이블(orders)의 사용자 옆에 아래와 같이 성별 정보를 붙이면 될 것 입니다.

만약 위와 같은 테이블이 존재한다면, 아래와 같은 SQL 문을 작성하면 우리가 분석하고자하는 남자와 여자가 주문하는 총량을 구할 수 있을 것이기 때문입니다.

이렇게 테이블이 두개로 나누어져있을때, 하나의 테이블에서 정보를 가져와서 다른 테이블에 붙이는 기능을 JOIN 이라고 부릅니다.


JOIN 문법

이제 본격적으로 JOIN 기능을 SQL 문에서 어떻게 사용할 수 있는지 문법에 대해서 배워보도록 합시다.

FROM, JOIN

JOIN 은 2개의 테이블을 대상으로 합치는 기능이기 때문에 SQL 문에 2개의 테이블이 들어가야합니다. 이때 위에서 성별 주문 내역을 뽑았을때와 같이, 기준이 되는 테이블과 합치고자하는 테이블을 설정하시는게 좋습니다. 위에서는 주문 테이블이 기준이 되는 테이블이며, 사용자 테이블이 성별 정보를 가져오기 위해 합치고자 하는 테이블이었습니다. JOIN문에서는 기준이 되는 테이블명을 table1 위치에, 합치고자 하는 테이블명을 table2에 넣어주시면 됩니다.


ON

ON 은 어떤 열을 기준으로 테이블을 합치는 과정을 진행할지 설정하는 키워드 입니다. 하나의 테이블에서 다른쪽 테이블을 참조하는 열이 여기에 들어가면 됩니다. 위에서 남자와 여자가 주문한 내역을 구하기 위한 데이터분석에서는 사용자 아이디(user_id)를 기반으로 두개의 테이블을 합치기 때문에 ON에 user_id를 입력해주면 됩니다. 기준이 되는 테이블에서 사용자 아이디에 해당하는 열 이름과 합치고자하는 테이블에서의 사용자가 아이디에 해당하는 열 이름이 다를 수 있기 때문에, 각 테이블에서 해당하는 열의 이름을 입력하도록하고 있습니다.


JOIN 예제

지금까지 배운 문법을 기반으로 위에서 구하고자 했던 성별 주문 내역 쿼리를 작성해봅시다. 먼저 해야하는 것은 사용자 아이디를 기준으로 두개의 테이블을 합친 중간 결과 테이블을 구하는 것입니다. 기준으로 잡은 테이블은 주문 테이블(orders)이며, 합치고자하는 테이블은 사용자 테이블(users)이므로 아래와 같이 쿼리를 작성하면 됩니다.

SELECT 글에서 배운것처럼 별표(*)를 사용하면 테이블에 해당하는 모든 열을 선택하는 것을 의미합니다. 그러므로, 합쳐진 중간 테이블의 모습은 아래와 같습니다. 바로, 외래키 이해하기 글에서 2개의 테이블로 나누기 전 테이블의 모습과 동일합니다. 하지만, 여기에서 구한 중간 결과 테이블은 데이터 분석을 위해 잠시 DBMS 내부적으로 저장하고 있는 테이블이지 데이터베이스 저장소에 저장된 테이블이 아니라는 점을 기억하시기 바랍니다.

우리가 최종적으로 구하고자하는 분석 결과에 필요한 정보들인 성별, 주문 수량 데이터만 뽑기위해서는 아래와 같이 쿼리를 작성하면 됩니다. 위의 테이블에서 3개의 열만 선택한다고 생각하시면 됩니다.


이제 우리가 원하는 중간 결과 테이블이 만들어졌으니, 이 테이블을 GROUP BY 기능을 이용해 성별로 묶고, 각 성별에 SUM 함수를 적용해 원하는 결과값을 뽑으면 됩니다.


마치며

오늘은 두개로 나누어진 테이블을 하나로 합쳐서 데이터분석을 진행할 수 있는 기능인 JOIN 에 대해서 알아보았습니다. JOIN 은 이론상 간단해보이지만 실전에 들어가서 사용하다보면 SQL 에서 가장 어려운 부분입니다. 어려워지는 이유는 JOIN 이 되면서 나누어져있던 테이블들이 합쳐지다보니 중간 결과 테이블이 가지고 있는 값이 예상과 다른 경우가 많이 있기 때문입니다. 


이전에도 말씀드렸던바와 같이 복잡해지는 순간에는 테이블을 직접 손으로 그려서 시각화하는 습관이 많은 도움이 됩니다. JOIN 을 할때에는 항상 기준이되는 테이블을 왼쪽에 그리고 합치고자하는 테이블을 오른쪽에 그려서 붙이는 연습을 하는 것을 추천드립니다 :)

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari