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 |