ROUND

声明

ROUND(X), ROUND(X,D)

说明

返回一个数值,四舍五入到指定的长度或精度。

返回参数 X, 其值接近于最近似的整数。在有两个参数的情况下,返回 X,其值保留到小数点后 D 位,而第 D 位的保留方式为四舍五入。若要接保留 X 值小数点左边的 D 位,可将 D 设为负值。

返回值的类型同第一个自变量相同(假设它是一个整数、双精度数或小数)。这意味着对于一个整数参数,结果也是一个整数(无小数部分)。

  • 对于准确值数字,ROUND() 使用“四舍五入”或“舍入成最接近的数”的规则:对于一个分数部分为 .5 或大于 .5 的值,正数则上舍入到邻近的整数值,负数则下舍入临近的整数值。(换言之, 其舍入的方向是数轴上远离零的方向)。对于一个分数部分小于 .5 的值,正数则下舍入下一个整数值,负数则下舍入邻近的整数值,而正数则上舍入邻近的整数值。

  • 对于近似值数字, ROUND() 遵循“四舍—大于五入—五取最接近的偶数”的规则:一个带有任何小数部分的值会被舍入成最接近的偶数整数。

例子

  1. obclient> select round(2.15,2);
  2. +---------------+
  3. | round(2.15,2) |
  4. +---------------+
  5. | 2.15 |
  6. +---------------+
  7. 1 row in set (0.00 sec)
  8. obclient> select round(2555e-2,1);
  9. +------------------+
  10. | round(2555e-2,1) |
  11. +------------------+
  12. | 25.6 |
  13. +------------------+
  14. 1 row in set (0.01 sec)
  15. obclient> select round(25e-1), round(25.3e-1),round(35e-1);
  16. +--------------+----------------+--------------+
  17. | round(25e-1) | round(25.3e-1) | round(35e-1) |
  18. +--------------+----------------+--------------+
  19. | 2 | 3 | 4 |
  20. +--------------+----------------+--------------+
  21. 1 row in set (0.00 sec)

CEIL

声明

CEIL(expr)

说明

返回大于或者等于指定表达式的最小整数。

还支持比较运算,结果为 BOOL 值,被转化为数字类型处理,产生的结果为 1(TRUE)、0 (FALSE)。

如果输入 NULL,返回值为 NULL。

如果输入纯数字的字符串,支持自动转换成数字类型。

返回值会被转化为一个 BIGINT。

例子

  1. obclient> select ceil(1.2), ceil(-1.2), ceil(1+1.5), ceil(1=1),ceil(1<1),ceil(null);
  2. +-----------+------------+-------------+-----------+-----------+------------+
  3. | ceil(1.2) | ceil(-1.2) | ceil(1+1.5) | ceil(1=1) | ceil(1<1) | ceil(null) |
  4. +-----------+------------+-------------+-----------+-----------+------------+
  5. | 2 | -1 | 3 | 1 | 0 | NULL |
  6. +-----------+------------+-------------+-----------+-----------+------------+
  7. 1 row in set (0.00 sec)
  8. obclient> select ceil(name);
  9. ERROR 1054 (42S22): Unknown column 'name' in 'field list'
  10. obclient> select ceil('2');
  11. +-----------+
  12. | ceil('2') |
  13. +-----------+
  14. | 2 |
  15. +-----------+
  16. 1 row in set (0.00 sec)

FLOOR

声明

FLOOR(expr)

说明

CEIL(expr) 函数功能类似,返回小于或者等于指定表达式的最大整数。

还支持比较运算,结果为 BOOL 值,被转化为数字类型处理,产生的结果为 1(TRUE)、0 (FALSE)。

如果输入 NULL,返回值为 NULL。

如果输入纯数字的字符串,支持自动转换成数字类型。

返回值会被转化为一个 BIGINT。

例子

  1. obclient> select floor(1.2), floor(-1.2), floor(1+1.5), floor(1=1),floor(1<1),floor(null);
  2. +------------+-------------+--------------+------------+------------+-------------+
  3. | floor(1.2) | floor(-1.2) | floor(1+1.5) | floor(1=1) | floor(1<1) | floor(null) |
  4. +------------+-------------+--------------+------------+------------+-------------+
  5. | 1 | -2 | 2 | 1 | 0 | NULL |
  6. +------------+-------------+--------------+------------+------------+-------------+
  7. 1 row in set (0.00 sec)
  8. obclient> select floor(name);
  9. ERROR 1054 (42S22): Unknown column 'name' in 'field list'
  10. obclient> select floor('2');
  11. +------------+
  12. | floor('2') |
  13. +------------+
  14. | 2 |
  15. +------------+
  16. 1 row in set (0.00 sec)

ABS

声明

