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)

- 추가적으로 궁금하여 정리하였다.

  1. 숫자와 문자열 연산
    •     숫자와 문자열을 연산하면, MySQL은 문자열을 숫자로 변환한다.
    •     문자열이 숫자로 변환되지 않으면, 0으로 처리된다.
  2. 문자열 비교
    •     문자열과 숫자를 비교하면 문자열이 숫자로 변환된다.
  3. 날짜와 문자열 연산
    •     날짜와 문자열을 연산하면 MySQL은 문자열을 날짜로 변환하려고 한다.
    •     올바른 날짜 형식이 아니면 NULL이 나올 수 있다.
  4. BOOLEAN과 숫자
    •     MySQL에서 TRUE는 1, FALSE는 0으로 처리된다.

 

 

 

3. 숙제

[문제]

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

[지시사항]

  • 주중 : 25분 이상
  • 주말 : 30분 이상
  1. SQL 문의 기본 구조로 시작
  2. 조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
  3. 조건에 '주중, 주말' 조건과 '배달시간' 조건을 동시에 줄 때 사용할 논리연산자 결정

[풀이]

  1. FROM → food_orders table 필요
  2. WHERE → X (필터링 조건이 없으므로)
  3. GROUP BY → X (그룹 조건이 없으므로)
  4. SELECT → 조건이 여러 개이므로 CASE WHEN 사용, WHEN 문 안에서도 조건이 2개이므로 AND 논리연산자 사용.
  5. 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