9月28日 数学函数
考试大纲中的数学函数包括6个:ABS()、FLOOR()、RAND()、TRUNCATE()、SQRT() 、ROUND()、CEIL()、MOD() 、POW() 、FORMAT()
ABS()
用途:取绝对值
语法:
ABS(n)
示例
SELECT ABS(-12.5); -- 输出 12.5
MOD()
用途:取余数
语法
MOD(n, m)
示例
SELECT MOD(15, 4); -- 输出 3
SELECT MOD(-15, 4); -- 输出 -3
POW()
用途:计算 x 的 y 次幂
语法
POW(x, y)
示例
SELECT POW(2, 3); -- 输出 8
SQRT()
用途:求平方根
语法
SQRT(x)
注意:x 必须为非负数
示例
SELECT SQRT(9); -- 输出 3
CEIL()
用途:向上取整
CEIL(x) / CEILING(x)
示例
SELECT CEIL(3.1); -- 返回 4
SELECT CEIL(-3.1) -- 返回 -3
FLOOR()
用途:向下取整
语法
CEIL(x)
示例
SELECT FLOOR(3.9); -- 输出 3
ROUND()
用途:四舍五入到指定小数位
语法
ROUND(x, d)
示例
SELECT ROUND(3.1415, 2); -- 输出 3.14
SELECT ROUND(123.456, -1); -- 输出 120(十位取整)
TRUNCATE()
用途:直接截断小数位。(与 ROUND 不同,不会四舍五入)
语法
TRUNCATE(x, d)
示例
SELECT TRUNCATE(3.1415, 2); -- 输出 3.14
FORMAT()
用途:数字格式化(千分位)
语法
FORMAT(x, d)
示例
-- 输出 '1,234,567.46'(会四舍五入)
SELECT FORMAT(1234567.456, 2);
RAND()
用途: 生成 [0~1)之间的随机浮点数。
语法
RAND()
示例:
RAND();
示例:生成一个0 ~ 1之间(不含1)的随机小数
SELECT RAND();
运行结果
+--------------------+
| rand() |
+--------------------+
| 0.5100285648461698 |
+--------------------+
1 row in set (0.001 sec)
语法
-- 生成随机整数区间
FLOOR(a + RAND() * (b - a + 1))
-- 生成小数
floor(起始值 + RAND() * 范围长度) / 范围长度
解析
-- RAND():生成 [0, 1) 的随机小数。
-- RAND() \* (b - a + 1):将随机数放大到 [0, b - a + 1)。
-- FLOOR(...):向下取整,得到 0 ≤ 结果 < b - a + 1 的整数。
-- a + ...:平移区间到 [a, a + (b - a + 1)),即 [a, b + 1),最终结果为 [a, b]。
练习1:随机数练习
rand() 生成[0,1 )随机小数
[开始值,结束值] 共同构成了“数值范围”(宽度)
数值范围
如果结束值是b,那么b决定数值范围的宽度。
生成[0~5)之间的随机小数
生成[0~10)之间的随机小数
生成[0~11)之间的随机小数
生成[0~100)之间的随机小数
起始值
规律: select a + rand() * (b - a)
1. 请说出下面随机数的数值范围
select 1 + rand();
请说出下面的数值范围
select 2 + rand();
生成[0.5~1)之间的小数
select 0.5 + rand() * 0.5;
--[0.5 ~ 1.5]
生成[2~10)之间的小数
select 2 + rand() * (10 - 2)
生成[a,b)之间的整数
生成[2,10)之间整数
select 2 + rand() * (10 - 2)
生成[a,b]之间整数
生成[2,10]之间整数
select floor(2 + rand() * (10 - 2 + 1));
[2,10)
公式是什么
select floor(a + rand() * (b - a + 1))
生成[a,b]之间的小数
生成[2~10]之间的小数
生成[a~b]之间的随机整数的公式
select floor(a + rand() * (b - a + 1))
生成[a~b]之间的随机小数的公式
select floor(a + rand() * (b - a + 1)) / b;
练习2:随机数
生成 [0~5] 的随机整数
生成 [1~8] 的随机整数(包含 1 和 8)
生成 [10~20) 的随机整数
生成 [1-100] 的随机整数
掷骰子[1~6]
随机抽奖[100~999]
随机布尔值[0/1]
生成两位小数的随机数(含 0 和 1)
生成四位小数的随机数(含 0 和 1)
练习3:基础函数
计算-25的绝对值
生成一个 0 到 1 之间的随机小数
将数字 4.2 向上取整
将数字 4.9 向下取整
将数字 3.14159 保留两位小数并四舍五入
将数字 3.14159 截断为两位小数
计算 2 的 5 次方
计算 81 的平方根
求 17 除以 5 的余数
查询圆周率 PI 的值 : select PI()
随机生成一个 1 到 100 之间的整数
将 -8.7 四舍五入为整数
练习2:随机数答案
1. 生成 [0~5] 的随机整数
SELECT FLOOR(RAND() * 6);
2. 生成 [1~8] 的随机整数(包含 1 和 8)
SELECT FLOOR(1 + RAND() * 8);
3. 生成 [10~20) 的随机整数
SELECT FLOOR(10 + RAND() * 10);
4. 生成 [1-100] 的随机整数
SELECT FLOOR(1 + RAND() * 100);
5. 掷骰子[1~6]
SELECT FLOOR(1 + RAND() * 6);
6. 随机抽奖[100~999]
SELECT FLOOR(100 + RAND() * 900);
7. 随机布尔值[0/1](不使用 ROUND)
SELECT FLOOR(RAND() + 0.5);
-- 或者
SELECT IF(RAND() < 0.5, 0, 1);
解释:
FLOOR(RAND() + 0.5)
:当 RAND() < 0.5 时结果为 0,当 RAND() ≥ 0.5 时结果为 1IF(RAND() < 0.5, 0, 1)
:直接根据条件返回 0 或 1
8. 生成两位小数的随机数(含 0 和 1,不使用 ROUND)
SELECT FLOOR(RAND() * 100) / 100;
解释:先生成 [0, 100) 的整数,然后除以 100 得到两位小数。注意:这种方法不包含 1.00。
如果要包含 1.00:
SELECT FLOOR(RAND() * 101) / 100;
9. 生成四位小数的随机数(含 0 和 1,不使用 ROUND)
SELECT FLOOR(RAND() * 10000) / 10000;
解释:先生成 [0, 10000) 的整数,然后除以 10000 得到四位小数。注意:这种方法不包含 1.0000。
如果要包含 1.0000:
SELECT FLOOR(RAND() * 10001) / 10000;
验证所有结果的完整 SQL
-- 验证所有题目答案(不使用 ROUND)
SELECT
FLOOR(RAND() * 6) AS '[0~5]',
FLOOR(1 + RAND() * 8) AS '[1~8]',
FLOOR(10 + RAND() * 10) AS '[10~20)',
FLOOR(1 + RAND() * 100) AS '[1-100]',
FLOOR(1 + RAND() * 6) AS '骰子[1~6]',
FLOOR(100 + RAND() * 900) AS '抽奖[100~999]',
FLOOR(RAND() + 0.5) AS '布尔[0/1]',
FLOOR(RAND() * 101) / 100 AS '两位小数[0-1]',
FLOOR(RAND() * 10001) / 10000 AS '四位小数[0-1]';
替代方案总结
当不使用 ROUND() 时:
随机布尔值:使用
FLOOR(RAND() + 0.5)
或IF(RAND() < 0.5, 0, 1)
指定位数小数:使用
FLOOR(RAND() * 倍数) / 倍数
的方法两位小数:
FLOOR(RAND() * 101) / 100
(包含1.00)四位小数:
FLOOR(RAND() * 10001) / 10000
(包含1.0000)
这些方法避免了使用 ROUND() 函数,同时实现了相同的功能。
1. 计算-25的绝对值
SELECT ABS(-25);
-- 结果: 25
2. 生成一个 0 到 1 之间的随机小数
SELECT RAND();
-- 结果: [0, 1) 之间的随机小数,如 0.123456789
3. 将数字 4.2 向上取整
SELECT CEIL(4.2);
-- 结果: 5
4. 将数字 4.9 向下取整
SELECT FLOOR(4.9);
-- 结果: 4
5. 将数字 3.14159 保留两位小数并四舍五入
SELECT ROUND(3.14159, 2);
-- 结果: 3.14
6. 将数字 3.14159 截断为两位小数
SELECT TRUNCATE(3.14159, 2);
-- 结果: 3.14
7. 计算 2 的 5 次方
SELECT POW(2, 5);
-- 结果: 32
8. 计算 81 的平方根
SELECT SQRT(81);
-- 结果: 9
9. 求 17 除以 5 的余数
SELECT MOD(17, 5);
-- 或者
SELECT 17 % 5;
-- 结果: 2
10. 查询圆周率 PI 的值
SELECT PI();
-- 结果: 3.141593
11. 随机生成一个 1 到 100 之间的整数
SELECT FLOOR(1 + RAND() * 100);
-- 结果: [1, 100] 之间的随机整数
12. 将 -8.7 四舍五入为整数
SELECT ROUND(-8.7);
-- 结果: -9
完整验证所有函数的 SQL 语句
SELECT
ABS(-25) AS '绝对值',
RAND() AS '随机小数',
CEIL(4.2) AS '向上取整',
FLOOR(4.9) AS '向下取整',
ROUND(3.14159, 2) AS '四舍五入两位小数',
TRUNCATE(3.14159, 2) AS '截断两位小数',
POW(2, 5) AS '2的5次方',
SQRT(81) AS '81的平方根',
MOD(17, 5) AS '17除以5的余数',
PI() AS '圆周率',
FLOOR(1 + RAND() * 100) AS '1-100随机整数',
ROUND(-8.7) AS '-8.7四舍五入';
函数总结
这些是 MySQL 中最常用的数学函数,掌握它们对于数据处理和分析非常重要。