ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 기초 문법 2
    SQL 2024. 8. 6. 04:22

    SQL

     

    조건에 따라 포맷 다르게 변경하기

    select
    from
    where
    group by
    order by

     

    1. 데이터를 사용할 때 예전에 사용하던 값이어서 수정이 필요하거나 잘못된 값이어서 수정이 필요할 때가 있다.

     

    2. 혹은 주소 데이터에서 전체 데이터가 아닌 부분 데이터 값만 필요할 때가 있다. 예를 들어 서울시 강남구 도곡동 어쩌구.. 일 때 [서울] 만 가져오고 싶다거나 하는.

     

    3. 혹은 보고서를 작성할 때 사업장 명과 지역이 같이 나와야 할 때 '사업장' → '사업장 [지역]' 으로 문자 포맷을 변경해주고 싶을 때를 알아보자. 

     

     

    문자열 바꾸기 (replace)

    replace(바꿀 컬럼, 현재 값, 바꿀 값)

     

    코드를 예로 들면 이렇게 바꿔줄 수 있다.

     

    (식당 명의 ‘Blue Ribbon’ 을   ‘Pink Ribbon’ 으로 바꾸기)

    select restaurant_name "원래 상점명",
           replace(restaurant_name, 'Blue', 'Pink') "바뀐 상점명"
    from food_orders
    where restaurant_name like '%Blue Ribbon%'

     

    (주소의 ‘문곡리’ 를 →  ‘문가리’ 로 바꾸기)

    select addr "원래 주소",
           replace(addr, '문곡리', '문가리') "바뀐 주소"
    from food_orders
    where addr like '%문곡리%'

     

     

     

    원하는 문자만 남기기 substr (substring)

    substr(조회 할 컬럼, 시작 위치, 글자 수)

     

    예시 주소에서, 주소 전체가 아닌 '서울' 만 남기기

    select addr "원래 주소",
           substr(addr, 1, 2) "시도"
    from food_orders
    where addr like '%서울특별시%'

     

     

    참고로 원래 주소 데이터는 아래 addr이고,  substr(addr, 1, 2) 이 말은 addr 컬럼의 첫번째 글자 '서' 를 시작으로 글자수 2개를 가져오겠다는 뜻,  즉 '서울' 가져오겠다는 말이다.

     

     

     

    여러 컬럼의 문자를 합치기 count

    concat (붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)

     

    • 붙일 수 있는 문자의 종류
      • 컬럼
      • 한글
      • 영어
      • 숫자
      • 기타 특수문자

     

    만약, 아래와 같이 서울시에 있는 음식점명 앞에 [서울]을 붙여서] 수정하고 싶을 때,

     

    select restaurant_name "원래 이름",   
           addr "원래 주소",
           concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
    from food_orders
    where addr like '%서울%'

     

    이렇게 해줄 수 있다.

     

    concat안에 있는 있는 걸 뜯어볼까?

    ('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"

     

    1. [  이거 하나가 문자열이어서 ' ' 작은 따옴표 안에 넣어주고 쉽표로 구분해준거다.

     

    2. substring(addr, 1, 2) → 위에서 설명한 문자열의 일부만 가져온 것이다. 여기서는 주소 컬럼 addr첫번째 글자 '서' 부터 2개, 즉, 서울

     

    3.  '] ' 뒤에 띄어쓰기 까지 포함해줘서 작은 따옴표 안에 넣어줬다. 그래야 [서울] shake shack 이렇게 출력되니까.

     

    4. restaurant_name → 이건 이미 있는 컬럼 이기 때문의 별도의 작은 따옴표 ' ' 가 필요 없다. 위의 데이터를 보면 알 수 있듯 애초에 concat을 쓴 이유가 레스토랑이름 앞에 [서울] 이라는 문자열을 붙이고 싶어서 넣어준거다. 

     

    5. "바뀐 이름" 은 새롭게 지정해 준 컬럼명이다.

     


     

    조건에 따라 포맷을 다르게 변경해야 할 때 

     

     

    if 문

    if(조건, 조건을 충족할 때 할 행동, 조건을 충족하지 못할 때 할 행동)

     

    예를 들어 아래 코드는

     

    if ( addr like '%평택군%'  → 만약,  '평택군' 이라는 문자열이 들어간 주소 데이터가 있으면,

    , replace ( addr, '문곡리', '문가리' )  → addr(주소) 컬럼의 '문곡리'를 '문가리'바꾸고,

    , addr ) → '평택군'이 들어간 주소 데이터가 없으면 그냥 addr 주소 데이터 그대로 둬.

     

    라는 구문이다.  

     

    select addr "원래 주소",
           if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소"
    from food_orders
    where addr like '%문곡리%'

     


     

    조건별로 적용할 값을 지정해 줄 때

     

     

    case 문

     

    case when 조건1 then 값(수식)1
               when 조건2 then 값(수식)2
               .
               .
               .
               else 값(수식)3  end  새로 지정할 컬럼명

     

     

    예를 들어,

    음식 타입을 ‘Korean’ 일 때는 ‘한식’, 그 외에는 ‘기타’ 라고 지정하고 → end 로 마무리 해준 다음,  그 전체 컬럼값을 '음식 타입'으로 정해주는 코드를 작성하면 아래와 같다.

     

    select restaurant_name,
           cuisine_type "원래 음식 타입",
           case when cuisine_type='Korean' then '한식'
           else '기타'
           end as '음식 타입'
    from food_orders

     

     

     

    다른 예로, 음식 단가를 주문 수량이 1일 때는 음식 가격, 주문 수량이 2개 이상일 때는 음식가격/주문수량 으로 지정해서 써줄수도 있다.

    select order_id,
           price,
           quantity,
           case when quantity=1 then price
                when quantity>=2 then price/quantity end "음식 단가"
    from food_orders

     

    이렇게 되면 단가별 음식 가격을 알 수 있다.

     


     

    Data Type 오류 해결 방법

     

    데이터타입을 변경해줘야 할 떄 (문자열 → 숫자 / 숫자 → 문자열)

    --숫자로 변경
    cast(if(rating='Not given', '1', rating) as decimal) 
    
    --문자로 변경
    concat(restaurant_name, '-', cast(order_id as char))

     


     

     

    Subquery문

     

    말 그대로 Query 안에 sub 로 들어간 구문

    select column1, special_column
    from
        (
        select column1, column2
        from table1
        ) a

     

    사실.. 이건 해봐야 이해가 간다..

    안해보고 설명만 들었을 땐.. 이게 뭐람... 하는 생각만 들었다. 

    암튼, '너 이따가 좀 덜 힘들게 내가 지금 작업 해놓는거야~' 하는 느낌이 서브쿼리문이다.

     

    약간 뭐랄까.. 이따 갖다 쓰려고 자리 깔아놓는 느낌..?

     

     

     

     

     

     

    'SQL' 카테고리의 다른 글

    SQL 기초 문법 3  (0) 2024.08.06
    SQL 기초 다지기  (0) 2024.08.02
Designed by Tistory.