在SQL查询中,数值计算几乎是绕不开的需求。统计销售额时需要保留两位小数,生成验证码或随机排序时需要随机数,处理差值比较时需要绝对值。SQLite作为使用最广泛的嵌入式数据库,内置了一批数学函数来处理这类场景。这篇文章重点介绍ABS、ROUND、RANDOM三个函数的详细用法,并顺带补充其他常用数学函数,帮你把数值处理的查询写得更顺手。

ABS函数:取绝对值的基本功
ABS函数的作用非常直观:返回参数的绝对值。语法是ABS(numeric_value),传入一个数值表达式,返回它的非负形式。如果传入NULL,结果也是NULL,这一点在处理可空字段时要格外注意,否则查询结果中可能混入NULL导致后续计算出错。
一个典型的应用场景是比较两个数值的差值是否在允许范围内。比如判断库存数量与盘点数量是否相差不超过5,可以这样写:
-- 查找盘点差异超过5的商品 SELECT product_name, stock_count, check_count FROM inventory WHERE ABS(stock_count - check_count) > 5;
如果不使用ABS,就需要写两个条件(大于或小于),而ABS让逻辑变得简洁清晰。另一个常见用途是处理坐标、温度这类带符号的数据,例如计算两点之间的曼哈顿距离时,ABS(abs(x1 - x2) + abs(y1 - y2))这种写法在SQLite中完全可行。
需要注意一点:ABS作用于整数时返回整数,作用于浮点数时返回浮点数,作用于文本时会先尝试隐式转换,转换失败则返回0。这种隐式转换行为有时会掩盖数据问题,建议在字段类型不规范的表中先做类型检查再用ABS。
ROUND函数:小数保留与四舍五入的细节
ROUND函数的语法是ROUND(value, digits),第二个参数指定保留的小数位数,可以省略,省略时默认保留0位,也就是取整。来看几个例子:
SELECT ROUND(3.14159, 2); -- 结果 3.14 SELECT ROUND(3.14159); -- 结果 3.0 SELECT ROUND(2.5); -- 结果 3.0 SELECT ROUND(-2.5); -- 结果 -3.0 SELECT ROUND(123.456, -1); -- 结果 120.0,负数表示保留到十位
ROUND在SQLite中采用的是“四舍五入远离零”的规则,也就是说2.5会进位到3,-2.5会变成-3,而不是像某些语言那样取偶数。第二个参数传负数时,表示对小数点左边的位数进行舍入,例如-1表示保留到十位,-2表示保留到百位,这个特性在统计报表的粗略汇总时很实用。
这里有一个非常经典的浮点数精度陷阱。看下面的查询:
SELECT ROUND(0.1 + 0.2, 1); -- 期望 0.3 SELECT 0.1 + 0.2; -- 实际是 0.30000000000000004
由于IEEE 754浮点数表示的限制,0.1加0.2的结果略大于0.3,ROUND之后再配合下游计算可能产生细微偏差。如果涉及金额等对精度敏感的场景,建议要么用整数存储(以分为单位),要么在应用层使用高精度计算库,不要完全依赖SQLite的浮点ROUND。返回值类型方面,ROUND的结果总是浮点数,即使保留了0位小数也会返回3.0而不是3,如果你的前端展示不希望出现小数点,需要在应用层再做一次格式化。
RANDOM函数:随机数生成与实际应用
RANDOM函数不需要参数,调用RANDOM()会返回一个介于-9223372036854775808和9223372036854775807之间的64位有符号整数,也就是整个int64范围。注意它会返回负数,这一点和MySQL的RAND()返回0到1之间的小数完全不同,从其他数据库迁移SQL时最容易在这里出错。
实际使用中,我们通常需要对RANDOM的结果做取模运算来限定范围。例如生成1到100之间的随机整数:
-- ABS让结果非负,取模100得到0~99,再加1变成1~100 SELECT ABS(RANDOM()) % 100 + 1; -- 随机抽取10条记录 SELECT * FROM articles ORDER BY RANDOM() LIMIT 10;
ORDER BY RANDOM()是随机抽样最常见的写法,实现原理是给每一行计算一个随机值再排序。优点是写法极其简单,缺点也很明显:需要对全表排序,数据量大时性能很差。如果表中有一亿行,仅仅为了抽10条而对全表做排序是不划算的。数据量大时更推荐的做法是先算出随机的主键值再精准查询,或者在应用层生成随机偏移量后使用LIMIT加OFFSET。
还要注意,同一个查询中每行调用RANDOM()得到的结果都不同,但同一个语句在不同数据库连接中的行为是一致的,这点与某些数据库的随机种子机制有差异。此外,如果需要可重复的“随机”结果(比如测试场景),SQLite没有内置随机种子设置,通常需要借助应用层生成随机值再作为参数传入。
其他常用数学函数与版本注意事项
除了上述三个函数,SQLite还提供了完整的数学函数集。常用的包括:CEIL和FLOOR用于向上向下取整,SQRT开平方,POW求幂,MOD取模,以及三角函数SIN、COS、ATAN等。下面是一个综合示例:
SELECT CEIL(4.2), -- 5 FLOOR(4.8), -- 4 SQRT(16), -- 4.0 POW(2, 10), -- 1024.0 MOD(10, 3); -- 1
有一个重要的版本问题需要提醒:数学函数在SQLite 3.35.0之前默认并未编译进标准发行版。如果你使用的是老版本,调用SQRT或CEIL可能会报错提示函数不存在。解决方法有两种:一是升级到3.35.0及以上版本,这些函数已经默认启用;二是在编译源码时加上-DSQLITE_ENABLE_MATH_FUNCTIONS选项重新编译。好在ABS、ROUND、RANDOM这三个函数属于核心内置函数,在任何版本的SQLite中都可用,这也是它们使用频率远高于其他数学函数的原因之一。
最后建议在写复杂计算查询时,用少量真实数据先验证边界情况,特别是NULL参与运算、整数溢出和浮点精度这三类问题,它们是SQLite数值计算中最常见的坑。掌握好这些函数的行为细节,配合CASE WHEN和聚合函数,就能应对绝大多数业务中的数值处理需求了。
SQLite数学函数SQLite ABSSQLite RANDOM修改时间:2026-09-05 09:54:46