学完本节课,你将能清楚地回答:
MySQL 中哪些类型可以存储小数?
FLOAT
、DOUBLE
、DECIMAL
有什么区别?怎样选择合适的小数类型?
一、小数数据类型概览
在 MySQL 中,可以存储小数的常用数据类型有三种:
二、FLOAT 与 DOUBLE:浮点型(近似小数)
定义方式
CREATE TABLE test_float (
f1 FLOAT,
f2 DOUBLE
);
示例插入与查询
INSERT INTO test_float VALUES (123.456789, 123.456789123456);
SELECT * FROM test_float;
输出结果(示例)
💡 说明:
FLOAT
保留约7位有效数字。
DOUBLE
保留约15位有效数字。这两种类型属于近似存储,计算结果可能略有误差。
三、DECIMAL:精确小数(定点数)
语法和参数
DECIMAL(M, D)
M:总位数(精度),范围1-65,默认10
D:小数位数(标度),范围0-30,且必须≤M,默认0
定义方式
CREATE TABLE test_decimal (
price DECIMAL(8,2) -- 共8位,保留2位小数
);
示例插入与查询
INSERT INTO test_decimal VALUES (12345.67), (999999.99);
SELECT * FROM test_decimal;
输出结果:
💡 说明:
(M,D)
中,M 表示总位数(整数+小数),D 表示小数位数。例:
DECIMAL(8,2)
→ 最大值为999999.99
。超过范围的值会被截断或四舍五入。
四、三者的区别总结
五、实践建议
练习
练习题 1:商品价格表
题目:创建一个 product_prices
表,包含以下字段:
product_id
:商品ID,整数,主键product_name
:商品名称,字符串cost_price
:成本价,FLOAT 类型selling_price
:销售价,DOUBLE 类型discount_rate
:折扣率,DECIMAL(5,4) 类型
测试数据:
练习题 2:员工薪资表
题目:创建一个 employee_salaries
表,包含以下字段:
emp_id
:员工ID,整数,主键emp_name
:员工姓名,字符串base_salary
:基本工资,DECIMAL(10,2) 类型bonus
:奖金,FLOAT 类型tax_rate
:税率,DOUBLE 类型
测试数据:
练习题 3:科学实验数据表
题目:创建一个 experiment_data
表,包含以下字段:
exp_id
:实验ID,整数,主键temperature
:温度,FLOAT 类型pressure
:压力,DOUBLE 类型ph_value
:PH值,DECIMAL(3,2) 类型concentration
:浓度,DECIMAL(8,6) 类型
测试数据:
练习题 4:金融交易表
题目:创建一个 financial_transactions
表,包含以下字段:
transaction_id
:交易ID,整数,主键amount
:交易金额,DECIMAL(15,2) 类型exchange_rate
:汇率,DOUBLE 类型fee
:手续费,FLOAT 类型interest_rate
:利率,DECIMAL(6,4) 类型
测试数据:
练习题 5:测量数据表
题目:创建一个 measurement_data
表,包含以下字段:
measure_id
:测量ID,整数,主键length
:长度,FLOAT 类型width
:宽度,DOUBLE 类型height
:高度,DECIMAL(8,3) 类型weight
:重量,DECIMAL(10,4) 类型
测试数据:
练习答案
完整的建表 SQL 语句
-- 练习题 1:商品价格表
CREATE TABLE product_prices (
product_id INT PRIMARY KEY,
product_name VARCHAR(50),
cost_price FLOAT,
selling_price DOUBLE,
discount_rate DECIMAL(5,4)
);
-- 练习题 2:员工薪资表
CREATE TABLE employee_salaries (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(20),
base_salary DECIMAL(10,2),
bonus FLOAT,
tax_rate DOUBLE
);
-- 练习题 3:科学实验数据表
CREATE TABLE experiment_data (
exp_id INT PRIMARY KEY,
temperature FLOAT,
pressure DOUBLE,
ph_value DECIMAL(3,2),
concentration DECIMAL(8,6)
);
-- 练习题 4:金融交易表
CREATE TABLE financial_transactions (
transaction_id INT PRIMARY KEY,
amount DECIMAL(15,2),
exchange_rate DOUBLE,
fee FLOAT,
interest_rate DECIMAL(6,4)
);
-- 练习题 5:测量数据表
CREATE TABLE measurement_data (
measure_id INT PRIMARY KEY,
length FLOAT,
width DOUBLE,
height DECIMAL(8,3),
weight DECIMAL(10,4)
);
完整的测试数据插入语句
-- 插入商品价格表数据
INSERT INTO product_prices VALUES
(1, '笔记本电脑', 3599.50, 5999.99, 0.8500),
(2, '无线鼠标', 45.75, 89.90, 0.9500),
(3, '机械键盘', 199.80, 399.50, 0.9000);
-- 插入员工薪资表数据
INSERT INTO employee_salaries VALUES
(101, '张三', 8000.00, 1200.50, 0.15),
(102, '李四', 12000.00, 2500.75, 0.20),
(103, '王五', 9500.00, 1800.25, 0.18);
-- 插入科学实验数据表数据
INSERT INTO experiment_data VALUES
(1, 25.5, 101.325, 7.20, 0.001250),
(2, 37.0, 100.123, 6.80, 0.000500),
(3, -10.2, 102.456, 8.50, 0.002000);
-- 插入金融交易表数据
INSERT INTO financial_transactions VALUES
(1001, 150000.00, 6.8765, 25.50, 0.0375),
(1002, 50000.00, 7.1234, 15.25, 0.0250),
(1003, 250000.00, 6.9567, 45.75, 0.0425);
-- 插入测量数据表数据
INSERT INTO measurement_data VALUES
(1, 15.5, 10.25, 5.125, 2.3450),
(2, 20.0, 15.75, 8.500, 5.6780),
(3, 12.3, 8.90, 3.250, 1.2345);