2024.11.08 TIL(AI 9기)

SMALL

[TIL]

SQL 강의

특정문자를 다른 문자로 바꾸기

  • 함수명 : replace
  • 사용 방법
replace(바꿀 컬럼, 현재 값, 바꿀 값)

 

원하는 문자만 남기기

  • 함수명 : substring (substr)
  • 사용 방법
substr(조회 할 컬럼, 시작 위치, 글자 수)

 

여러 컬럼의 문자를 합치기

 

  • 함수명 : concat
  • 사용 방법
concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)

 

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

 

 

1) [실습] 서울 지역의 음식 타입별 평균 음식 주문금액 구하기 (출력 : ‘서울’, ‘타입’, ‘평균 금액’)

select substring(addr, 1, 2) "서울",
		cuisine_type "타입",
		AVG(price) "평균금액"
FROM food_orders 
WHERE addr like '%서울%'
GROUP BY 1, 2 
#GROUP BY에 1, 2는 컬럼 순서대로 substring(addr, 1, 2), cuisine_type을 뜻하고, 온전히 다 적어줘도 된다.

 

 

2) [실습] 이메일 도메인별 고객 수와 평균 연령 구하기

SELECT SUBSTRING(email, 10) "도메인", #불러올 글자에서 마지막까지 모두 불러오려면 앞글자 숫자만 적으면 된다.
		COUNT(customer_id) "고객 수",
		AVG(age) "평균 연령" 
FROM customers
group by 1 #첫컬럼만

이 실습에서 선생님이 이메일 아이디 글자수를 맞춰두셔서 섭스트링에 10을 적을 수 있었지만, 만약에 글자수가 다르다면 어떻게 해야할지 의문이다.

 

그래서 이 부분을 질문방에 올려서 물어봤다.

답변 : substr과 instr을 통해 출력할 수 있다. instr은 지정한 값의 인덱스 위치를 나타낸다. instr(email, @)+1을 하면 email값의 @ 문자 뒤의 인덱스 값을 나타낸다.

select substr(email, instr(email, @) + 1)

 

 

3) [실습] ‘[지역(시도)] 음식점이름 (음식종류)’ 컬럼을 만들고, 총 주문건수 구하기

SELECT CONCAT('[',SUBSTRING(addr, 1, 2), ']',restaurant_name, '(', cuisine_type, ')'), 
	COUNT(1) 
FROM food_orders
group by 1

 

IF문

사용방법

if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
#예시1
select restaurant_name,
       cuisine_type "원래 음식 타입",
       if(cuisine_type='Korean', '한식', '기타') "음식 타입"
from food_orders

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

#예시3
select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인",
       count(customer_id) "고객 수",
       avg(age) "평균 연령"
from customers
group by 1

 

case문

여러번의 if문을 적용 한 효과

각 조건별로 적용 할 값을 지정해 줄 수 있다.

 

사용방법

case when 조건1 then 값(수식)1
     when 조건2 then 값(수식)2
     else 값(수식)3
end
#예시1
select order_id,
       price,
       quantity,
       case when quantity=1 then price
            when quantity>=2 then price/quantity end "음식 단가"
from food_orders

#예시2
select restaurant_name,
       addr,
       case when addr like '%경기도%' then '경기도'
            when addr like '%특별%' or addr like '%광역%' then substring(addr, 1, 5)
            else substring(addr, 1, 2) end "변경된 주소"
from food_orders

 

조건을 사용할 수 있는 경우

  • 새로운 카테고리 만들기
  • 연산식을 적용할 조건 지정하기
    • 수수료를 계산할 때 흔히들 현금 사용, 카드사용을 나누는데, 각각의 수수료율 연산식을 만들 때 if 문 혹은 case 문으로 각각 다른 수수료율 혹은 수수료 계산 방식을 적용할 수 있다
  • 다른 문법 안에서 적용하기
    • if, case 문 안에 다른 문법이나 연산을 넣을 수도 있지만, 다른 문법 안에 조건문을 넣을 수도 있다
    • 예를 들어 concat 문으로 여러 컬럼을 합칠 때, rating 이 있을 때는 rating 을 넣어주고 없을 때는 아무것도 넣지 않도록, concat 안에 if 문을 넣어줄 수 있다.
#긴 예시
select restaurant_name,
       price/quantity "단가",
       cuisine_type,
       order_id,
       case when (price/quantity <5000) and cuisine_type='Korean' then '한식1'
            when (price/quantity between 5000 and 15000) and cuisine_type='Korean' then '한식2'
            when (price/quantity > 15000) and cuisine_type='Korean' then '한식3'
            when (price/quantity <5000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식1'
            when (price/quantity between 5000 and 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식2'
            when (price/quantity > 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식3'
            when (price/quantity <5000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타1'
            when (price/quantity between 5000 and 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타2'
            when (price/quantity > 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타3' end "식당 그룹"
from food_orders

 

1. [실습] 지역과 배달시간을 기반으로 배달수수료 구하기 (식당 이름, 주문 번호 함께 출력)

(지역 : 서울, 기타 - 서울일 때는 수수료 계산 * 1.1, 기타일 때는 곱하는 값 없음 시간 : 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%)

SELECT restaurant_name,
	order_id,
	delivery_time,
	price,
	addr,
	case when delivery_time>25 and delivery_time<=30 then price*0.05*(if(addr like '%서울%', 1.1, 1))
	when delivery_time>30 then price*1.1*(if(addr like '%서울%', 1.1, 1))
	else 0 end "수수료"
from food_orders

 

 

 

 

 

LIST

'Today I learned' 카테고리의 다른 글

2024.11.11 TIL(AI 9기)  (2) 2024.11.11
2024.11.10 TIL(주말)  (0) 2024.11.10
본캠프 커리큘럼  (0) 2024.11.08
2024.11.07 TIL 4(AI_9기)  (3) 2024.11.07
2024.11.06 TIL 3(AI_9기)  (0) 2024.11.06