您好!欢迎访问家园网-www.jy.wang!

家园网

求平均值,数值类型转换

网络 作者:本站 点击:

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;

执行逻辑:

  1. 计算 goods 表中 shop_price 列的平均值(AVG

  2. AVG 默认返回的类型通常是 高精度小数(如 DECIMAL 或 NUMERIC

  3. 用 CAST(...AS REAL) 把这个平均值转换成 REAL 类型

  4. 将结果列命名为 平均值

一句话:计算商品价格的平均值,并把结果转为 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 ServerDECIMAL(p,s)高精度十进制数
MySQLDECIMAL 或 DOUBLE取决于列类型
PostgreSQLNUMERIC高精度

特点:

  • 精确、但可能很长

  • 比如 AVG 可能返回 123.4567890000

转成 REAL 的效果

转换前(DECIMAL)转换后(REAL)
123.4567890000123.45679(约 7 位有效数字)
0.33333333330.33333334

好处:

  • 节省存储空间

  • 提高计算速度

  • 对外输出更简洁

代价:

  • 精度降低(从 28+ 位降到约 7 位)

  • 可能出现舍入误差


五、CAST(...AS REAL) 的实际例子

假设 goods 表:

goods_idshop_price
119.90
229.90
339.90
449.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 ServerREAL / FLOAT(24)4 字节单精度
MySQLREAL默认 8 字节双精度(可配置)
PostgreSQLREAL4 字节单精度
SQLiteREAL8 字节双精度

注意: 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) 是把平均价格“重新铸造”成单精度浮点数——像把铁水倒进模具,形状变了,但本质还是那个数值,只是精度降低了


标签: