Administrator
发布于 2025-09-27 / 4 阅读
0
0

MySQL 数学函数

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:随机数练习

  1. rand() 生成[0,1 )随机小数

[开始值,结束值] 共同构成了“数值范围”(宽度)

数值范围

如果结束值是b,那么b决定数值范围的宽度。

  1. 生成[0~5)之间的随机小数

  2. 生成[0~10)之间的随机小数

  3. 生成[0~11)之间的随机小数

  4. 生成[0~100)之间的随机小数

起始值

规律: select a + rand() * (b - a)

1. 请说出下面随机数的数值范围

select 1 + rand();
  1. 请说出下面的数值范围

select 2 + rand();
  1. 生成[0.5~1)之间的小数

select 0.5 + rand() * 0.5; 
      --[0.5 ~ 1.5]        
  1. 生成[2~10)之间的小数

select 2 + rand() * (10 - 2)

生成[a,b)之间的整数

  1. 生成[2,10)之间整数

select 2 + rand() * (10 - 2)

生成[a,b]之间整数

  1. 生成[2,10]之间整数

select floor(2 + rand() * (10 - 2 + 1));
             [2,10)
  1. 公式是什么

select floor(a + rand() * (b - a + 1))

生成[a,b]之间的小数

  1. 生成[2~10]之间的小数

  1. 生成[a~b]之间的随机整数的公式

select floor(a + rand() * (b - a + 1)) 
  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 时结果为 1

  • IF(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四舍五入';

函数总结

函数

用途

示例

ABS(x)

绝对值

ABS(-5) = 5

RAND()

随机小数 [0,1)

RAND()

CEIL(x)

向上取整

CEIL(4.2) = 5

FLOOR(x)

向下取整

FLOOR(4.9) = 4

ROUND(x, d)

四舍五入到d位小数

ROUND(3.14159, 2) = 3.14

TRUNCATE(x, d)

截断到d位小数

TRUNCATE(3.14159, 2) = 3.14

POW(x, y)

x的y次方

POW(2, 5) = 32

SQRT(x)

平方根

SQRT(81) = 9

MOD(x, y)

求余数

MOD(17, 5) = 2

PI()

圆周率

PI() = 3.141593

这些是 MySQL 中最常用的数学函数,掌握它们对于数据处理和分析非常重要。


评论