ABS(expr)

说明

绝对值函数,求表达式绝对值,函数返回值类型与数值表达式的数据类型相同。

还支持比较运算,结果为 BOOL 值,被转化为数字类型处理,产生的结果为 1(TRUE)、0 (FALSE)。

如果输入 NULL,返回值为 NULL。

如果输入纯数字的字符串,支持自动转换成数字类型。

返回值会被转化为一个 BIGINT。

例子

  1. obclient> select abs(5), abs(-5.777), abs(0), abs(1/2), abs(1-5);
  2. +--------+-------------+--------+----------+----------+
  3. | abs(5) | abs(-5.777) | abs(0) | abs(1/2) | abs(1-5) |
  4. +--------+-------------+--------+----------+----------+
  5. | 5 | 5.777 | 0 | 0.5000 | 4 |
  6. +--------+-------------+--------+----------+----------+
  7. 1 row in set (0.00 sec)

NEG

声明

NEG(expr)

说明

求补函数,对操作数执行求补运算:用零减去操作数,然后结果返回操作数。

支持比较运算,结果为 BOOL 值,被转化为数字类型处理,产生的结果为 1(TRUE)、0 (FALSE),再对结果求补。

例子

  1. obclient> select neg(1), neg(1+1), neg(2*3), neg(1=1), neg(5<1);
  2. +--------+----------+----------+----------+----------+
  3. | neg(1) | neg(1+1) | neg(2*3) | neg(1=1) | neg(5<1) |
  4. +--------+----------+----------+----------+----------+
  5. | -1 | -2 | -6 | -1 | 0 |
  6. +--------+----------+----------+----------+----------+
  7. 1 row in set (0.01 sec)

SIGN

声明

SIGN(X)

说明

SIGN(X) 返回参数作为 -1、 0 或 1 的符号,该符号取决于 X 的值为负、零或正。

支持比较运算,结果为 BOOL 值,被转化为数字类型处理,产生的结果为 1(TRUE)、0 (FALSE)。

如果输入 NULL,返回值为 NULL。

支持浮点数、十六进制数。

例子

  1. obclient> SELECT SIGN(-32), SIGN(0), SIGN(234);
  2. +-----------+---------+-----------+
  3. | SIGN(-32) | SIGN(0) | SIGN(234) |
  4. +-----------+---------+-----------+
  5. | -1 | 0 | 1 |
  6. +-----------+---------+-----------+
  7. 1 row in set (0.01 sec)
  8. obclient> select sign(null),sign(false),sign(0x01);
  9. +------------+-------------+------------+
  10. | sign(null) | sign(false) | sign(0x01) |
  11. +------------+-------------+------------+
  12. | NULL | 0 | 1 |
  13. +------------+-------------+------------+
  14. 1 row in set (0.00 sec)

CONV

声明

CONV(N, from_base, to_base)

说明

不同数基间转换数字。返回值为一个字符串,由 from_base 基转化为 to_base 基。输入参数 N 可以是一个整数或字符串。最小基数为 2,而最大基数则为 36。如果 to_base 是一个负数,则 N 被看作一个带符号数。否则,N 被看作无符号数。from_base 如果是负数,则被当作整数处理,符号被忽略。N 参数仅支持 int 类型和字符串类型输入;from_baseto_base 参数仅支持十进制 int 类型输入,且取值范围为 [-36, -2] U [2, 36]。

非法输入将导致报错,其中非法输入包括以下情况:

  • from_base 或者 to_base 不是一个合法的十进制 int 类型输入;

  • from_base 或者 to_base 超出 [-36,-2] U [2,36] 的取值范围;

  • N 不是一个合法的数字表示,例如取值超出 0~9,a~z,A~Z 的字符范围;

  • N 超出了 from_base 基的取值范围,例如 from_base 为 2,而 N 取值为 3;

  • N 的取值超出了 int64 的最大表示范围,即 [-9223372036854775807, 9223372036854775807]。

例子

  1. obclient> select conv(9223372036854775807,10,2);
  2. +-----------------------------------------------------------------+
  3. | conv(9223372036854775807,10,2) |
  4. +-----------------------------------------------------------------+
  5. | 111111111111111111111111111111111111111111111111111111111111111 |
  6. +-----------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. obclient> select conv('-acc',21,-7);
  9. +--------------------+
  10. | conv('-acc',21,-7) |
  11. +--------------------+
  12. | -16425 |
  13. +--------------------+
  14. 1 row in set (0.00 sec)

MOD

声明

MOD(N,M)

说明

取余函数。MOD(N,M)N % MN MOD M 三种形式是等效的。

MOD() 对于带有小数部分的数值也起作用,它返回除法运算后的精确余数。

