TIL

2024-03-19

여연찌 2024. 3. 19. 18:58

1. 오늘 배운 것

 

특정문자를 다른 문자로 바꾸기

REPLACE(바꿀 컬럼, 현재 값, 바꿀 값)

 

원하는 문자만 남기기

SUBSTR(조회 할 컬럼, 시작 위치, 글자 수)

+ 글자 수를 지정하지 않을 경우 끝까지 추출

 

여러 컬럼의 문자를 합치기

CONCAT(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, ...)

 

GROUP BY

  • 서울 지역의 음식 타입별 평균 음식 주문금액 구하기
SELECT SUBSTR(addr, 1, 2) "시도"
      , cuisine_type "음식 종류"
      , AVG(price) "평균 금액"
FROM food_orders
WHERE addr LIKE '%서울%'
GROUP BY 1, 2

+ select 절에 있는 순서 숫자대로 그룹화 할 수있음

+ 그룹화도 여러개 가능

 

  • ‘[지역(시도)] 음식점이름 (음식종류)’ 컬럼을 만들고, 총 주문건수 구하기
SELECT CONCAT('[', SUBSTR(addr, 1, 2), ']', restaurant_name, '(',cuisine_type,')') "바뀐이름"
     , COUNT(1) "주문건수"
FROM food_orders
GROUP BY 1

 

+ 추가할 문자 하나당 '' 작은 따옴표 사용 

 

 

IF 문

원하는 조건에 충족할 때 적용할 방법과 아닌 방법을 지정

 

CASE 문

조건을 여러가지 지정하고 싶을 때

  • 음식 타입을 ‘Korean’ 일 때는 ‘한식’, ‘Japanese’ 혹은 ‘Chienese’ 일 때는 ‘아시아’, 그 외에는 ‘기타’ 라고 지정
SELECT CASE WHEN cuisine_type = 'Korean' THEN '한식'
            WHEN cuisine_type IN ('Japanese','Chinese') THEN '아시아'
            ELSE '기타' END "음식타입"
FROM food_orders

 

+ when 으로 추가

+ ‘Japanese’ 혹은 ‘Chienese’ 2가지 조건을 충족해야 하므로 IN

 

 

문자/숫자 계산시 오류가 날 경우

data type 이 다를 경우 연산이 되지 않을 수 있다.

DBeaver 에서는 컬럼옆에 문자/숫자형을 표기해줌

 

 

 

ABC : 문자

123 : 숫자

 

 

  • 지역과 배달시간을 기반으로 배달수수료 구하기(식당이름, 주문번호 함께 출력)
  • 지역 : 서울, 기타 - 서울일 때는 수수료 계산 * 1.1, 기타일 때는 곱하는 값 없음
  • 시간 : 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%
SELECT CASE WHEN delivery_time > 30 THEN price * 0.1 * IF(addr LIKE '%서울%', 1.1, 1) 
            WHEN delivery_time > 25 THEN price * 0.05 * IF(addr LIKE '%서울%', 1.1, 1) 
            -- BETWEEN 26 AND 29 해도 무관, 위에서 30분 초과로 걸러줬기 때문에 '>' 사용해도 됨 
            ELSE 0 END "수수료" 
      , restaurant_name 
      , order_id , price 
      , delivery_time 
      , addr 
FROM food_orders

 

+ CASE 문은 순서대로 위에서부터 결과를 출력

+ 첫번째 조건 ▶ (남은데이터로) 두번째 조건 

 


 

 

2. 문제풀이

  • 음식 종류별 가장 높은 주문 금액과 가장 낮은 주문금액을 조회하고, 가장 낮은 주문금액 순으로 (내림차순) 정렬하기
SELECT cuisine_type
     , MAX(price) min_price
     , MIN(price) max_price
FROM food_orders
GROUP BY cuisine_type
ORDER BY MIN(price) DESC

 

+

음식 종류별로 그룹화 하고,

낮은 금액(min), 높은 금액(max) 조회

낮은 금액으로 내림차순(desc)

 


  • 다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요. - 주중 : 25분 이상 - 주말 : 30분 이상

- 오답

SELECT order_id 
     , restaurant_name 
     , CASE WHEN day_of_the_week = 'Weekday' AND delivery_time >=25 THEN 'Late' ELSE 'On-time'
            WHEN day_of_the_week = 'Weekend' AND delivery_time >=30 THEN 'Late' ELSE 'On-time'
             END "지연여부"
FROM food_orders

 

+

ELSE 는 한번만 적어야함

문법실수..

 

- 정답

SELECT order_id 
     , restaurant_name 
     , 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

 

+

주중, 주말 조건이 여러개 이기 때문에

CASE 문 사용, when 으로 추가

 


  • 동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.
SELECT ANIMAL_ID 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL 
ORDER BY ANIMAL_ID

 

+

이름이 있는 동물이어야 하기 때문에 NOT NULL 조건 지정

 


  • 동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.
SELECT name
     , datetime
FROM animal_ins
ORDER BY animal_id DESC

 


  • 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
SELECT COUNT(DISTINCT name) AS count_name
FROM animal_ins
WHERE name IS NOT NULL

 

+

이름이 NULL 인 경우는 제외 , NOT NULL

갯수 조회 COUNT

중복값 제외 DISTINCT

 

 

 


 

여러가지 함수가 섞이면서 어떨때 어떤 함수를 써야하는지 익숙하지 않다.

코드카타를 여러개 풀이해보고, 반복학습 할 예정!

'TIL' 카테고리의 다른 글

2024-03-23  (0) 2024.03.23
2024-03-22  (1) 2024.03.22
2024-03-21  (1) 2024.03.21
2024-03-20  (0) 2024.03.20
2024-03-18  (0) 2024.03.18