스파르타코딩클럽, [왕초보] 엑셀보다 쉬운, SQL 3주차 개발일지

Dongwoo Kim·2022년 2월 15일
0

스파르타코딩클럽
[왕초보] 엑셀보다 쉬운, SQL 3주차 개발일지

  1. join
    : 두 테이블을 매칭시킬때 사용
  2. inner join (교집합)
	select * from users u
    inner join point_users pu
    	on u.user_id = pu.user_id
  1. inner join 예제
	1) checkins과 courses 테이블을 join해서 통계치 내보기
		select c1.course_id, count(*) from checkins c1
        inner join courses c2
            on c1.course_id = c2.course_id
        group by c1.course_id

	2) point_users와 users 테이블 join해서 point순으로 정렬
    	select pu.user_id, u.name, u.email, pu.point
        	from point_users pu
        inner join users u
        	on pu.user_id = u.user_id
		order by pu.point desc
        
	3) naver 이메일을 사용하는 유저들의 주문 수를 성씨별로 보기
		select u.name, count(*) as cnt 
        	from orders o
        inner join users u
        	on o.user_id = u.user_id
        where o.email like '%naver.com'
        group by u.name
        
    quiz 1) 결제수단별 유저포인트의 평균값
    	select o.payment_method, round(avg(pu.point), 2) as avg_point
        	from point_users pu
        inner join orders o
        	on pu.user_id = o.user_id
        group by o.payment_method
	
    quiz 2) 성씨별 결제하고 시작하지 않은 유저의 수
    	select u.name, count(*) as cnt
        	from enrolled e
        inner join users u
        	on e.user_id = u.user_id
        where e.is_registered = 0
        group by u.name
        order by cnt desc
        
	quiz 3) 과목별 시작하지 않은 유저의 수
    	select c.course_id, c.title, count(*)
        	from courses c
        inner join enrolled e
        on c.course_id = e.course_id
        where e.is_registered = 0
        group by c.course_id
        
	quiz 4) 웹개발, 앱개발 종합반의 week별 체크인 수
    	select c1.title, c2.week, count(*) as cnt
        	from courses c1
        inner join checkins c2
        	on c1.course_id = c2.course_id
        group by c1.title, c2.week
        order by c1.title, c2.week

	quiz 5) q4에서 8월 1일 이후 구매한 고객들만 추출
    	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.create_at = o.create_at
        where o.create_at >= '2020-08-01'
        group by c1.title, c2.week
        order by c1.title, c2.week
  1. left join (차집합)
    : 어디에 무엇을 join할지 순서가 중요
	ex) 7월10일~7월19일에 가입한 고객 중 
    	포인트를 가진 고객의 숫자, 전체 고객 숫자, 비율
	select count(pu.point_user_id),
   		   count(u.user_id),
           round(count(pu.point_user_id)/count(u.user_id), 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'
  1. union
    : 동일한 field의 두 table을 합칠 때
		(
          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.create_at = o.create_at
          where o.create_at < '2020-08-01'
          group by c1.title, c2.week
          order by c1.title, c2.week
		)
        union all
        (
          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.create_at = o.create_at
          where o.create_at >= '2020-08-01'
          group by c1.title, c2.week
          order by c1.title, c2.week
       	)
  1. 소감
    : 처음으로 예제나 퀴즈를 풀며 막히는 부분이 생겼다. where과 group by는 지난주 내용이었지만 이번주 예제를 풀며 쿼리문이 실행되는 순서를 익히며 where가 group by보다 먼저 와야한다는 사실을 알 수 있었다. 또한 quiz5에서 두번째 inner join의 조건을 user_id가 아니라 course_id로 하여 이상한 테이블을 만든 경우도 생겨 질의에 맞는 조건으로 조인해야한다는 것을 알 수 있었다. 또 where절에서 시간에 ''을 붙이지않아 제대로 작동하지 않는 경우도 있었다. 마지막으로 left join의 예제에서 '7월10일~ 7월19일'의 표현을 between으로 표현하는 것을 까먹고 where u.created_at >= '2020-07-10' and u.created_at <= '2020-07-19'로 표현했고 이마저도 u.created_at < '2020-07-20'으로 표현해야 하는 걸 틀렸다. 시간표현에 있어서 좀 더 주의를 기울여야겠다.
profile
kimphysicsman

0개의 댓글