스파르타/SQL

SQL_4주차_Subquery

옒르 2023. 1. 13. 18:28

1) Subquery란?

쿼리 안의 쿼리로, 한 가지 식으로 정리가 가능해져 SQL 쿼리가 훨씬 간단해진다

 

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 user_id,name,email from users u

where user_id in(

select user_id from orders o

where payment_method ='kakaopay'

)

 

2) 자주 사용되는 Subquery 유형

  • Where 에 들어가는 Subquery

-> where 필드명 in (subquery)

ex) 카카오페이로 결제한 주문건 유저들만, 유저 테이블에서 출력

select * from users u

where user_id in(

             select user_id from orders o

             where payment_method ='kakaopay'

)

+ 쿼리가 실행되는 순서

(1) from 실행: users 데이터를 가져와줌

(2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌

(3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌

(4) 조건에 맞는 결과 출력

 

  • Select 에 들어가는 Subquery 

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

select c.checkin_id ,

           c.user_id ,

           c.likes,

          (                                                        # 새로운 열을 만들어 밑에 실행되는 값을 추가해줌

           select avg(likes) from checkins  # select가 될 때마다 하나하나에 대해 다 Subquery가 실행됨

           where user_id =c.user_id

          ) as avg_likes_user

from checkins c

 

  • From 에 들어가는 Subquery (가장 많이 사용되는 유형!)  = 내가 만든 select문을 마치 원래 있던 테이블처럼 사용하는 것

ex) 유저별 평균 포인트를 구하시오

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     

->  # a 테이블에 속함

                   group by user_id  ->  # a 테이블에 속함

)a on pu.user_id = a.user_id       # a 테이블과 point_users 테이블의 user_id가 동일

 

+ 쿼리가 실행되는 순서

(1) 먼저 서브쿼리의 select가 실행

(2) 이것을 테이블처럼 여기고 밖의 select가 실행!