N,M 中任何一个参数为 NULL,返回值都为 NULL。M 为 0 时,也返回 NULL。

例子

  1. obclient> select mod(29,19), 29 mod 19, 29 % 19;
  2. +------------+-----------+---------+
  3. | mod(29,19) | 29 mod 19 | 29 % 19 |
  4. +------------+-----------+---------+
  5. | 10 | 10 | 10 |
  6. +------------+-----------+---------+
  7. 1 row in set (0.00 sec)

POW

声明

POW(X,Y)

说明

返回 XY 次方。

XY 中任何一个参数为 NULL,返回值都为 NULL。

例子

  1. obclient> select pow(4,2), pow(4,-2), pow(1,null);
  2. +----------+-----------+-------------+
  3. | pow(4,2) | pow(4,-2) | pow(1,null) |
  4. +----------+-----------+-------------+
  5. | 16 | 0.0625 | NULL |
  6. +----------+-----------+-------------+
  7. 1 row in set (0.00 sec)

POWER

声明

POWER(X,Y)

说明

POWER(X,Y)POW(X,Y) 是同义函数。

RAND

声明

RAND([N])

说明

RAND([N]) 函数接受 0 个或者 1 个参数(N 被称为随机数种子),返回一个范围是 [0,1.0) 的随机浮点数。如果想获得一个范围在 [i, j) 的随机整数,可以使用表达式 FLOOR(I + RAND() * (j - i))。

如果参数 N 不指定,那么在执行之前会使用随机种子初始化,之后 RAND() 会根据这个初始化值来生成随机数,所以 RAND() 每次会生成不同的随机数序列。

如果参数 N 指定,那么 N 会作为随机数种子来生成随机数。根据 N 是否是常量,分成以下两种情况:

  • 如果 N 是常量,那么 N 在执行之前会被当成随机种子初始化,之后 RAND(N) 会根据这个初始化值来生成随机数。相同的 N 值会生成相同的随机数序列。

  • 如果 N 是变量(比如 N 是一个列值),那么 N 会在每次执行的时候作为随机数种子来生成随机数。相同的 N 值会生成相同的随机数。

除了出现在 SECLET 语句中,RAND([N]) 也可以出现在 WHERE,ORDER BY 和 GROUP BY 语句中,它的执行方式还是按照上述规则执行。比如,如果想随机的对一个表进行排序,可以使用如下 SQL:select from t1 order by rand()。如果想随机取样一个表的 100 行,可以使用如下 SQL:select from t1 order by rand() limit 100

例子

  1. obclient> select a, b, rand() from t3;
  2. +------+------+---------------------+
  3. | a | b | rand() |
  4. +------+------+---------------------+
  5. | 1 | 1 | 0.641815407799385 |
  6. | 2 | 2 | 0.16825051248841966 |
  7. | 3 | 3 | 0.9158063697775886 |
  8. +------+------+---------------------+
  9. 3 rows in set (0.00 sec)
  10. obclient> select a, b, rand() from t3;
  11. +------+------+---------------------+
  12. | a | b | rand() |
  13. +------+------+---------------------+
  14. | 1 | 1 | 0.07428034215632857 |
  15. | 2 | 2 | 0.6239826321825224 |
  16. | 3 | 3 | 0.897072165177271 |
  17. +------+------+---------------------+
  18. 3 rows in set (0.00 sec)
  19. obclient> select a, b, rand(3) from t3;
  20. +------+------+---------------------+
  21. | a | b | rand(3) |
  22. +------+------+---------------------+
  23. | 1 | 1 | 0.9057697559760601 |
  24. | 2 | 2 | 0.37307905813034536 |
  25. | 3 | 3 | 0.14808605345719125 |
  26. +------+------+---------------------+
  27. 3 rows in set (0.00 sec)
  28. obclient> select a, b, rand(3) from t3;
  29. +------+------+---------------------+
  30. | a | b | rand(3) |
  31. +------+------+---------------------+
  32. | 1 | 1 | 0.9057697559760601 |
  33. | 2 | 2 | 0.37307905813034536 |
  34. | 3 | 3 | 0.14808605345719125 |
  35. +------+------+---------------------+
  36. 3 rows in set (0.00 sec)
  37. obclient> select a, b, rand(a), rand(b) from t3;
  38. +------+------+---------------------+---------------------+
  39. | a | b | rand(a) | rand(b) |
  40. +------+------+---------------------+---------------------+
  41. | 1 | 1 | 0.40540353712197724 | 0.40540353712197724 |
  42. | 2 | 2 | 0.6555866465490187 | 0.6555866465490187 |
  43. | 3 | 3 | 0.9057697559760601 | 0.9057697559760601 |
  44. +------+------+---------------------+---------------------+
  45. 3 rows in set (0.00 sec)