AD JB Toolbox 01

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;
같은 카테고리의 다른 글
MariaDB 강좌 / Windows에 MariaDB 설치하고 서버 실행하기

MariaDB 강좌 / Windows에 MariaDB 설치하고 서버 실행하기

Windows MSI 설치에서 서버·클라이언트, 관리자 인증, 서비스와 포트를 설정합니다. SQL 실행을 확인하고 이후 강좌에서 사용할 학습용 계정을 준비하며 시작·접속 오류를 점검합니다.

MariaDB 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

MariaDB 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

CSV를 문자형 stage에 적재해 형식·중복·경고를 확인한 뒤 실제 타입으로 옮깁니다. LOCAL의 클라이언트 경로, 서버 OUTFILE의 권한·경로, 쉼표·한글·줄바꿈과 왕복 검증을 설명합니다.

MariaDB 강좌 / INSERT로 한 행과 여러 행 추가하기

MariaDB 강좌 / INSERT로 한 행과 여러 행 추가하기

INSERT의 열·값 대응, 한 행과 다중 행 입력, 자동 번호와 기본값을 상품 데이터로 실습합니다. 저장 결과와 오류 뒤 행 수를 확인하고 기존 데이터와 분리해 반복하는 방법을 설명합니다.

MariaDB / VIEW

MariaDB / VIEW

VIEW는 가상의 테이블입니다. 실제로 데이터를 저장하지 않고, 기존의 하나 이상의 테이블을 기반으로 한 쿼리 결과를 테이블처럼 사용할 수 있게 해줍니다. 뷰는 복잡한 쿼리를 단순화하고, 보안 및 데이터 관리에 유용하게 사용됩니다.

MariaDB 강좌 / Ubuntu에 MariaDB 설치하고 서버 실행하기

MariaDB 강좌 / Ubuntu에 MariaDB 설치하고 서버 실행하기

Ubuntu APT 설치 후 서버 실행·자동 시작·관리자 소켓 인증을 확인합니다. 로컬 TCP 학습 계정을 만들고 패키지 버전, 인증 오류와 서비스 로그를 확인하는 절차를 설명합니다.

MariaDB / 연산자 / 논리 연산자

MariaDB / 연산자 / 논리 연산자

MariaDB의 논리 연산자에 대하여 알아보겠습니다. 예제로 사용하는 테이블은 아래의 데이터를 가진 T_2이라는 테이블입니다. 각 열의 데이터 형식은 다음과 같습니다. C_1 : 정수 C_2 : 문자 +----+------+------+ | ID | C_1 | C_2 | +----+------+------+ | 1 | 1 | A | | 2 | ...

MariaDB 강좌 / EXPLAIN으로 실행 계획 읽고 인덱스 전후 비교하기

MariaDB 강좌 / EXPLAIN으로 실행 계획 읽고 인덱스 전후 비교하기

1000행 실습으로 인덱스 전후 EXPLAIN과 실제 반환 행을 비교합니다. ANALYZE FORMAT=JSON의 실행 정보와 통계 갱신을 구분하고 결과·환경을 기록합니다.

MariaDB 강좌 / ALTER TABLE로 구조 변경하기: 열·제약 조건·변경 전 점검

MariaDB 강좌 / ALTER TABLE로 구조 변경하기: 열·제약 조건·변경 전 점검

ALTER TABLE을 새 코드 열 추가·기존 행 채우기·제약 적용으로 나누어 실습합니다. NULL·중복 사전 검사, MODIFY 속성 보존, 실제 실패 입력과 잠금·복구 계획을 설명합니다.

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

빈 두 서버를 준비하는 로컬 Compose 구성과 복제 상태·지연·오류 진단을 설명합니다. 적용 중지·재개를 관찰하고 백업과 장애 승격의 경계를 구분합니다.

MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

별도 주문 실습 DB를 준비해 mariadb-dump로 새 SQL 백업 파일을 만듭니다. 종료 코드·해시·문자 인코딩, InnoDB 스냅샷과 동시 DDL의 한계, 객체·권한·별도 복원 검증 기준을 설명합니다.