Subquery: 하나의 SQL 쿼리 안에 또다른 SQL 쿼리가 있는 것을 의미(데이터를 더 쉽게)
kakaopay로 결제한 유저들의 정보 보기
select u.user_id, u.name, u.email from users u
inner join orders o on u.user_id = o.user_id
where o.payment_method = 'kakaopay'
user_id를 모두 구해보기 → K
user_id가 K 에 있는 유저들만 골라보기
→ 서브쿼리
select u.user_id, u.name, u.email from users u
where u.user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
자주 쓰이는 Subquery 유형 알아보기
Subquery는 where, select, from 절에서 유용하게 사용!!
where 필드명 in (subquery)
쿼리가 실행되는 순서(확실히 숙지..)
(1) from 실행: users 데이터를 가져와줌
(2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
(3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
(4) 조건에 맞는 결과 출력
..어...려웅우워지네.......
From 에 들어가는 Subquery (가장 많이 사용되는 유형!)
-내가 만든 Select와 이미 있는 테이블을 Join하고 싶을 때 사용
유저 별 좋아요 평균
→ checkins 테이블을 user_id로 group by
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
유저 별 포인트
→포인트와 like의 상관정도를 알 수 있다
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
이때 부터 멘붕................ 평균값을 반올림 하면서 좋아요 를 나타내는데 여기서 group by 두는 위치 두기 힘들었다...
with 절로 더 깔끔하게 쿼리문을 정리
→코스제목별 like 개수, 전체, 비율
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
위의 코드를 보면서 공부!
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
실전에서 유용한 SQL 문법 (Case)
이메일 주소에서 @앞의 아이디만 가져오거나, @뒤의 이메일 도메인을 가져오고
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
이메일에서 이메일 도메인만 가져와보기
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
CASE: 경우에 따라 원하는 값을 새 필드에 출력해보기
포인트 보유액에 따라 다르게 표시해주기
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu;
ㅠㅠ
와!!!!!!!!!!!!!!!! 드디어 끝났다 너무 행복하다.. 근데 너무 어려웠다...
3주차 4주차 강의를 들을때 무슨 말이지 라는 생각이 먼저였고 지금은 아직도 어려운거 같다
점점 () 가로와 ,. 이런 코드들이 늘어나니 어디서 어떻게 활용 해야할지 어떤식으로 응용 해야할지 이 강의 만 보고는 이해하기 어려울거 같다 좀 활용 하다보면 익숙해질거같다!
댓글