整数除法与小数除法
通过类型转换避免意外结果
整数除法与小数除法 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
一个令人意外的结果
我们先从一道题开始。您认为下面的查询会返回什么?
如果您预计结果是 0.5,可能会感到意外。在许多 SQL 数据库中,两个整数相除会得到整数结果,小数部分会被完全丢弃。
SELECT 1 / 2 AS result;整数除法详解
当除法中的两个操作数都是整数时,SQL 会执行整数除法。结果会向零截断——不会进行舍入,只保留整数部分。
因此,1 / 2 = 0,7 / 3 = 2,9 / 4 = 2。小数部分会被静默丢弃。
SELECT 7 / 3 AS truncated_result;更多整数除法示例
下面在一个查询中展示了几个整数除法示例。请注意,所有结果都会丢失小数部分。对于只涉及整数文字或整数列的表达式,这种行为是一致的。
SELECT
10 / 4 AS ten_div_four,
9 / 2 AS nine_div_two,
1 / 3 AS one_div_three,
6 / 6 AS six_div_six;使用 CAST 解决问题
强制进行小数除法的最可靠方法,是将至少一个操作数转换类型为十进制类型。CAST(value AS DECIMAL) 或 CAST(value AS NUMERIC) 会告诉 SQL 将该数字视为浮点值,因此除法会返回精确结果。
SELECT CAST(1 AS DECIMAL) / 2 AS result;对两侧都使用 CAST
只需将除法的一侧转换为小数类型,就能得到小数结果——SQL 会自动提升另一个操作数的类型。不过,将两侧都进行转换可以明确表达意图,避免日后阅读代码时产生困惑。
SELECT
CAST(7 AS DECIMAL) / CAST(3 AS DECIMAL) AS both_cast,
CAST(7 AS DECIMAL) / 3 AS one_cast;使用十进制字面量
另一个快捷方法是给某个操作数加上 .0,将其写成十进制字面量。SQL 会将 1.0 视为十进制数字,从而强制整个表达式使用十进制算术。
这对于快速编写临时查询很方便,但在生产代码中,CAST 表达得更清楚。
SELECT 1.0 / 2 AS decimal_result,
7.0 / 3 AS another_result;真实陷阱:列数据
处理整数列时,这个问题尤其明显。假设有一张跟踪销售目标的表。对整数列进行除法会产生整数结果——本应为 0.75 的转化率却变成了 0!
CREATE TABLE sales_targets (
rep TEXT,
achieved INT,
target INT
);
INSERT INTO sales_targets VALUES
('Alice', 75, 100),
('Bob', 3, 4),
('Carol', 9, 10);
SELECT rep,
achieved / target AS wrong_rate
FROM sales_targets;修正列除法
对分子列应用 CAST,除法现在会以小数形式返回真实的转化率。分母会自动提升为小数类型。
之后乘以 100.0 可得到百分比,整个过程仍然使用小数运算。
SELECT rep,
CAST(achieved AS DECIMAL) / target AS conversion_rate,
CAST(achieved AS DECIMAL) / target * 100.0 AS pct
FROM sales_targets;控制小数精度
您可以在转换时指定精度和小数位数,以控制存储的小数位数:DECIMAL(10, 2) 表示总共最多 10 位数字,其中小数点后有 2 位。当您希望得到整洁且经过四舍五入的输出,而不是许多末尾数字时,这非常有用。
SELECT CAST(CAST(1 AS DECIMAL(10,4)) / 3 AS DECIMAL(10,2)) AS rounded_result;除法后的 ROUND
有时您希望在内部使用完整精度进行计算,然后再对最终显示值进行四舍五入。ROUND 函数接收要处理的值以及您希望保留的小数位数。
始终先进行除法(使用小数运算),然后再进行四舍五入——不要在除法前四舍五入。
SELECT
ROUND(CAST(1 AS DECIMAL) / 3, 4) AS four_places,
ROUND(CAST(1 AS DECIMAL) / 3, 2) AS two_places,
ROUND(CAST(1 AS DECIMAL) / 3, 0) AS zero_places;整数除法也有用处
整数除法不一定是错误,有时它正是您需要的结果。例如,将分钟总数转换为整小时数时,就会有意使用整数除法。关键在于要有意识地选择整数除法或小数除法,而不是无意中使用其中一种。
SELECT
137 / 60 AS full_hours,
137 % 60 AS remaining_minutes;快速检查
测试您对 SQL 中整数除法与小数除法的理解。
课程回顾
在本课中,您学习了 SQL 如何处理整数之间的除法:
- 整数 / 整数会截断结果,小数部分会被悄悄丢弃。
- 至少对一个操作数使用
CAST(value AS DECIMAL),即可强制进行小数除法。 - 写入
1.0这样的小数常量,也会将表达式提升为小数运算。 - 在除法后使用
ROUND,以控制显示的小数位数。 - 整数除法有时是有意为之(例如将分钟转换为小时),但始终应将其作为有意识的选择,而不是偶然结果。
只要对整数列进行除法,就请注意这个陷阱——它是 SQL 查询中最常见、也最难察觉的静默错误来源之一。
常见问题解答
「整数除法与小数除法」课时是免费的吗?
是的 — 「整数除法与小数除法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「整数除法与小数除法」这节课中我会学到什么?
通过类型转换避免意外结果 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「整数除法与小数除法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。