SubQuery 란 쿼리문 안에 들어가는 쿼리문을 SubQuery라고 부릅니다.
실행하게 되면 SubQuery 부터 실행하여 결과를 생성하고, 이 결과를 가지고 외부의 쿼리문을 수행합니다.
Where절 SubQuery
1. kakaopay로 결제한 유저 출력하기
orders 테이블에는 결제 정보가 있고, users 테이블에는 유저 정보가 있습니다.
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'
아니면, orders 테이블에서 kakaopay로 결제한 사람들의 user_id를 얻고, users 테이블에서 이에 해당하는 user_id만 출력하는 방식도 가능하지 않을까요?
우선, kakaopay로 결제한 유저의 user_id를 가져와보겠습니다.
select user_id from orders
where payment_method = 'kakaopay'
users 테이블에서 위 결과로 출력된 user_id에 포함되는 user_id를 출력해보면, join을 사용한 방식과 같은 결과를 출력하는 것을 볼 수 있습니다.
select user_id, name, email from users
where user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
2. point가 평균보다 큰 유저 출력하기
point가 5000점보다 큰 유저를 출력하려면 다음과 같이 작성합니다.
select user_id, point from point_users pu
where point > 5000
평균보다 큰 유저를 구하기 위해서는 5000 말고 평균을 구하는 select문이 들어가면 됩니다.
select user_id, point from point_users pu
where point > (
select round(avg(point)) from point_users pu
)
Select절 SubQuery
1. 유저별로 평균 likes 수 구하기
checkins 테이블에서 유저별로 평균 likes 수를 구하고 싶을 때 group by를 사용할 수 도 있지만, SubQuery를 사용해 보겠습니다.
user_id를 지정하여 평균 likes를 계산하면 다음과 같습니다.
select avg(likes) as avg_likes_user from checkins
where user_id = '4b8a10e6'
위에서 작성한 쿼리문을 토대로 다음과 같이 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
From절 SubQuery
1.유저별로 point와 평균 likes 수 구하기
우선, checkins 테이블에서 group by를 사용하여 유저별 평균 likes를 구하면 다음과 같습니다.
select user_id, round(avg(likes),1) as avg_likes from checkins
group by user_id
이렇게 생성된 테이블을 a 라고 할 때, a 테이블과 point_users 테이블과 join 하면 됩니다.
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
group by user_id
) a on pu.user_id = a.user_id
'DB > SQL' 카테고리의 다른 글
[SQL] SUBSTRING_INDEX, SUBSTRING 문자열 데이터 다루기 (0) | 2023.03.21 |
---|---|
[DB/SQL] With절을 사용하여 임시 테이블 생성하기 (0) | 2023.03.21 |
[DB/SQL] UNION, UNION ALL 쿼리 결과 합치기 (0) | 2023.03.21 |
[DB/SQL] 테이블 Join, Inner Join과 Left Join이란? 예시를 통해 알아보자 (0) | 2023.03.21 |
[프로그래머스/SQL] 3월에 태어난 여성 회원 목록 출력하기 (0) | 2023.03.21 |