1. Subquery
Subquery 는 쿼리안의 쿼리라는 뜻으로, 하위 쿼리의 결과를 상위 쿼리에 사용하면, 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'
이렇게 볼 수 있는데, Subquery 를 사용하면
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'
)
이와 같이 조금 더 직관적으로 볼 수 있다.
2. Where 절에 들어가는 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')
이렇게 표현할 수 있다.
위의 코드를 통해 쿼리가 실행되는 순서를 이렇게 상상하면 편하다.
(1) from 실행: users 데이터를 가져와줌
(2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
(3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해 줌
(4) 조건에 맞는 결과 출력
3. Select 에 들어가는 Subquery
Select 는 결과를 출력하는 부분으로 기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 부이는 것에 사용합니다. (select 필드명, 필드명, (subquery) from))
예를 들어, '오늘의 다짐' 데이터를 보고 싶은데 '오늘의 다짐' 좋아요의 수가, 본인이 평소 에 받았던 좋아요 수에 비해 얼마나 높고 낮은지가 알고싶을 경우,
평균을 먼저 구하고,(user_id='4b8a10e6' 을 예시로)
select avg(likes) from checkins c2
where c2.user_id = '4b8a10e6'
그러면 이렇게 표현이 가능하다.
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
이 쿼리가 실행되는 순서를 보면,
(1) 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서
(2) select 안의 subquery가 매 데이터 한줄마다 실행되는데
(3) 그 데이터 한 줄의 user_id를 갖는 데이터의 평균 좋아요 값을 subquery에서 계산해서
(4) 함께 출력해준다!
4. From 에 들어가는 Subquery
From 은 내가만든 Select 와 이미 있는 테이블을 Join 하고 싶을 때 사용하면 된다.
우선 유저 별 좋아요 평균을 먼저 구하고
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
여기서 해당 유저별 포인트를 보고 싶다면
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
이렇게 볼 수 있다.
'스파르타 코딩클럽 > SQL' 카테고리의 다른 글
[스파르타 코딩 클럽] SQL 3주차 개발일지 (0) | 2021.07.05 |
---|---|
[스파르타 코딩 클럽] SQL 2주차 개발일지 (0) | 2021.06.28 |
[스파르타 코딩 클럽] SQL 1주차 개발일지 (0) | 2021.06.21 |