SQL #3

문법

 

문자 포맷이 다를 경우, SQL로 가공하기

 

데이터를 조회하다보면, Query 결과를 그대로 이용하지 못하는 경우가 발생한다. 그럴 때는 어떻게 해야 할까?

 

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

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

SELECT addr "원래 주소",
       REPLACE(addr , '문곡리', '문가리') "바뀐 주소"
FROM food_orders fo 
where addr LIKE '%문곡리%'

 

  • 원하는 문자만 남기기

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

SELECT addr "원래 주소",
       SUBSTR(addr, 1, 2) "특별시"
FROM food_orders fo 
WHERE addr LIKE '%서울특별시%'

 

  • 여러 컬럼의 문자를 합치기: 원하는 문자가 여러 컬럼에 있을 때, 하나로 합쳐친 형태로 만들 수 있다.

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

SELECT restaurant_name "원래 이름",   
       addr "원래 주소",
       CONCAT('[', SUBSTRING(addr, 1, 2), '] ', restaurant_name) "바뀐 이름",
       CONCAT(restaurant_name, ' - ', cuisine_type) "음식 타입 별 식당"
FROM food_orders fo 
WHERE addr LIKE '%서울%'

 

  • 조건에 따라 포맷을 다르게 변경

IF(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)

SELECT restaurant_name,
       cuisine_type "원래 음식 타입",
       IF(cuisine_type='Korean', '한식', '기타') "음식 타입"
FROM food_orders fo 

 

  • 여러가지 조건을 사용하고 싶을 경우

CASE when 조건1 then 값(수식)1 when 조건2 then 값(수식)2 else 값(수식)3 end

SELECT order_id,
       price,
       quantity,
       CASE when quantity=1 then price
            when quantity>=2 then price/quantity end "음식 단가"
FROM food_orders

 

퀴즈

서울 지역의 음식 타입별 평균 음식 주문금액 구하기

SELECT SUBSTR(addr, 1, 2) "지역", 
	   cuisine_type,
	   AVG(price) "평균 금액" 
FROM food_orders fo 
WHERE SUBSTR(addr, 1, 2) = "서울"
GROUP BY cuisine_type 

 

이메일 도메인별 고객 수와 평균 연령 구하기

SELECT SUBSTR(email, 10) "이메일",
	   COUNT(1) "고객 수", 
	   AVG(age) "평균 연령" 
FROM customers c 
GROUP BY 1 

GROUP BY에 컬럼 대신 SELECT에서의 컬럼 순서를 넣어도 상관없다.

 

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

SELECT CONCAT('[', SUBSTR(addr, 1, 2), '] ', restaurant_name, ' (', cuisine_type, ')') "지역 별 음식점 이름",
	   COUNT(1) "주문건수" 
FROM food_orders fo 
GROUP BY 1

 

10세 이상, 30세 미만의 고객의 나이와 성별로 그룹 나누기

SELECT CASE when (age between 10 and 19) and gender='male' then "10대 남자"
 			when (age between 10 and 19) and gender='female' then "10대 여자"
 			when (age between 20 and 29) and gender='male' then "20대 남자"
 			when (age between 20 and 29) and gender='female' then "20대 여자" END "그룹",
       age,
 	   gender 
FROM customers
WHERE age BETWEEN 10 and 29

 

지역과 배달시간을 기반으로 배달수수료 구하기

SELECT CASE when delivery_time>30 then price*0.1*(if(addr like "%서울%", 1.1, 1))
		 	when delivery_time>25 then price*0.05*(if(addr like "%서울%", 1.1, 1))
		 	else 0 end "수수료",
	   restaurant_name,
	   price,
	   addr 
FROM food_orders fo 

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

 

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

 

 

 

 

데이터 타입에 유의해서 문법을 사용해야한다!

'SQL' 카테고리의 다른 글

SQL #6  (0) 2024.11.28
SQL #5  (1) 2024.11.26
SQL #4  (0) 2024.11.26
SQL #2  (0) 2024.11.21
SQL #1  (1) 2024.11.14