subquery는 하나의 쿼리 안에 또 다른 쿼리가 들어가는 것을 말한다.
select * from users u
where u.user_id in (select o.user_id from orders o
where o.payment_method = 'kakaopay');
카카오페이로 결제한 유저들만 보고싶을때 이렇게 쿼리를 작성하면 된다.
select c.checkin_id, c.user_id, c.likes,
(select avg(likes) from checkins c2
where c2.user_id = c.user_id) as avg_like_user
from checkins c;
오늘의 다짐 좋아요의 갯수가 평균보다 높은지 낮은지 알아보기 위한 쿼리
select pu.user_id, a.avg_like, pu.point from point_users pu
inner join (
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
) a on pu.user_id = a.user_id
유저별 좋아요 평균과 해당 유저별 포인트를 알기 위한 쿼리
select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from
(
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
) a
inner join
(
select course_id, count(*) as cnt_total from orders
group by course_id
) b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id
코스별 좋아요 갯수, 전체 비율을 알아보는 쿼리인데, 이걸 with절을 사용해서 조금 더 깔끔하게 정리할 수 있다.
with table1 as (
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
), table2 as (
select course_id, count(*) as cnt_total from orders
group by course_id
)
select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from table1 a inner join table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
email을 @을 기준으로 쪼개서, 첫번째 조각을 출력해달라는 뜻
select order_no, created_at, substring(created_at,1,10) as date from orders
SUBSTRING(문자열, 출력하고 싶은 첫 글자의 위치, 몇 개의 글자를 출력하고 싶은지)
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu;
포인트 보유액에 따라 다르게 표시해줄 수 있는 CASE 문법
생각했던 것보다 데이터를 분석하는 것의 첫걸음이 어렵지 않아서 할만했던 것 같다. 이후에 SQLD나 ADsP 시험에도 도전하고 싶다. 이제 내용을 다시 한번 복습하면서 배운 내용을 잊어버리지 않게 해야겠다.