0. Intro
어제는 1~2주차 학습을 한꺼번에 진행했는데, 오늘은 이런저런 핑계로 3주차 학습만 진행했다. 분량을 제하고 난이도로만 따지자면 전체적으로 어제와 유사했다. 다만, 복습이 부족해서인지 이상하게 계속 'group by' 구문과 'where 절'이 쓰이는 때가 급히 어색해지기도 했다(마치 게슈탈트 붕괴처럼..). 3주차 내용은 쉽게 얘기해서 컬럼을 자유자재로 바꾸고, 결합하고, 조건으로 부여하는 그런 내용이었다. 까먹기 전에 바로 정리해 보겠다.
1. 데이터 포맷 변환 함수(기본)
함수명 | 기본형태 | 내용 |
REPLACE | replace(바꿀 컬럼, A, B) | 컬럼 내 A값을 B로 바꿔라 |
SUBSTR | substr(조회 칼럼, 시작위치, n) | 컬럼 내 시작위치부터 n번째까지 값을 조회해라 |
CONCAT | concat(불일 값1, 불일 값2, ...) | 각 값들을 모두 하나의 문자열로 합쳐라 |
얘네는 좀 헷갈릴 수 있어서, 예시와 함께 한 번씩 짚고 넘어가려 한다.
1-1. REPLACE( )
Q. 주소 열 값 중 '문곡리' -> '문가리'로 변경하고자 할 때, query
select addr "원래주소",
replace(addr, '문곡리', '문가리') "바뀐주소"
from food_orders
where addr like '%문곡리%'
* 여기서 where절이 꼭 필요한가? 에 대한 의문이 잠깐 들었었다. 그래서 where절을 제거하고 돌려보니, 전체 주소 데이터가 조회됐다. 물론, 바꾸고자 하는 값은 잘 바뀌어 있었으나, 필요한 데이터만 조회되지 않았다. 생각해 보니 where절이 없으면 SQL은 모든 데이터를 상대로 작업을 진행할 거고, 결국 모든 작업데이터를 표시하게 될 것이었다.
1-2. SUBSTR( )
Q. 서울 음식점들의 주소를 전체가 아닌 ‘시도ʼ 만 나오도록 수정하고자 할 때, query
select addr "원래주소",
substr(addr, 1, 2) "시도"
from food_orders
where addr like '%서울특별시%'
Q. 서울 지역의 음식 타입별 평균 음식 주문금액 구할 때( 출력 : ‘서울ʼ, ‘타입ʼ, ‘평균 금액ʼ), query
select substring(addr, 1, 2) "시도",
cuisine_type "음식종류",
avg(price) "평균금액"
from food_orders
where addr like '%서울%'
group by 1,2
* 여기서 group by 뒤에 오는 숫자 2개는 앞에 있는 열 2개를 말한다. 근데, 왜 꼭 2개의 범주가 필요한가에 대한 의문이 들었다. 실제로 진행해 보니 2만 있어도 같은 결과가 출력됐다. 1로만 범주화하면 당연히 where절 때문에 '서울'에 속하는 애들만 조회될 테고, 따라서 첫 번째 값인 'Korean' 음식점들만 조회되었다. 허나, 2로만 범주화하면 where절이 '서울'은 자동으로 걸러주고, 여기에 타입까지 2로 걸러주니, 결국 1,2로 필터링한 값과 동일한 값이 나오는 것이었다.
1-3. CONCAT( )
Q. 서울시에 있는 음식점은 ‘[서울] 음식점명ʼ 이라고 수정하고자 할 때, query
select restaurant_name "원래 이름",
addr "원래 주소",
concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
from food_orders
where addr like '%서울%'
2. 데이터 포맷 변환 함수(조건문)
함수명 | 기본형태 | 내용 |
IF | if(조건문, A, B) | 조건에 맞으면 A를, 아니면 B를 |
CASE | case when 조건 1 then 'A' when 조건 2 then 'B' else 'C' end |
조건1에 맞으면 A를, 조건 2에 맞으면 B를, 모두 아니면 C를 |
이건 사실 엑셀함수와 상당히 유사하다. 위 두 개 함수가 모두 포함된 예제로 살펴보는 것이 가장 효과적일듯하다.
Q. 지역과 배달시간을 기반으로 배달수수료 구하기(식당 이름, 주문 번호 함께 출력)
- 지역 : 서울일 때는 수수료 계산 * 1.1/ 기타일 때는 곱하는 값 없음
- 시간 : 25분 초과하면 음식 가격의 5%/ 30분 초과하면 음식 가격의 10%
select
case
when delivery_time > 30 then price * 0.1 * if(addr like '%서울%', 1.1, 1)
when delivery_time between 26 and 30 then price * 0.05 * if(addr like '%서울%', 1.1, 1)
else 0 end "수수료",
delivery_time, price, restaurant_name, order_id, addr
from food_orders
먼저, 배달시간에 따른 조건을 case, when 구문으로 완성한 뒤에, 지역에 '서울'이 포함되면 1.1을/ 아니면, 1을 돌려주는 if문을 조합하여 위와 같은 query를 짤 수 있었다.
한 줄 코멘트: where절과 group by의 쓰임에는 아직도 풀리지 않는 의문들이 남아있다. 단순히 계산을 용이하게 위함인지 혹은 필수적으로 존재해야 할 때는 언제인지. 하면서 계속 질문을 해야 할 것 같다(어쩌면 SQL에게도 계속해서 자체적인 query를 던지는 것이 SQL일지도..). 추가로 order by 관련해서도 질문한 게 있는데, 답변이 오면 자세히 기재하겠다.
'[내일배움캠프(PM2기_사전캠프)] > SQL기초' 카테고리의 다른 글
[사전캠프 Day 10] SQL 기초강의 Week 5(完) (0) | 2025.03.21 |
---|---|
[사전캠프 Day 9] SQL 기초강의 Week4 (0) | 2025.03.20 |
[사전캠프 Day 7] SQL 기초강의 Week 1~2 (0) | 2025.03.18 |