1. 형변환이란?
데이터를 처리하는 과정에서, 숫자형을 문자형으로, 또는 날짜형을 문자열로 바꾸어야 할 상황이 종종 발생한다. 이때 사용하는 것이 바로 형변환이다. 특히 다음과 같은 경우에 유용하게 사용된다:
- 평균이나 합계를 정수로 출력하고 싶은 경우
- 날짜나 문자열 포맷을 맞추고 싶은 경우
- 두 타입이 다른 열 간의 비교나 연산을 수행할 때
MySQL에서는 다음 두 가지 방식으로 형변환을 제공한다.
2. 명시적 형변환 (Explicit Type Conversion)
명시적 형변환은 개발자가 직접 형변환을 지시하는 방식이다. MySQL에서는 두 가지 문법을 제공한다:
- CAST(값 AS 데이터타입) — SQL 표준 문법
- CONVERT(값, 데이터타입) — MySQL 고유 문법
둘 다 기능은 동일하며, 상황에 따라 취향껏 선택하면 된다
SELECT CAST(100.987 AS SIGNED); -- 정수형으로 변환 (100)
SELECT CONVERT(100.987, SIGNED); -- 같은 결과
*평균 가격을 정수로 표현하기
다음은 buy 테이블에서 가격 평균을 정수형으로 바꾸는 예제다.
SELECT
AVG(price) AS '평균 가격'
FROM
buy;
-- 결과: 142.9167
SELECT
CAST(AVG(price) AS UNSIGNED) AS '정수 평균 가격'
FROM
buy;
-- 결과: 143
주의사항
MySQL에서 CAST 시 사용할 수 있는 정수형 타입은 SIGNED, UNSIGNED만 가능하다.
- TINYINT, SMALLINT 같은 세부 정수 타입은 CAST 함수에서 사용할 수 없다.
- 대신 SIGNED(부호 O), UNSIGNED(부호 X) 형식을 써야 한다.
3.날짜 형변환
MySQL은 문자열을 날짜 형식으로 반환할 때, 일정한 규칙을 따른다.
SELECT CAST('2022$12$12' AS DATE); -- 결과: 2022-12-12
SELECT CAST('2022*12*12' AS DATE); -- 결과: 2022-12-12
SELECT CAST('2022!12!12' AS DATE); -- 결과: 2022-12-12
❌ 형식이 너무 다르면?
SELECT CAST('12/12/2022' AS DATE); -- 오류 발생
MySQL은 문자열 내에서 연도-월-일 순서로 숫자 정보가 들어있으면 어느 정도 유추하여 날짜로 변환하지만, **슬래시(/)**처럼 너무 일반적인 구분자가 들어가거나 순서가 어긋난 경우 변환에 실패한다.
4. 묵시적 형변환 (Implicit Type Conversion)
묵시적 형변환은 MySQL이 자동으로 데이터 타입을 변환하는 방식이다. 다른 데이터 타입 간 연산이 필요한 경우, 내부적으로 알아서 변환을 시도한다.
*문자열과 숫자의 덧셈
SELECT '100' + '200'; -- 결과: 300 (문자열을 숫자로 자동 변환)
위 결과처럼, '100'과 '200'은 문자형이지만, + 연산자가 사용되었기 때문에 MySQL이 숫자로 인식하고 덧셈을 수행했다.
문자열을 단순 연결하고 싶다면?
SELECT CONCAT('100', '200'); -- 결과: 100200
- CONCAT 함수는 문자열을 이어붙이는 전용 함수
- + 연산자는 숫자 계산으로 해석될 수 있으므로 문자 연결에는 사용하지 않는다
5. 실전 문제로 마무리
다음 중 평균 가격을 정수형으로 반환하는 올바른 SQL 문은?
-- a. SELECT AVG(price) AS int FROM buy;
-- b. SELECT CAST(price AS INT) FROM buy;
-- c. SELECT CAST(AVG(price) AS SIGNED) FROM buy;
-- d. SELECT price AS SIGNED FROM buy;
해설:
- AVG(price)는 FLOAT 또는 DECIMAL을 반환한다.
- 이 결과를 CAST로 SIGNED 정수로 변환해주는 것이 정확한 처리 방법이다.
- b는 각 행의 price를 정수로 바꾸는 것이며, 평균과는 무관
- a는 문법 오류 (AS 뒤에는 데이터 타입이 아닌 별칭이 와야 함)
- d는 형변환이 아닌 별칭 설정에 불과함
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| 동적 SQL : Prepare& Execute (1) | 2025.06.23 |
|---|---|
| MySQL - 스토어드 프로시저 (0) | 2025.06.22 |
| MySQL에서 변수 사용하기 (1) | 2025.06.20 |
| MySQL - JOIN 이해하기 (0) | 2025.06.19 |
| MySQL SubQuery 활용 (1) | 2025.06.18 |