SELECT CAST(AVG(shop_price) as real) as 平均值 FROM goods;
讲一下,另外cast干啥的 ?real呢
你问的这两个点非常关键:CAST 和 REAL,是 SQL 中数据类型转换的核心。
一、先看完整语句
sql
SELECT CAST(AVG(shop_price) AS REAL) AS 平均值FROM goods;
执行逻辑:
计算
goods表中shop_price列的平均值(AVG)AVG默认返回的类型通常是 高精度小数(如DECIMAL或NUMERIC)用
CAST(...AS REAL)把这个平均值转换成 REAL 类型将结果列命名为
平均值
一句话:计算商品价格的平均值,并把结果转为 REAL 浮点数类型。
二、CAST 是干啥的?
定义
CAST是 SQL 中的类型转换函数,用于将一种数据类型的值显式转换为另一种数据类型。
语法
sql
CAST(表达式 AS 目标数据类型)
词源角度
| 单词 | 词源 | 含义 |
|---|---|---|
| CAST | 古英语 casten / 古诺尔斯语 kasta | 投、扔、抛、铸造 |
演变路径:
text
古诺尔斯语 kasta(扔、抛) ↓ 英语 cast(投掷、铸造) ↓ 计算机 cast(类型转换)
为什么用 CAST 表示类型转换?
类比“铸造”:
把金属熔化 → 倒入模具 → 铸成新的形状
把数据 → 从一种类型 → “铸造”成另一种类型
所以 CAST 非常形象:把数据“重新铸造”成另一种类型。
常见用途
| 场景 | 示例 |
|---|---|
| 整数转小数 | CAST(5 AS DECIMAL(10,2)) → 5.00 |
| 数字转字符串 | CAST(123 AS VARCHAR) → '123' |
| 字符串转数字 | CAST('456' AS INT) → 456 |
| 日期转字符串 | CAST(GETDATE() AS VARCHAR) → '2024-01-15 ...' |
| 精度控制 | CAST(AVG(price) AS REAL) → 转为单精度浮点数 |
三、REAL 是啥?
定义
REAL是 SQL 中的一种浮点数数据类型,用于存储单精度浮点数(4 字节,32 位)。
词源角度
| 单词 | 词源 | 含义 |
|---|---|---|
| REAL | 拉丁语 realis | 实际的、真实的 |
为什么用 REAL 表示浮点数?
在数学和计算机科学中:
实数(Real Number) = 包括整数、有理数、无理数的连续数值
计算机用
REAL类型近似表示数学中的实数
命名逻辑:
这种类型用来存储“真实的”小数(而不是只存整数的
INTEGER)
REAL 的技术细节
| 属性 | 说明 |
|---|---|
| 全称 | Single-precision floating-point(单精度浮点数) |
| 字节数 | 4 字节(32 位) |
| 有效位数 | 约 7 位十进制精度 |
| 取值范围 | 约 ±1.18 × 10⁻³⁸ 到 ±3.40 × 10³⁸ |
| 别名 | FLOAT(24)(在 SQL Server 中) |
四、为什么要把 AVG(shop_price) 转成 REAL?
AVG 默认返回的类型
| 数据库 | AVG 返回类型 | 说明 |
|---|---|---|
| SQL Server | DECIMAL(p,s) | 高精度十进制数 |
| MySQL | DECIMAL 或 DOUBLE | 取决于列类型 |
| PostgreSQL | NUMERIC | 高精度 |
特点:
精确、但可能很长
比如
AVG可能返回123.4567890000
转成 REAL 的效果
| 转换前(DECIMAL) | 转换后(REAL) |
|---|---|
123.4567890000 | 123.45679(约 7 位有效数字) |
0.3333333333 | 0.33333334 |
好处:
节省存储空间
提高计算速度
对外输出更简洁
代价:
精度降低(从 28+ 位降到约 7 位)
可能出现舍入误差
五、CAST(...AS REAL) 的实际例子
假设 goods 表:
| goods_id | shop_price |
|---|---|
| 1 | 19.90 |
| 2 | 29.90 |
| 3 | 39.90 |
| 4 | 49.90 |
不加 CAST
sql
SELECT AVG(shop_price) FROM goods;-- 结果:34.900000 (DECIMAL 类型,SQL Server)
加 CAST AS REAL
sql
SELECT CAST(AVG(shop_price) AS REAL) FROM goods;-- 结果:34.9 (REAL 类型,可能显示为 34.9 或 34.900001)
六、REAL 的兄弟姐妹
类型 | 字节 | 精度 | 词源 |
REAL | 4 | ~7 位 | 拉丁语 realis(真实的) |
FLOAT | 4 或 8 | 7 或 15 位 | 英语 float(浮动) |
DOUBLE | 8 | ~15 位 | 英语 double(双倍) |
DECIMAL | 可变 | 用户定义 | 拉丁语 decimalis(十分之一的) |
NUMERIC | 可变 | 用户定义 | 拉丁语 numericus(数字的) |
精度对比
sql
-- REAL:约 7 位有效数字SELECT CAST(1.23456789 AS REAL); -- 约 1.234568-- DOUBLE/FLOAT(53):约 15 位有效数字SELECT CAST(1.234567890123456 AS FLOAT); -- 1.23456789012346-- DECIMAL(20,10):精确 20 位,其中 10 位小数SELECT CAST(1.23456789 AS DECIMAL(20,10)); -- 1.2345678900
七、不同数据库中的差异
| 数据库 | REAL 等价类型 | 说明 |
|---|---|---|
| SQL Server | REAL / FLOAT(24) | 4 字节单精度 |
| MySQL | REAL | 默认 8 字节双精度(可配置) |
| PostgreSQL | REAL | 4 字节单精度 |
| SQLite | REAL | 8 字节双精度 |
注意: MySQL 中 REAL 默认是双精度(8 字节),相当于 DOUBLE。
八、CAST 的其他写法(类型转换)
SQL 标准中还有 CONVERT 函数:
sql
-- SQL Server 风格SELECT CONVERT(REAL, AVG(shop_price)) FROM goods;-- 标准 SQL(CAST)SELECT CAST(AVG(shop_price) AS REAL) FROM goods;-- PostgreSQL 简化写法SELECT AVG(shop_price)::REAL FROM goods;
九、什么时候该用 CAST(...AS REAL)?
| 场景 | 推荐 |
|---|---|
| 需要高精度计算(金额) | ❌ 不要用,用 DECIMAL |
| 需要科学计算、图形处理 | ✅ 可以用 |
| 存储空间紧张 | ✅ 可以节省空间 |
| 跨系统交换数据(JSON/XML) | ✅ 可以统一格式 |
| 显示给用户看 | ⚠️ 可以,但注意精度损失 |
十、总结
| 问题 | 答案 |
|---|---|
CAST 干啥的 | 类型转换函数,把数据“铸造”成另一种类型 |
CAST 词源 | 古英语/古诺尔斯语“扔、铸造” |
REAL 是啥 | 单精度浮点数(4 字节,约 7 位有效数字) |
REAL 词源 | 拉丁语 realis(真实的)→ 数学“实数” |
为什么转 REAL | 节省空间、提高速度、但会损失精度 |
| 什么时候用 | 非精确计算、存储优化、跨系统交换 |
一句话:CAST(AVG(price) AS REAL) 是把平均价格“重新铸造”成单精度浮点数——像把铁水倒进模具,形状变了,但本质还是那个数值,只是精度降低了