MySql
[내일 배움 캠프 3-7] Data Type 오류 + 3주차 숙제
kimyongjun0129
2025. 3. 24. 15:01
MySQL은 Data Type이 달라도 연산이 가능하다. 하지만 자동 형 변환(type conversion)이 발생할 수 있어 결과가 예상과 다를 수 있다.
위 DB에서 rating 컬럼은 숫자로도 이루어져 있지만, Data Type이 문자형(A-Z)이다.
만약, Data Type을 확인하지 않고 숫자와 연산을 하게 되면 다른 SQL 문법에서는 연산이 되지 않을 수 있다.
1. 데이터 타입 변경
--숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal)
--문자로 변경
concat(restaurant_name, '-', cast(order_id as char))
- 다음 과정을 통해 Data Type도 일치시키고 그에 따른 데이터 처리도 함께 해주면, 올바른 계산을 할 수 있다.
2. MySQL의 자동 형 변환(Type conversion)
- 추가적으로 궁금하여 정리하였다.
- 숫자와 문자열 연산
- 숫자와 문자열을 연산하면, MySQL은 문자열을 숫자로 변환한다.
- 문자열이 숫자로 변환되지 않으면, 0으로 처리된다.
- 문자열 비교
- 문자열과 숫자를 비교하면 문자열이 숫자로 변환된다.
- 날짜와 문자열 연산
- 날짜와 문자열을 연산하면 MySQL은 문자열을 날짜로 변환하려고 한다.
- 올바른 날짜 형식이 아니면 NULL이 나올 수 있다.
- BOOLEAN과 숫자
- MySQL에서 TRUE는 1, FALSE는 0으로 처리된다.
3. 숙제
[문제]
다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
[지시사항]
- 주중 : 25분 이상
- 주말 : 30분 이상
- SQL 문의 기본 구조로 시작
- 조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
- 조건에 '주중, 주말' 조건과 '배달시간' 조건을 동시에 줄 때 사용할 논리연산자 결정
[풀이]
- FROM → food_orders table 필요
- WHERE → X (필터링 조건이 없으므로)
- GROUP BY → X (그룹 조건이 없으므로)
- SELECT → 조건이 여러 개이므로 CASE WHEN 사용, WHEN 문 안에서도 조건이 2개이므로 AND 논리연산자 사용.
- ORDER BY → X (정렬 조건이 없으므로)
SELECT
order_id,
restaurant_name,
day_of_the_week,
delivery_time,
CASE WHEN day_of_the_week='weekend' AND delivery_time >= 25 then "Late"
WHEN day_of_the_week='weekday' AND delivery_time >= 30 then "Late"
ELSE "On-time" END "지연여부"
FROM food_orders