SQL(데이터분석_사전캠프)

사전캠프 SQL 3주차 - 문자 포맷 가공, 다중조건설정

pinehouse13 2025. 4. 24. 21:41

SQL 3주차는 이전 주차의 내용들보다 난이도가 좀 있는 편인 것 같다.

 

코드 길이도 길어지고 신경쓸 부분이 조금씩 늘어났지만, 이해하지 못할만큼 어렵진 않기 때문에 겁먹지 말자.

 

 

오늘의 핵심 학습 키워드

#REPLACE # SUBSTR  #CONCAT #IF #CASE

 

REPLACE, SUBSTR, CONCAT은 문자 포맷을 가공하는 기능을 가지고 있으며,

 

IF와 CASE는 출력할 조건을 설정하는 기능을 가지고 있다.

 

먼자 문자 포맷 가공 기능을 가진 구문에 대해 알아보자.

 

 

 

1. REPLACE

 

데이터를 조회하다 보면, 잘못 입력된 데이터나 예전 데이터가 입력되어 있는 경우가 있다.

 

예를들어, 옛날에 한국에는 패밀리마트라는 편의점이 있었지만 현재는 CU로 변경이 되었다.

 

이런 경우, 과거의 데이터를 그대로 사용하면 문제가 발생할 여지가 있기 때문에, 최신 정보로 출력해야 할 필요가 있다.

 

이 때 사용 가능한 구문이 바로 REPLACE다.

select restaurant_name "원래 상점명",
       replace(restaurant_name, 'Blue', 'Pink') "바뀐 상점명"
from food_orders
where restaurant_name like '%Blue%'

 

위의 예시는 restaurant_name의 Blue라는 문자를 Pink로 일괄 변경해서 출력하는 기능을 가지고 있다.

 

where 구문을 추가한 이유는, 문자가 제대로 변경 되었는지 변경 전 후를 쉽게 확인하기 위해서이다.

 

위와같은 예시코드를 입력해 실행한다면 아래와 같은 출력결과를 얻을 수 있다.

상점명의 'Blue'라는 문자를 'Pink'로 변경한 출력결과

 

원하던대로 Blue라는 문자가 전부 Pink로 교체되어 출력된 것을 확인 할 수 있다.

 

 

 

2. SUBSTR

 

만약 누군가가 어디 사냐고 물어볼때, 서울에 살고 있다고 답변하는 사람들은 자주 보이지만 서울특별시에 살고 있다고 말하는 등, 지역명 전체를 말하는 사람들은 거의 없을 것이다.

 

이처럼, 데이터의 일부만 출력하고 싶은 경우 사용하는 구문이 SUBSTR이다.

 

지역명의 경우, 앞 2글자만으로도 어떤 시도인지 알 수 있기 때문에, 해당 정보만 출력시키는 코드를 작성해보자.

select addr "원래 주소",
       substr(addr, 1, 2) "시도"
from food_orders

 

위의 예문은 addr 컬럼의 첫 번째 문자부터 2글자까지 출력하겠다는 의미를 가지고 있다.

 

즉, addr 컬럼의 정보에 '서울특별시'라는 정보가 있다면, 해당 정보는 '서울'이라고 출력되면 정상인 것이다.

 

예시의 코드를 입력하고 실행하면 다음과 같이 출력된다.

SUBSTR 구문을 이용한 출력결과

 

예상대로, 주소의 앞 2글자만이 출력되는 것을 확인 할 수 있다.

 

 


3. CONCAT

 

CONCAT 구문은 2개 이상의 컬럼의 데이터를 합쳐서 노출시키고 싶은 경우 사용하는 구문이다.

 

적당한 예시가 생각나진 않지만, 분명 이 기능을 사용하는 케이스가 있긴 할것이다. 

 

우선, 실습을 위해 가게 이름 앞에 해당 가게가 위치한 지역을 표시해야 한다고 가정하자.

 

CONCAT 구문을 이용 시 다음과 같이 코드를 작성할 수 있다.

