
이메일 도메인별 고객수와 평균 연령 구하기
이메일 주소가 다 달라서 어떻게 할지 막막했다..

이 때 substr을 이용하자
코딩하기 쉽게 이메일 주소를 모두 여덟 글자로 통일되어 있다.
select substr(email, 10) '도메인',
#열번째 글자부터 추출하는데 도메인 주소 글자 수가 다 다르다. 이 때 아예 넉넉하게 큰 숫자를 쓰거나 비워두면 제일 마지막 글자까지 출력할 수 있다.
count(1) '고객 수', #count는 group by로 묶은 것 중에 몇 명인지 확인할 수 있다.
avg(age) '평균 연령'
from customers
group by 1
#group by에 substr(email, 10)을 써줘도 되지만, 1을 쓰면 1열에 쓰인 코드대로 그룹을 묶을 수 있다.

Count(1) 명령문을 입력하면 어떤 기준으로 묶는지 궁금해서 혼자 이것저것 해봤다..
먼저 이름의 성과 성별로 묶은 후 count하면 두 가지 조건을 모두 포함한 사람 수가 출력되고,

Group by에 gender를 지우니, 성별이 표시되긴 하지만 성에 따른 사람수만 count되는 걸 확인할 수 있었다…!재미따
[지역(시도)] 음식점이름 (음식종류) 컬럼을 만들고, 총 주문건수 구하기

select concat('[', 'substr(addr, 1, 2)', ']', 'restaurant_name', '(', 'cuisine_type', ')')
from food_orders
이렇게 이상하게 출력됐다…

select concat('[', substr(addr, 1, 2), ']', restaurant_name, '(', cuisine_type, ')')
from food_orders
알고 보니 컬럼을 적을 때 ‘’안에 컬럼명을 적어서 그런 것..! 삭제했더니 알맞게 출력되었다.
조건에 따라 포맷을 다르게 설정하고 싶을 때에는 if절을 사용한다.

select restaurant_name,
cuisine_type "원래 음식 타입",
if(cuisine_type='Korean', '한식', '기타') "음식 타입"
from food_orders
if(원하는 조건, 조건을 충족할 때, 조건을 충족하지 않을 때)를 입력한다.

select addr "원래 주소",
if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소"
from food_orders
where addr like '%문곡리%'
#주소에 문곡리가 포함되는 데이터만 따로 뽑아서 ‘평택군’이 포함된 주소만 ‘문곡리’를 ‘문가리’로 바꾸고, 나머지는 그냥 원래 주소로 출력하는 코드…

메일 도메인이 gmail만 ‘@’가 빠져 있어, substr으로 글자수를 잘랐을 때 mail로 표시되어 수정하고 싶다.
select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인",
count(customer_id) "고객 수",
avg(age) "평균 연령"
from customers
group by 1
#gmail이 들어가면 gmail을 @gmail로 바꿔주고 그게 아니면 그냥 원래 이메일을 써줘. 그리고 이 수정된 컬럼을 열번째 글자부터 끝까지 출력해줘의 명령
이럴 경우에는 이렇게, 저럴 경우에는 저렇게 해줘하고 여러 조건을 다르게 걸고 싶다면 case절을 사용한다.

select case when cuisine_type='Korean' then '한식'
when cuisine_type in ('Japanese', 'Chinese') then '아시아'
else '기타' end "음식타입",
cuisine_type
from food_orders
음식 종류가 Korean일 때는 한식, Japanese, Chinese일 때는 아시아, 나머지는 기타로 출력하고 싶을 때
CASE WHEN 조건 THEN 출력값
WHEN 조건 THEN 출력값
(ELSE 나머지 출력값) END
CASE로 시작해서 END로 끝나고 그 안에 WHEN 조건 THEN 출력값이 들어간다.

select order_id,
price,
quantity,
case when quantity=1 then price
when quantity>=2 then price/quantity end "음식 단가"
from food_orders
수량이 한 개일 때는 가격을 그대로 출력하고, 두 개 이상일 때는 가격을 수량으로 나누어서 출력하고 싶다
ELSE절은 필수가 아니다.

10세 이상 30세 미만 사람들만 뽑아서 나이와 성별로 나누어서 출력하고 싶을 때

select case when price/quantity between 5000 and 15000 and cuisine_type='Korean' then "가성비_한식"
when price/quantity>=15000 and cuisine_type='Korean' then "가성비_안좋_한식"
when price/quantity between 5000 and 15000 and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnam', 'Indian') then "가성비_아시아식"
when price/quantity>=15000 and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnam', 'Indian') then "가성비_안좋_아시아식"
else "기타" END,
cuisine_type,
price
from food_orders
음식 단가와 종류별로 묶어서 분류하고 싶을 때
문제 설명만 보고 내가 직접 짠 코드
Then을 빼먹고 오타가 나 있었다…조심할 부분

배달시간과 지역에 따라 수수료를 계산하기
선생님 설명을 듣고 코드를 작성해보았다

배달할증료 붙이기
주중이면 3000원, 주말이면 3500원에 음식수량이 3개 이하면 추가 할증 없고, 3개 이상이면 1.2배 할증
에러가 떴다.

1.2배 앞에 을 붙였기 때문.
if앞에 을 붙였으므로 중복해서 적어줄 필요 없다
*SQL에는 문제가 없지만 data_type이라는 오류가 뜨는 경우가 있다.
이 경우 숫자가 문자로, 또는 문자가 숫자로 저장되어 있기 때문인데, cast절로 다시 올바르게 고칠 수 있다. 이런 오류가 발생할 경우 구글링으로 고칠 것,,,
[실습문제]

select order_id, restaurant_name, day_of_the_week,
delivery_time,
case when day_of_the_week='Weekday' and delivery_time>=25 then "Late"
when day_of_the_week='Weekday' and delivery_time<25 then "On-time"
when day_of_the_week='Weekend' and delivery_time>=30 then "Late"
when day_of_the_week='Weekend' and delivery_time<30 then "On-time"
END '지연여부'
from food_orders
주중배달이 25분, 주말 30분 이상일 경우 Late, 미만일 경우 On-time으로 분류하여라
내가 만든 코드. 맞지만 정답을 보면,
select order_id,
restaurant_name,
day_of_the_week,
delivery_time,
case when day_of_the_week='Weekday' and delivery_time>=25 then 'Late'
when day_of_the_week='Weekend' and delivery_time>=30 then 'Late'
else 'On-time' end "지연여부"
from food_orders
주중 25분 이상, 주말 30분 이상 Late라고 조건을 걸고 else를 써서 그렇지 않으면 On-time으로 분류되도록 더 간단히 작성할 수 있다!
배우는 게 많아질수록 코드가 복잡해지고 사소한 실수로 에러가 난다..문제 하나 풀 때마다 거의 매번 에러가 난다ㅠ
아직 코린이 단계니까 틀리는 걸 무서워하지 말고 일단 도전해보자..!
에러가 나면 틀린 부분을 찾아서 수정하고 선생님의 코드를 보고 어떻게 하면 더 좋은 코드를 작성할 수 있는지 비교해보면서 학습하고 있다.
어렵고 힘들어도 점점 문제를 보고 어떤 코드를 써야할지 감이 잡히는 기분,,~
언젠가는 성장해 있겠지 화이팅!