데이터 분석 TIL - sql join 방식의 습관 차이가 협업에 도움이 될까?

테리·2025년 11월 7일

1. 학습 키워드

  • sql join 방식의 습관 차이
  • window 함수를 사용해서 풀어보자

2. 학습 내용

sql join 방식의 사소한 습관 차이

오늘은 sql에 대한 복습과 사소한 습관 차이를 기록하려고 한다. 나는 그동안 특별한 경우가 아니면 join을 먼저 한 후에 조건에 맞는 필터를 걸어주는 방식으로 하는 것이 익숙했다.
하지만 학습 과정에서 sql 쿼리 작성이 익숙한 경우에는 이 방법이 간단하게 작성해서 좋긴 하지만, 다른 사람과 쿼리를 함께 공유할 때는 어려움이 발생할 수 있기에 필터링을 해준 테이블을 join 하는 방법을 추천받았다.
아래 예시를 살펴보자.

5번 문제: 게임 계정별 보유 캐릭터수 및 평균 결제 금액을 구하는 과제

조건 1)

  • users 테이블에서 서버번호가 2 이상인 데이터를 구하기
  • 그리고, payment 테이블에서 결제방식이 CARD 인 경우의 게임계정별 결제금액 합계를 구하고 이름을 total_amt 로 지정
  • 그 다음,이 조건 모두를 만족하는 경우를 알맞은 방식으로 join

내가 작성한 조건1의 쿼리는 빨간 상자, 그리고 그 안의 파란 상자 부분이다.

  • user라는 테이블을 아무런 필터링 없이 그대로 사용하고 payment 테이블만 조건에 맞춰 필터링 한 뒤 join을 했음을 알 수 있다.
    물론 join 이후에 서버번호가 2 이상으로 필터링 할 수 있지만 이렇게 쿼리를 작성하게 되면 사고의 흐름은 아래와 같다.
    'user 테이블과 필터링한 payment 테이블을 join 하는 구나 → 그리고 서버번호가 2 이상인 데이터만 필터링 하네

하지만 user 테이블을 처음부터 필터링해서 join을 하는 경우를 살펴보자.

  • 사고의 흐름은 아래와 같다.
    서버번호가 2 이상인 유저 테이블과 필터링한 pyment 테이블을 join 하는구나
    쿼리가 조금 더 길어질 수 있지만 처음부터 필터링 된 테이블을 사용하기 때문에 처음 해당 쿼리를 접하는 사람이 조금 더 수월하게 쿼리를 이해할 수 있다.

정답이 있을까?
정답은 없다. 나는 기존에 내가 작성한 쿼리 방식에 이미 너무 익숙해져 있어서 해당 방식으로 이해하는 것이 어렵지는 않다. 하지만 더 복잡해 지는 쿼리의 경우에는 분명 처음보는 동료의 입장에서는 시간이 조금 더 필요한 부분은 분명히 있을 것이기에 서브쿼리를 많이 사용해야 하는 경우에는 행당 방식을 더 생각하면서 쿼리를 작성해야겠다.

window 함수를 사용해서 풀어보자

6번 문제: 서버별 마지막 접속일자-첫 접속일자 평균

기존의 방법 말고 window 함수를 사용해보자!
조건1)

  • user 테이블에서 게임계정, 첫 접속일자, 서버번호를 추출.
  • 단, ip 주소가 70으로 시작하는 경우만 필터링.
  • 그리고, 계정별로 첫 접속일자가 여러개인 경우는 알맞은 서브쿼리를 사용하여 계정당가장 작은 날짜 1개만 반환

위 조건에 맞게 내가 작성한 쿼리문은 아래와 같다.

하지만 조건에 맞춰 쿼리를 작성하는 것을 떠나서 window 함수를 사용해서 조금 더 간단하게 다시 작성해보면 아래와 같다.

평소 윈도우 함수 사용을 습관화하지 않아서 문제를 볼 때 바로 떠오르지는 않지만 이런 방법으로도 풀 수 있음을 확인해봤다.

3. 배운점

  • 쿼리를 작성할때 무조건 짧고 간결하게 작성하는 것이 좋은 것으로 생각했다. 하지만 목적에 따라서 꼭 그렇게 하는 것만이 좋은 것은 아니란 것을 알았다. 협업의 상황을 생각 하면서 쿼리를 작성해보자.

0개의 댓글