[개발일지-4] SQL 4주차

남승희·2022년 7월 8일
0

Subquery

subquery는 하나의 쿼리 안에 또 다른 쿼리가 들어가는 것을 말한다.

where 절에 들어가는 subquery

where 필드명 in (subquery)

select * from users u
where u.user_id in (select o.user_id from orders o 
					where o.payment_method = 'kakaopay');

카카오페이로 결제한 유저들만 보고싶을때 이렇게 쿼리를 작성하면 된다.

Select 절에 들어가는 subquery

select 필드명, 필드명, (subquery) from ..

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;

오늘의 다짐 좋아요의 갯수가 평균보다 높은지 낮은지 알아보기 위한 쿼리

From 절에 들어가는 subquery (가장 많이 쓰임!!)

이미 있는 테이블과 내가 만든 select를 합치고 싶을 때 사용

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

유저별 좋아요 평균과 해당 유저별 포인트를 알기 위한 쿼리

with

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

주로 from 절과 같이 쓰인다!

문자열, case

문자열

  • 쪼개기
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(문자열, 출력하고 싶은 첫 글자의 위치, 몇 개의 글자를 출력하고 싶은지)

CASE

select pu.point_user_id, pu.point,
case 
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu;

포인트 보유액에 따라 다르게 표시해줄 수 있는 CASE 문법

이렇게 SQL 강의가 4주차까지 마무리 되었다.

생각했던 것보다 데이터를 분석하는 것의 첫걸음이 어렵지 않아서 할만했던 것 같다. 이후에 SQLD나 ADsP 시험에도 도전하고 싶다. 이제 내용을 다시 한번 복습하면서 배운 내용을 잊어버리지 않게 해야겠다.

profile
조금씩 발전하는 (자기)개발자!

0개의 댓글