MariaDB 강좌 / 숫자 계산과 타입 변환: ROUND·CAST
ROUND는 수를 지정한 자리에서 반올림하고 CAST는 값을 명시한 데이터 타입으로 변환합니다. 금액 계산에는 정확한 DECIMAL과 명확한 반올림 시점을 정하고, 변환 성공 여부는 결과뿐 아니라 경고와 원본 값도 함께 확인해야 합니다.
계산·반올림·표시 형식을 구분하기
10% 할인한 금액을 구하는 계산, 소수 둘째 자리로 맞추는 반올림, 1,000처럼 쉼표를 붙이는 표시는 별개입니다. 화면 문자열을 다시 숫자로 바꾸어 합산하기보다 계산용 숫자를 유지하고 출력 단계에서 표시 형식을 적용하는 편이 오류를 줄입니다. 계산 전에 숫자 타입 선택하기: 정수·DECIMAL·부동소수점로 정확한 수와 근삿값을 구분하고, 조건에 따라 다른 계산값을 만들 때는 CASE로 조건별 값과 집계 만들기를 사용할 수 있습니다.
| 요구 사항 | 사용 예 | 주의 |
|---|---|---|
| 금액 계산 | price * 0.9 | 비율과 세금 정책을 먼저 정의 |
| 소수 자리 반올림 | ROUND(value, 2) | 각 행과 총액 중 어느 단계에서 하는지 |
| 숫자 타입 변환 | CAST(text AS DECIMAL(10,2)) | 불량 입력의 경고·범위 확인 |
| 코드를 숫자로 변환 | CAST('0012' AS UNSIGNED) | 앞자리 0이 사라짐 |
정확한 숫자 타입으로 할인 가격 계산하기
학습용 MariaDB 서버의 shopcourse에 course_user로 접속합니다. 명령줄 클라이언트와 UTF-8 SQL 파일 실행 방법대로 코드를 UTF-8 파일에 저장하고 SOURCE C:/mariadb-lab/lesson.sql;처럼 실제 파일 경로로 실행할 수 있습니다. SQL 문은 운영체제 터미널이 아닌 MariaDB 연결 안에서 실행합니다.
먼저 SELECT VERSION(), DATABASE();와 SHOW TABLES;로 대상 서버·DB·이름 중복을 확인합니다. 아래 products_20_lab는 이 글의 독립된 연습용 이름입니다. 이미 존재하면 정의와 행을 확인하고, 보관할 자료가 없는 이 글의 실습 테이블임이 확실할 때만 마지막 절의 정리 순서로 지운 뒤 다시 만듭니다. 기존 강좌의 동명 없는 테이블이나 운영 데이터는 삭제하지 않습니다.
USE shopcourse; CREATE TABLE products_20_lab ( product_id INT NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, category VARCHAR(30) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, note VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (product_id), CONSTRAINT ck_p20_price CHECK (price >= 0), CONSTRAINT ck_p20_stock CHECK (stock >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO products_20_lab (product_id,product_name,category,price,stock,note) VALUES (1, '노트', '문구', 3500.00, 20, NULL), (2, '볼펜', '문구', 1500.00, 0, ''), (3, '머그컵', '생활', 8000.00, 12, '선물 포장'), (4, '스탠드', '생활', 25000.00, 5, NULL), (5, '파일', '문구', 1500.00, 50, ''), (6, '케이블', '전자', 8000.00, 0, '호환 확인');
SELECT product_id, price, ROUND(price * 0.9,2) AS discounted_price FROM products_20_lab ORDER BY product_id;
노트는 3150.00, 볼펜은 1350.00, 스탠드는 22500.00이 됩니다. 예제에서는 저장 가격이 DECIMAL이고 0.9라는 정확한 소수 리터럴을 사용합니다. 정수·DECIMAL·부동소수점 타입 비교에서 정확한 값과 근삿값의 차이를 확인할 수 있습니다.
반올림 자리와 정확한 값의 동작 확인하기
SELECT ROUND(CAST('1.235' AS DECIMAL(10,3)),2),
ROUND(CAST('-1.235' AS DECIMAL(10,3)),2);
SELECT ROUND(12345,-2);
정확한 DECIMAL 입력의 결과는 1.24와 -1.24이고, 음수 자릿수를 지정한 12345의 결과는 12300입니다. 소수 자료형과 근삿값 자료형의 반올림이 항상 같은 중간값 규칙을 따른다고 가정하지 않습니다. 지수 표기나 DOUBLE 계산이 섞였으면 입력 타입부터 확인하세요. ROUND의 정확한 값·근삿값 처리를 참고할 수 있습니다.
행마다 반올림한 뒤 더한 결과와 합계를 구한 다음 반올림한 결과는 달라질 수 있습니다. 거래 명세·세금 정책이 어느 방식을 요구하는지 정한 뒤, 테스트 데이터에 경계 소수를 넣어 검증합니다. 이 글의 할인율은 문법 학습용 예시이며 실제 판매 정책을 뜻하지 않습니다.
CAST로 타입을 명시하고 정보 손실 확인하기
SELECT CAST('12.90' AS DECIMAL(10,2)),
CAST('0012' AS UNSIGNED), CAST(123 AS CHAR);
결과는 12.90, 12, 문자열 123입니다. DECIMAL(10,2)는 전체 유효 자릿수 10개 중 소수 부분 2개를 배정한 타입입니다. 숫자 변환은 코드의 앞자리 0을 보존하지 않으므로 상품 코드·우편번호처럼 계산 대상이 아닌 값은 문자열로 유지하는 편이 적합할 수 있습니다.
CAST를 사용했다고 입력이 업무 규칙을 만족하는 것은 아닙니다. 소수 자릿수 축소, 범위 초과, 음수를 부호 없는 수로 바꾸는 경우의 의미를 검토해야 합니다. CAST 공식 문법에서 지원 타입과 변환 범위를 확인합니다.
잘못된 숫자 문자열을 조용히 받아들이지 않기
SELECT CAST('12abc' AS DECIMAL(10,2));
SHOW WARNINGS;
이 SELECT에서는 숫자로 읽을 수 있는 앞부분이 12.00으로 변환되고 잘림 경고가 발생할 수 있습니다. 결과가 숫자라는 이유로 원래 문자열 전체가 올바른 숫자였다고 판단하면 안 됩니다. 경고는 변환 직후 SHOW WARNINGS로 확인하고, 화면·파일 입력 단계에서도 허용 형식과 범위를 검증하세요.
같은 불량 값도 SELECT인지 저장 문장인지, SQL 모드와 목표 타입이 무엇인지에 따라 오류 또는 경고 처리가 달라질 수 있습니다. 운영에서 오류를 없애려고 strict 모드를 해제하는 대신 입력과 타입 설계를 수정합니다. 검사된 원본을 보존하면 변환 과정의 문제를 추적하기 쉽습니다.
실제 금액과 비교한 뒤 연습 테이블 정리하기
기본키와 원래 price, 계산값, 최종 반올림값을 함께 출력해 비교합니다. NULL이 나온 경우 입력 열의 NULL을 확인하고, 표시 문자열에 포함된 쉼표나 통화 단위를 숫자 값과 혼합하지 않습니다. UPDATE로 가격을 바꾸려면 먼저 같은 조건의 SELECT로 영향 범위를 검증해야 합니다.
반복하기 전 현재 DB와 실제 정의·행을 확인하고 필요한 자료를 백업합니다. 보관할 데이터가 없는 이 글의 전용 실습 객체만 아래 순서로 정리합니다. 외래키가 있으면 자식부터 지웁니다. DROP TABLE은 구조와 데이터를 모두 없애며 일반적인 ROLLBACK으로 복원되지 않으므로 취소 가능한 DML 실습과 분리합니다.
DROP TABLE shopcourse.products_20_lab;










