19.数学函数
一、基础运算类
函数 | 功能说明 | 示例(假设 ) |
| 计算数值的绝对值,无论原数正负,结果非负 |
→ |
| 计算余数(同 逻辑,结果符号与分子一致 ) |
→ ; → |
二、进制转换类
函数 | 功能说明 | 示例(以十进制数 为例) |
| 把十进制数转二进制字符串 |
→ |
| 把十进制数转十六进制字符串 |
→ |
| 通用进制转换(支持不同进制间转换, 是原数进制, 是目标进制 ) | 十进制 转八进制: → |
三、取整与小数处理类
函数 | 功能说明 | 示例(以 、 为例 ) |
| 向上取整,返回不小于原数的最小整数(同 别名) |
→ ; → |
| 向下取整,返回不大于原数的最大整数 |
→ ; → |
| 按指定小数位数格式化数值(会四舍五入,结果是字符串类型 ) |
→ |
四、统计比较类
函数 | 功能说明 | 示例(参数为 时 ) |
| 从多个数值中取最小值(参数需同类型或可隐式转换,遇 结果可能受影响 ) |
→ |
| 生成随机浮点数,范围 ;带 时可固定随机序列(同种子生成相同值 ) |
→ 随机值(如 ); → 固定序列值 |
这些函数覆盖了数值计算、进制转换、取整、统计等常见数学场景,用的时候记得结合实际需求选~ 比如处理金额用 FORMAT
格式化小数,做随机数据用 RAND
。
五、示例
(1)创建测试表
-- 创建测试表
CREATE TABLE numbers_test (id INT PRIMARY KEY AUTO_INCREMENT,int_positive INT,int_negative INT,decimal_positive DECIMAL(10,2),decimal_negative DECIMAL(10,2),fractional_number FLOAT,large_number BIGINT,zero_value INT,null_value INT
);-- 插入测试数据
INSERT INTO numbers_test (int_positive, int_negative, decimal_positive, decimal_negative, fractional_number, large_number, zero_value, null_value)
VALUES(10, -5, 3.14, -2.718, 0.123456789, 9223372036854775807, 0, NULL),(20, -10, 1234.56, -987.65, 0.987654321, 123456789012345, 0, NULL),(1, -1, 0.01, -0.01, 0.5, 10000000000, 0, NULL),(0, 0, 0.00, 0.00, 0, 0, 0, NULL);
(2)求绝对值
-- 1. ABS() 测试
SELECT int_negative, ABS(int_negative) AS absolute_value
FROM numbers_test;
(3)取余
-- 2. MOD() 测试
SELECT int_positive, MOD(int_positive, 3) AS mod_result
FROM numbers_test;
(4)转二进制和十六进制
-- 3. BIN() 和 HEX() 测试
SELECT int_positive, BIN(int_positive) AS `binary`, -- 使用反引号转义保留关键字HEX(int_positive) AS hexadecimal
FROM numbers_test;
(5)十进制转八进制
-- 4. CONV() 测试 (十进制转八进制)
SELECT int_positive, CONV(int_positive, 10, 8) AS octal
FROM numbers_test;
(6)向上向下取整
-- 5. CEILING() 和 FLOOR() 测试
SELECT fractional_number, CEILING(fractional_number) AS ceiling, FLOOR(fractional_number) AS floor
FROM numbers_test;
(7)小数点格式化
-- 6. FORMAT() 测试
SELECT decimal_positive, FORMAT(decimal_positive, 1) AS formatted
FROM numbers_test;
(8)取最小值
-- 7. LEAST() 测试
SELECT int_positive, int_negative, LEAST(int_positive, int_negative) AS smallest
FROM numbers_test;
(9)生成随机数
-- 8. RAND() 测试 (生成随机数)
SELECT id, RAND() AS random_value,RAND(id) AS seeded_random -- 使用id作为种子生成可重复的随机值
FROM numbers_test;
再次执行生成随机数的sql语句:根据种子生成的随机数无论再生成多少次都是固定的。
说明:
在 MySQL 的 RAND()
函数里,种子(seed) 是用来控制随机数生成逻辑的关键参数,作用主要体现在 让随机数生成可预测、可重复,核心逻辑和效果可以这样理解:
1. 基础原理:随机数的“伪随机”本质
计算机里的“随机数”大多是 伪随机数,靠数学算法(比如线性同余法)生成。给 RAND(seed)
传固定种子,算法就会基于这个初始值,按固定规则生成后续随机数序列 。
2. 种子的核心作用:让随机结果“可重复”
- 不传种子(
RAND()
):每次调用会用系统时钟等动态值当种子,生成的随机数完全随机、无规律,每次执行 SQL 结果都不同。
比如:
SELECT RAND(), RAND() FROM numbers_test;
-- 每次执行结果都变,像 0.1234、0.5678 或 0.9876、0.4321 这类无规律组合
- 传固定种子(
RAND(seed)
):只要种子不变,同一套数据、同一条 SQL 生成的随机数序列就固定。
用你测试表的id
当种子举例:
-- 假设 id 是 1、2、3
SELECT id, RAND(id) AS seeded_random FROM numbers_test;
第一次执行,id=1
时 RAND(1)
生成一个固定值(比如 0.4054
),id=2
时 RAND(2)
也对应固定值(比如 0.9233
);下次再执行这条 SQL,id
对应行的 seeded_random
结果和之前 完全一样 。
3. 实用场景:需要“可控随机”的地方
- 测试环境:想让测试数据里的随机数固定(比如模拟抽奖、分配场景),用种子保证每次跑测试逻辑一致。
- 数据脱敏/ anonymization:给用户数据加随机扰动,但又要同一用户每次处理结果一致(用用户 ID 当种子),方便追溯。
- 生成可复现的“随机”序列:比如游戏里固定种子生成地图、关卡随机元素,保证玩家重试时场景一致。
4. 注意细节
- 种子是“初始值”:种子相同,生成的随机数序列固定,但不同行(
id
不同)只要种子固定,各自的随机数也是按规则生成的固定值(不是所有行都同一个数)。 - 整数种子:
RAND(seed)
的seed
要求是整数,传非整数会自动转成整数(比如传1.2
会当1
处理 )。
简单说,种子就是给随机数算法一个“初始密码” ,知道密码(种子),就能复现相同的随机数序列;不知道(或用动态种子),结果就完全随机 。用 id
当种子,能让同一条数据每次生成的随机数固定,方便测试和一些需要“可控随机”的业务逻辑~