[sql][스파르타] 4주차 서브쿼리

Regina·2022년 10월 28일
0

SQL

목록 보기
8/9

where 절에 쓰는 서브쿼리

where 필드명 in (subquery)

select user_id, name, email, from users
where user_id in (
	select user_id from orders
	where payment_method = 'kakaopay'
)

서브쿼리를 작성할 때는 헷갈리지 않게 tab을 이용해서 코드를 보기 좋게 정리하는 것이 좋음.
괄호 안에 있는 서브쿼리(subquery)를 먼저 실행 -> 나머지 밖에 있는 것들을 실행함.

select 절에 쓰는 서브쿼리

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

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가 나올때마다 괄호안에 있는 서브쿼리가 실행되는 것임.

from 절에 쓰는 서브쿼리 (가장 많이 사용되는 유형)

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을 할 수 있음.

연습문제 1)

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 = '이**'
)

서브쿼리 안에 서브쿼리가 들어갈 수 있음.
위 두 쿼리는 똑같은 결과를 출력해낸다.
항상 탭으로 코드를 보기 편하게 정리해야 함.

연습문제 2)

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문 반복문 같은 느낌인데..

연습문제 3)

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.*

profile
하루하루 더 나은 사람이 되어보자

0개의 댓글