문법
문자 포맷이 다를 경우, 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))
데이터 타입에 유의해서 문법을 사용해야한다!