select restaurant_name "원래 이름",   
       addr "원래 주소",
       concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
from food_orders

 

CONCAT 구문은 CONCAT(붙이고 싶은 값 1, 붙이고 싶은 값 2,....)와 같은 형식으로 작성한다.

 

위 예시코드의 경우, '[지역] restaurant_name'의 형식으로 데이터 출력을 요청하는 코드이다.

 

코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있다.

CONCAT을 사용해 포맷을 변경한 출력결과

 

이렇게 각 컬럼 내 문자의 포맷을 변경하는 기능들을 알아봤다.

 

 

 

4. IF

 

IF는 '만약 ~라면' 이라는 뜻을 가지고 있는 단어이며, 이는 SQL에서도 동일하다.

 

출력에 조건을 걸고, 조건 해당여부에 따라 출력결과를 구분하는 구문이며, 아래와 같이 사용할 수 있다.

select restaurant_name,
       cuisine_type "원래 음식 타입",
       if(cuisine_type='Korean', '한식', '기타') "음식 타입"
from food_orders

 

위의 예시는 Cuisine_type이 'Korean'이라면 해당 데이터를 '한식'으로, 아니라면 '기타'로 출력하는 코드이다.

 

앞으로 자주 사용하게 될 구문이라 생각되니 잘 기억해두자.

 

IF(대상컬럼 및 조건, 참인 경우의 값, 거짓인 경우의 값)의 형식으로 입력한다!

cuisine_type에 따른 음식 타입 출력결과

 

 

 

5. CASE

 

만약 사용하고 싶은 조건이 여러개라면, CASE를 사용해서 여러 개의 조건을 배치할 수 있다.

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

 

CASE 문 자체는 쉬워보이지만, 케이스가 많아지고 조건이 복잡해질수록 오류가 발생하기 쉬우니 주의해서 작성을 해야 한다.

 

지금까지 배운 구문들을 혼합해서 원하는 출력결과를 얻어보기로 하자.

 

조건 1. Cuisine_type이 Korean인 경우 New_name 컬럼에 [한식] Restaurant_name 형식으로 표시
조건 2. Cuisine_type이 Japanese나 Chinese인 경우 New_name 컬럼에 [아시아] Restaurant_name 형식으로 표시

조건 3. Cuisine_type이 상기 조건과 상이한 경우 New_name 컬럼에 [기타] Restaurant_name 형식으로 표시
조건 4. delivery_time이 25분 이상 30분 미만인 경우 배달수수료 5% 추가 및 Fee 컬럼에 해당 데이터 표시
조건 4. delivery_time이 30분 초과인 경우 배달수수료 10% 추가 및 Fee 컬럼에 해당 데이터 표시

조건 5. addr이 서울이고 배달수수료가 있는 경우, 배달수수료 10% 추가 및 Fee 컬럼에 해당 데이터 표시

조건 6. price가 25,000원 이상인 데이터만 출력 및 Fee 컬럼에 해당 데이터 표시

 

상기 6개의 조건을 모두 만족하는 코드는 다음과 같다.

select cuisine_type,addr,price ,delivery_time ,
case when cuisine_type ='Korean' then concat('[한식] ',restaurant_name)
     when cuisine_type in ('Japanese','Chinese') then concat('[아시아] ',restaurant_name)
	 else concat('[기타] ',restaurant_name)
	 end as New_name,
case when delivery_time between 25 and 29 then (price*0.05)*if(addr like '%서울%',1.1,1)
     when delivery_time >=30 then (price*0.1)*if(addr like '%서울%',1.1,1)
     else 0
     end as fee
from food_orders
where price>=25000

 

조건1~6을 적용한 코드의 출력결과

 

출력결과도 정상임을 확인할 수 있었다.

 

 

 

4. 후기

 

SQL 3주차 강의는 각각의 내용은 어렵지 않았으나, 섞어서 사용할때 자잘한 오류가 많았고, 실습에 시간이 많이 걸렸다.

 

도중에 집중력이 떨어지지 않도록 주의해야겠다.