걷기 시작한 Coding Novice

SQL

본격 쿼리 직접 작성해보기 2 (feat. inner join)

Spell 2022. 5. 31. 20:47

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

활용할 테이블을 먼저 찾아보자.

select *
from courses c

 

select *
from checkins ch

이 두 테이블이면 되겠다.


courses에 checkins 테이블을 붙이고, key는 course_id가 되면 좋겠다.

select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id


group by로 웹개발, 앱개발을 묶어 줘야겠다.

select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title


더 나아가서, week별로 묶어주는 것도 필요할 것 같다. 두 가지 항목을 group by로 묶어줄 땐, 콤마(,)를 사용하자.

select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week


이제 수를 세어야하니 count를 활용해주고, select을 활용해서 보기 좋게 수정하자.

select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week

별칭도 달아 주었다.


order by로 보기 좋게 오름차순으로 정렬해주면 더 좋을 것 같다. 여기서도 앱개발/웹개발 그리고 week가 연관성있게 정렬되어 있는게 좋으니, 콤마를 이용해서 함께 정렬해주자.

select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
order by c.title, ch.week


참고로 order by에서 ch.week에만 내림차순을 입힐 수 있다.

select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
group by c.title, ch.week
order by c.title, ch.week desc



2) 위에 연습한 웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보기에서 추가로 8 1일 이후에 구매한 고객들만 보기

위의 과정에서 살펴봤던 테이블은 courses 그리고 checkins 였다. 여기에 추가로 구매관련 테이블이 필요하겠다.

select *
from orders


즉, orders 테이블을 한번 더 checkins 테이블에 붙여주어야 한다. 그리고 8월 1일 이후에 구매한 주문만으로 추려줘야 한다.

일단 한번 더 inner join으로 붙여보자. chekcins와 orders 테이블에 user_id가 있기에, 이를 통해서 붙여줬다.

select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.course_id = o.course_id

 

이제.. orders 테이블에서 8월 1일 이후에 구매한 고객만 추려야 하니, 이는 created_at이 그 시점 이후여야 하겠다.

(여기서 created_at은 orders 테이블에 있는 필드다)

select *
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.user_id = o.user_id
where o.created_at >= '2020-08-01 00:00:00'


기존과 동일하게 묶어주고 세어주자. 보기 편하게 정렬과 별칭도 잊지 말고!

select c.title, ch.week, count(*) as cnt
from courses c
inner join checkins ch
on c.course_id = ch.course_id
inner join orders o
on ch.user_id = o.user_id
where o.created_at >= '2020-08-01 00:00:00'
group by c.title, ch.week
order by c.title, ch.week

 

여기 잠깐 짚고 넘어가야 할 것이 있다. SQL에는 같은 결과에 도달하는 방법이 여러가지다.
그래서 반드시 지금 쓴 쿼리만이 정답이 아니다. 이를 명심하자.
추가로, 이렇게 해봤다가 저렇게 해봤다가 콤마도 넣어보고 오류를 겪어보고 경험을 해보면서 결과를 도출해내는 것이니 천천히 접근해보자!