본문 바로가기
TIL/SQL

23.04.07

by J1-H00N 2023. 4. 7.

subquery(query문 안에 들어가는 query문)사용법 (tab키를 이용해 들여쓰기 신경쓰기)

1. where 문에서 이용

SELECT * from users u

WHERE user_id in (

    select user_id from orders o

    WHERE payment_method = 'kakaopay'

)

2. select 문에서 이용

select checkin_id,

           user_id ,

           likes,

           (

           select avg(likes) from checkins c

           where user_id = c.user_id

           ) as avg_likes_user

    from checkins

3. inner join 문에서 이용

select pu.user_id, pu.point 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

subquery문을 테이블 a로 두고 pu의 user_id와 a의 user_id를 기준으로 이음

 

with를 이용해서 subquery에 임의의 이름을 만들어서 쿼리문을 더 간결하게 만들어준다

 ex)

select c.title,

          a.cnt_checkins,

          b.cnt_total,

          (a.cnt_checkins/b.cnt_total) as ratio

from

(

      select course_id, count(distinct(user_id)) as cnt_checkins from checkins

      group by course_id

) a

inner join

(

      select course_id, count(*) as cnt_total from orders

      group by course_id

) b on a.course_id = b.course_id

inner join courses c on a.course_id = c.course_id

 

   ||

   ||

   ||

   ||

   ||

 

with table1 as (

select course_id, count(distinct(user_id)) as cnt_checkins from checkins

group by course_id

), table2 as (

select course_id, count(*) as cnt_total from orders

group by course_id

)

 

select c.title,

          a.cnt_checkins,

          b.cnt_total,

         (a.cnt_checkins/b.cnt_total) as ratio

from table1 a

inner join table2 b on a.course_id = b.course_id

inner join courses c on a.course_id = c.course_id

substring_index - 문자열 쪼개기

substring_index(쪼갤 문자열,'기준',1(기준 앞 문자열) or -1(기준 뒤 문자열))

ex)

select user_id, email, SUBSTRING_INDEX(email,'@',-1) from users u

substring - 문자열 분리하기

substring(분리할 문자열,분리 시작 위치,분리 끝날 위치)

ex)

select SUBSTRING(created_at,1,10) as date, count(*) from orders o

 

case - 경우에 따라 원하는 값을 새 필드에 출력하기 (js의 if문과 비슷한 느낌)

ex)

select pu.user_id, pu.point,

(case when pu.point > 10000 then '1만 이상'

when pu.point > 5000 then '5천 이상'

else '5천 미만' end) as lv

from point_users pu

 

 

마침내 SQL에 대해 기본적인 공부는 마쳤다

 

부트캠프가 끝나고, 혹은 실무 중에라도 정보처리기능사, 정보처리기사 자격증을 따기 위한 기반을 다진 것이다

 

후련하지만, 한편으로는 배운 내용들을 당분간 써먹지 않을텐데, 잊진 않을까 불안하다

 

나중을 위해서라도 이 일기를 되돌아보며 복습을 해야 할 것이다

'TIL > SQL' 카테고리의 다른 글

23.04.06  (0) 2023.04.06
23.04.05  (0) 2023.04.05
23.04.04  (0) 2023.04.04