数学函数和运算符
数学表达式既取决于运算符,也取决于输入类型。以下使用 PostgreSQL;尤其要区分整数、精确小数 numeric 和近似浮点数。
算术与类型
| 写法 | 作用 | 示例 |
|---|---|---|
a + b、a - b、a * b | 加、减、乘 | 2 * 3 = 6 |
a / b | 除法 | 5 / 2 = 2(整数除法) |
a % b | 余数 | 5 % 2 = 1 |
a ^ b | 幂 | 2 ^ 3 = 8 |
| ` | / a、 |
整数相除会向零截断;要保留小数,可先转换:
SELECT 5 / 2 AS integer_result, 5::numeric / 2 AS decimal_result;
-- 2、2.500000...
除数为零会报错,a / NULLIF(b, 0) 可在 b = 0 时返回 NULL,但必须由业务决定如何处理这个空值。整数计算可能溢出,浮点计算可能有舍入误差;金额通常使用带合适精度的 numeric。
常用函数
SELECT abs(-8), sign(-8), ceil(2.1), floor(2.9), trunc(2.99);
-- 8、-1、3、2、2
SELECT round(12.345::numeric, 2), trunc(12.345::numeric, 2);
-- 12.35、12.34
round 四舍五入,trunc 直接截去多余小数位;负精度可用于十位、百位。numeric 与浮点数的中间值舍入策略可能不同,不能用浮点数测试替代财务数据测试。mod(a, b) 求余,power(a, b) 求幂,sqrt(a) 开平方;对数有 ln、log,并有 exp、三角函数等,输入域和返回类型需按函数签名核对。
随机数与序列
SELECT random(); -- 0 <= 结果 < 1
SELECT generate_series(1, 5, 2); -- 1、3、5,各占一行
random() 适合模拟或抽样,不适合密码学密钥;随机排序整个大表 ORDER BY random() 通常代价很高。generate_series 是集合返回函数,适用于生成连续整数或时间点;步长不能为零,日期时间版本要核对时区和夏令时语义。
运算习惯
混合类型、负数取余和幂运算优先级可能超出直觉,用括号明确顺序。numeric 的精度可靠但通常比整数、浮点运算更昂贵;根据数据范围与精度要求选类型,而非只根据结果展示格式选函数。