SQL 3주차

윤수빈·2024년 7월 2일
0
post-custom-banner

[엑셀보다 쉽고 빠른 SQL] 3주차 정리

SQL 2주차에 이어서 SQL 3주차 마무리까지 정리한 글이다.

이번 주차는 문자를 가공하여 조회하고 여러 조건식이 주어질 때 적용할 수 있는 방법에 대해 알게 되었다.


1. 문자 가공하여 조회

업무에 필요한 문자 포맷이 기존과 다른경우 사용할 수 있었다.

예를 들어,
1. 주소가 달라져서 바뀐 주소명으로 바꾸어 조회하고 싶다 (replace)
2. '서울특별시'라는 이름을 '서울'만 남기고 조회하고 싶다 (substr) or (substring)
3. 주소와 가게이름을 한 컬럼에 붙여 조회하고 싶다 (concat)

다행히 명령문이 프로그래밍 언어에서 익숙한 단어이다.

  1. replace
    replace(바꿀 컬럼, 현재 값, 바꿀 값) 형태로 사용할 수 있다.

  2. substr or substring
    substring(조회할 컬럼, 시작 위치, 글자 수) 형태로 사용할 수 있다.
    예를 들어, '서울특별시' 에서 '서울'로 남기고 싶다면
    substr(addr, 1, 2) => addr에서 1번째 글자부터 2번째 글자까지 자르기 형태로 사용할 수 있다.

  3. concat
    concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, ...) 형태로 사용할 수 있다.
    여기서 붙이고 싶은 값은 숫자+문자열 형태도 자유롭게 붙일 수 있다.


추가로, 이러한 문자 가공을 이용하여 group by 절에서 사용하는 예시를 실습했다.

group by 는 특정한 컬럼의 카테고리를 묶기 위해 사용하는 것으로 배웠다.

Q1. 서울 지역의 음식 타입별 평균 음식 주문금액 구하기 (출력: '서울', '타입', '평균 금액')

이렇게 여러 명령어를 사용하거나 조건이 있는 경우 문제 흐름에 대한 구문을 정리하는 습관이 중요하다.

  1. 조회할 데이터? -> 지역, 음식 타입, 평균 금액
  2. 어떤 테이블에서? -> food_orders란 테이블
  3. 어떤 조건을? -> 서울 지역에 한해서
  4. 어떻게? -> 서울 지역의 음식들과 음식 타입들로 묶어서

이러한 각 흐름을 다음과 같이 정리할 수 있다.

  1. 지역, 음식 타입, 평균 금액 -> select substr(addr, 1, 2) "지역", cuisine_type "음식 타입", avg(price) "평균 금액"
  2. food_orders란 테이블 -> from food_orders
  3. 서울 지역에 한해서 -> where addr like '%서울%'
  4. 서울 지역의 음식들과 음식 타입들로 묶어서 -> 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 절의 경우 컬럼의 범주(카테고리) 별로 값을 구할 때 사용했다면

범주별 연산은 조건문인 ifcase 문으로 하게된다.

  1. if
    if문은 if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때) 형태로 사용한다.
  2. case
    case문은 아래 형태로 사용하며 여러 조건에 따라 다른 값을 출력할 때 사용한다.
case when (조건1) then (조건1을 충족할 때 출력할 값)
     when (조건2) then (조건2을 충족할 때 출력할 값) end "(컬럼이름)"

이러한 조건문은

  • 새로운 카테고리 생성
  • 연산식에 조건식으로 사용
  • 다른 문법에 조건식으로 사용

보통 위 3가지 방법으로 사용된다.


3. 배운 내용 학습

숙제 풀이
다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.

  • 주중 : 25분 이상
  • 주말 : 30분 이상

동일하게 흐름 -> 구문해석 -> 연결하는 방향으로 풀도록 하겠다.

(흐름)
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 "지연여부"
  1. 음식주문테이블 :
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 

이렇듯 조건문을 활용하여 여러 조건식이 있는 경우 데이터를 조회하는 방법과 문자 포맷을 변경하여 조회하는 방법을 배워보았다.

나중에 여러 조건식+범주별 연산+문자 포맷 변경이 동시에 필요한 경우도 실습해보고싶다.

profile
정의로운 사회운동가
post-custom-banner

0개의 댓글