본문 바로가기

스터디/SQLD

[SQL] 문법 총정리 - 스파르타 코딩클럽

반응형

[where 절과 자주 함께 쓰이는 문법!]

① '같지 않음' 조건 !=
     느낌표는 부정을 의미함.
     *(예시) payment_method 필드에서 kakaopay 제외하고 보고싶어.
       select * from orders where payment_method != 'kakaopay'

② '범위' 조건 between
     *(예시) created_at 필드에서 7월 13일~7월 14일 주문데이터만 보고싶어.
       select * from orders where created_at between '2020-07-13' and '2020-07-15'

③ '포함' 조건 in
    *(예시) 1,3,5주차 사람들의 '오늘의 다짐'만 보고싶어.
      select * from orders where week in (1,3,5)

④ '패턴(문자열규칙)' 조건 like
    *(예시) gmail을 사용하는 유저만 보고싶어.
      select * from orders where email like '%gmail.com'
      ※ 문구 앞/뒤에 %를 붙이면, %앞/뒤 값을 포함하는 모든 데이터 라는 의미임.

 

[Group by 와 자주 함께 쓰이는 문법!]

① 동일한 범주에서 '최솟값' 구하기 Min
     *(예시) 주차별 '오늘의 다짐'의 좋아요 최솟값이 궁금해.
       select week, min(likes) from checkins group by week

② 동일한 범주에서 '최댓값' 구하기 Max
     *(예시) 주차별 '오늘의 다짐'의 좋아요 최댓값이 궁금해.
       select week, max(likes) from checkins group by week

③ 동일한 범주에서 '평균값' 구하기 Avg
     *(예시) 주차별 '오늘의 다짐'의 좋아요 평균값이 궁금해.
       select week, avg(likes) from checkins group by week

④동일한 범주에서 '합계' 구하기 Sum
     *(예시) 주차별 '오늘의 다짐'의 좋아요 합계가 궁금해.
       select week, sum(likes) from checkins group by week

 

 

[실전에서 유용한 SQL문법]

실전에서는 원하는 형태의 문자열이 존재하지 않는 경우가 많음. ⇒ 쪼개거나 변형이 필요함.

1-1. 문자열 쪼개보기 : SUBSTRING_INDEX

       이메일에서 '@'를 기준으로, 뒤에 붙은 문구만 출력

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

      SUBSTRING_INDEX(출력할 필드,'기준이 되는 문구',1(앞) 또는 -1(뒤))

 

1-2. 문자열의 일부만 출력하기 : substring

     created_at에서 일자만 출력

     Substring('출력할 필드', '시작 포인트' '시작포인트로부터 몇 글자까지 출력할건지')

     select order_no , created_at, SUBSTRING(created_at, 1, 10) as date from orders

 

     매일 개의 주문이 들어왔는지 세고싶다면? date로 묶고 count

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

     group by date

 

2. 조건문(CASE문): 경우에 따라 원하는 값을 필드에 출력해줌.

 

2-1. 포인트에 따른 메세지 출력

     select pu.user_id, pu.point,

     (case when pu.point > 10000 then '잘 하고 있어요'

     else '조금만 더 파이팅!' END) as msg

     from point_users pu

 

2-2. 포인트에 따른 레벨 구분

     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

 

3. 포인트에 따라 구분된 레벨별 숫자

     select a.Lv, count(*) as cnt from (

     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

     ) a

     group by a.lv

 

4. with절을 이용해 깔끔히 정리

    with table1 as

    (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 )

    select a.Lv, count(*) as cnt from table1 a

    group by a.lv

 

반응형