[엑셀보다 쉽고 빠른 SQL] 3주차 정리
SQL 2주차에 이어서 SQL 3주차 마무리까지 정리한 글이다.
이번 주차는 문자를 가공하여 조회하고 여러 조건식이 주어질 때 적용할 수 있는 방법에 대해 알게 되었다.
1. 문자 가공하여 조회
업무에 필요한 문자 포맷이 기존과 다른경우 사용할 수 있었다.
예를 들어,
1. 주소가 달라져서 바뀐 주소명으로 바꾸어 조회하고 싶다 (replace)
2. '서울특별시'라는 이름을 '서울'만 남기고 조회하고 싶다 (substr) or (substring)
3. 주소와 가게이름을 한 컬럼에 붙여 조회하고 싶다 (concat)
다행히 명령문이 프로그래밍 언어에서 익숙한 단어이다.
replace
replace(바꿀 컬럼, 현재 값, 바꿀 값)
형태로 사용할 수 있다.
substr or substring
substring(조회할 컬럼, 시작 위치, 글자 수)
형태로 사용할 수 있다.
예를 들어, '서울특별시' 에서 '서울'로 남기고 싶다면
substr(addr, 1, 2) => addr에서 1번째 글자부터 2번째 글자까지 자르기
형태로 사용할 수 있다.
concat
concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, ...)
형태로 사용할 수 있다.
여기서 붙이고 싶은 값은 숫자+문자열 형태도 자유롭게 붙일 수 있다.
group by 는 특정한 컬럼의 카테고리를 묶기 위해 사용하는 것으로 배웠다.
Q1. 서울 지역의 음식 타입별 평균 음식 주문금액 구하기 (출력: '서울', '타입', '평균 금액')
이렇게 여러 명령어를 사용하거나 조건이 있는 경우 문제 흐름에 대한 구문을 정리하는 습관이 중요하다.
이러한 각 흐름을 다음과 같이 정리할 수 있다.
select substr(addr, 1, 2) "지역", cuisine_type "음식 타입", avg(price) "평균 금액"
from food_orders
where addr like '%서울%'
group by addr, cuisine_type
4번의 경우 앞에 substr(addr, 1, 2), cuisine_type 그대로 사용해도 되고 1, 2로 써도 된다.
답)
SELECT substr(addr, 1, 2) "지역", cuisine_type "타입", avg(price) "평균 금액"
from food_orders
where addr like '%서울%'
group by 1, 2
2. if-case 문을 사용한 조건 출력
group by 절의 경우 컬럼의 범주(카테고리) 별로 값을 구할 때 사용했다면
범주별 연산은 조건문인 if
와 case
문으로 하게된다.
if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
형태로 사용한다.case when (조건1) then (조건1을 충족할 때 출력할 값)
when (조건2) then (조건2을 충족할 때 출력할 값) end "(컬럼이름)"
이러한 조건문은
보통 위 3가지 방법으로 사용된다.
3. 배운 내용 학습
숙제 풀이
다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
동일하게 흐름 -> 구문해석 -> 연결하는 방향으로 풀도록 하겠다.
(흐름)
1. 조회할 데이터 -> 주문번호, 음식점이름, 주간형태, 배달시간, 지연여부
2. 조회할 테이블 -> 음식주문테이블
조건이 있는데 WHERE
은 왜 안쓰는걸까?
: WHERE은 조회할 데이터에 영향을 주게된다. WHERE을 쓰게되면 전체적으로 WHERE에 부합하는 데이터가 조회되는데 위 문제의 경우 모든 데이터를 조회하는 거기 때문에 조건을 SELECT에서 주게되는 것.
(구문해석)
1. 주문번호, 음식점이름, 주간형태, 배달시간, 지연여부 :
order_id,
restaurant_name,
day_of_the_week,
delivery_time,
case when day_of_the_week='Weekday' then if(delivery_time>=25, 'Late', 'On-time')
when day_of_the_week='Weekend' then if(delivery_time>=30, 'Late', 'On-time')
end "지연여부"
food_orders
(연결)
select order_id,
restaurant_name,
day_of_the_week,
delivery_time,
case when day_of_the_week='Weekday' then if(delivery_time>=25, 'Late', 'On-time')
when day_of_the_week='Weekend' then if(delivery_time>=30, 'Late', 'On-time')
end "지연여부"
from food_orders
이렇듯 조건문을 활용하여 여러 조건식이 있는 경우 데이터를 조회하는 방법과 문자 포맷을 변경하여 조회하는 방법을 배워보았다.
나중에 여러 조건식+범주별 연산+문자 포맷 변경이 동시에 필요한 경우도 실습해보고싶다.