본문 바로가기

허씨의 편람/자기개발

[개발일지] SQL 입문_4주차

1. Subquery 개념 익히기

   : Subquery란 SELECT, FROM, WHERE 절 하위의 작은 쿼리

    → 실행순서는 Subquery 돌리고 큰 Main query 순으로 진행된다

 

2. Where절의 Subquery : Where 필드명 in (subquery)

     → Where은 조건문, Subquery의 결과를 조건에 활용하는 방식으로 활용
         ⁕Subquery의 user_id 메인 query의 user_id 안에 있니? (Where절로 조건 형성)

 

   2-1) inner join을 활용한 기본 구문

         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';

 

   1-2) Where절 Subquery 활용

         SELECT u.user_id, u.name, u.email FROM users u 
         WHERE u.user_id in (
         select o.user_id FROM orders o
         WHERE o.payment_method = 'kakaopay'
         )

        ⁕Subquery의 user_id 메인 query의 user_id 안에 있니? (Where절로 조건 형성)

 

2. SELECT 절의 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

 

3. FROM 절의 Subquery

 

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

 

 

4. Subquery 퀴즈

   4-1.

     A. 포인트가 전체 평균보다 큰 유저 추출하기

     Q, SELECT * FROM point_users pu 
         WHERE pu.point > (
         SELECT round(avg(point),0)FROM point_users
          )
     ▶참고: SELECT round(avg(point),0)FROM point_users

 

   4-2.

    A. 이씨 성을 가진 유저의 포인트의 평균보다 큰 유저들의 데이터 추출하기

    Q-1. Inner join 활용

    SELECT * FROM point_users pu 
    WHERE pu.point > (
                             SELECT round(avg(point),0)FROM point_users pu
                             inner join users u on pu.user_id = u.user_id 
                             WHERE u.name like '이%'
                              )
 

    Q-2. Subquery 활용

    SELECT * FROM point_users pu 
    WHERE pu.point > (
                             select avg(pu.point) from point_users pu 
                             where user_id in(
                                                  select user_id from users where name like '이%'
                                                  )
                              )

 

SELECT c.checkin_id,
       c.course_id, 
       c.user_id, 
       c.likes,
       (select avg(likes) FROM checkins
        WHERE course_id = c.course_id 
       )
FROM checkins c

select course_id, avg(likes) FROM checkins c
group by course_id