ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MySQL] 스파르타 코딩클럽 "엑셀보다 쉬운 SQL" 3주차
    DataBase/RDBMS 2022. 9. 18. 04:32

    이번주는 join을 배웠다-!

    join이란, 공통된 정보 (key값)를 기준으로 두 테이블을 연결해서 한 테이블처럼 보는 것이다.

    key는 두 테이블의 연결고리가 되므로 당연히 테이블 양쪽 모두에 존재해야 한다.

     

    자주 사용하는 join 개념에는 inner join과 left join이 있다. 

    쉽게 생각하면 inner join은 교집합, left join은 합집합이다.

     

    left join은 join 순서에 따라 결과가 달라지므로 inner join보다 까다롭다. 

    A테이블과 B테이블을 join(left join)할 때, A를 왼쪽에 두고 기준으로 삼으면 B에는 없는 정보가 발생할 수 있다.

    다시말해 A에 B가 붙을 때 A가 기준이기 때문에 A테이블은 온전히 보이지만 B테이블에는 NULL값이 발생할 수 있는 것이다. 

    따라서 A테이블에 B테이블을 붙일건지 / B테이블에 A테이블을 붙일건지, 붙이는 순서가 매우 중요하다.

    예제를 보면서 차근차근 곱씹어보자!

     

    EX1) 결제 수단 별 유저 포인트의 평균값 구해보기

    select o.payment_method

             , round(AVG(p.point))

    from point_users p

    inner join orders o on p.user_id = o.user_id

    group by o.payment_method;

     

    EX2) 결제하고 시작하지 않은 유저들을 성씨별로 세어보기

    select name, count(*) as cnt_name

    from enrolleds e

    inner join users u on e.user_id = u.user_id

    where is_registered = 0

    group by name

    order by cnt_name desc ;

     

    EX3) 과목 별로 시작하지 않은 유저들을 세어보기

    select c.course_id

             , c.title

             , count(*) as cnt_notstart

    from courses c

    inner join enrolleds e on c.course_id = e.course_id

    where is_registered = 0

    group by c.course_id

     

    EX4) 웹개발, 앱개발 종합반의 week 별 체크인 수 세어보기

    select c1.title

             , c2.week

             , count(*) as cnt

    from checkins c2

    inner join courses c1 on c2.course_id = c1.course_id

    group by c1.title, c2.week

    order by c1.title, c2.week;

     

    EX5) 8월 1일 이후에 구매한 고객들에 한해서 웹개발, 앱개발 종합반의 week 별 체크인 수 세어보기 

    select c1.title

             , c2.week

             , count(*) as cnt

    from courses c1

    inner join checkins c2 on c1.course_id = c2.course_id

    inner join orders o on c2.user_id = o.user_id

    where o.created_at >= '2020-08-01'

    group by c1.title, c2.week

    order by c1.title, c2.week;

     

    EX6) 7월10일 ~ 7월19일에 가입한 고객 중, 포인트를 가진 고객의 숫자, 그리고 전체 숫자, 그리고 비율을 보여주기

    select count(point_user_id) as pnt_user_cnt

             , count(*) as tot_user_cnt

             , round(count(point_user_id)/count(*),2) as ratio

    from users u left join point_users pu on u.user_id = pu.user_id

    where u.created_at between '2020-07-10' and '2020-07-20';

    * count에 대한 계산에서 NULL값이 있는 행은 제외된다.

     

     

    댓글

Designed by Tistory.