select user_id, name, email, from users
where user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
서브쿼리를 작성할 때는 헷갈리지 않게 tab을 이용해서 코드를 보기 좋게 정리하는 것이 좋음.
괄호 안에 있는 서브쿼리(subquery)를 먼저 실행 -> 나머지 밖에 있는 것들을 실행함.
select c.checkin_id,
c.user_id,
c.likes,
(
select avg(likes) from checkins
where user_id = c.user_id
) as avg_likes_user
from checkins c
checkins 에서 checkin_id, user_id, likes가 나올때마다 괄호안에 있는 서브쿼리가 실행되는 것임.
select pu.user_id, pu.point, a.avg_likes from point_users pu
inner join(
select user_id, round(avg(likes),1) as avg_likes from checkins c
group by user_id
) a on pu.user_id = a.user_id
from절에서의 서브쿼리는, 마치 그 테이블이 있었던 것처럼 하는 게 서브 쿼리라고 봄.
만들고 싶은 테이블이 있으면 그걸 쪼개서 생각하면 됨. 따로 따로 만들어서 서브쿼리를 만들어서 join을 할 수 있음.
select * from point_users pu
where point > (
select avg(point) from point_users pu
where user_id in (select user_id from users u
where u.name = '이**')
)
select * from point_users pu
where point > (
select avg(point) from point_users pu2
inner join users u
on pu2.user_id = u.user_id
where u.name = '이**'
)
서브쿼리 안에 서브쿼리가 들어갈 수 있음.
위 두 쿼리는 똑같은 결과를 출력해낸다.
항상 탭으로 코드를 보기 편하게 정리해야 함.
select c.checkin_id,
c.course_id,
c.user_id ,
c.likes,
(select avg(likes) from checkins where course_id=c.course_id) as course_avg
from checkins c
아.. 풀긴 풀었는데 select 문에 서브쿼리 넣는게 조금 헷갈리네. for문 반복문 같은 느낌인데..
select checkin_id,
c2.title,
user_id ,
likes,
round((select avg(likes) from checkins where course_id=c.course_id ),1) as course_avg
from checkins c
inner join courses c2 on c.course_id = c2.course_id
나는 round를 바깥에다가 했는데, 아래와 같이 하면 좀더 깔끔해보임
select c.checkin_id,
c2.title,
c.user_id ,
c.likes,
(select round(avg(likes),1) from checkins where course_id=c.course_id) as course_avg
from checkins c
inner join courses c2 on c.course_id = c2.course_id
추가 팁 c2의 모든 것이 잘 붙었는지 확인해보자 c2.*