首页 > MySQL > MySQL 那些你不知道的 数学函数
2009五月2

MySQL 那些你不知道的 数学函数

这一系列写了好久,书也看了挺长时间,今天终于写到了函数了,再往下就是数据库的基本操作了,有些小兴奋。

五一小长假,大家貌似都出去玩了,我却折腾了两天了,明天估计还有一天。

小猫病了,不过还好,这小子不会这么快挂掉的。别的不说了,早日康复吧。

MySQL包括了100多种函数,从简单的数学函数到复杂的比较函数和日期操作函数,在程序开发过程中,正确的选择应用这些函数会使你少走很多弯路的。

简单的数学计算,与拼音,识字,是我从小学到现在让我一直在用的不多的东西。呵呵。

GREATEST(x1,x2,…,xn) 返回集合中最大的值,LEAST(x1,x2,…,xn) 返回集合中最小的值:

select greatest(1,2,3,4,5),least(1,2,3,4,5);
/*
+---------------------+------------------+
| greatest(1,2,3,4,5) | least(1,2,3,4,5) |
+---------------------+------------------+
|                   5 |                1 |
+---------------------+------------------+
1 row in set (0.00 sec)
*/

刚才敲代码的时候忽然想了一下,在别的开发语言中”MAX()”这个函数也是返回最大值的,那么MySQL支持这个函数吗?

试了一下,NO,上网上搜了一下,结果是这样的

在MySQL在 3.22.5 以前的版本, 你能使用MAX()而不是GREATEST.

至于怎么获得你现在的MySQL的版本号呢?请参照我另一个教程,这里不多做介绍:获取MySQL版本号

MySQL不允许函数名和括号之间有空格。

使用FLOOR()和CEILING()函数获得接近一个数的最大和最小整数值:
这个意思说的很明显了,我举个例子吧。。

select floor(-75.99),ceiling(-75.99),floor(99.99),ceiling(99.99);
/*
+---------------+-----------------+--------------+----------------+
| floor(-75.99) | ceiling(-75.99) | floor(99.99) | ceiling(99.99) |
+---------------+-----------------+--------------+----------------+
|           -76 |             -75 |           99 |            100 |
+---------------+-----------------+--------------+----------------+
1 row in set (0.00 sec)
*/

ROUND()函数将数值进行四舍五入:

select round(10.33),round(65.9999),round(-1.345);
/*
+--------------+----------------+---------------+
| round(10.33) | round(65.9999) | round(-1.345) |
+--------------+----------------+---------------+
|           10 |             66 |            -1 |
+--------------+----------------+---------------+
1 row in set (0.00 sec)
*/

TRUNCATE()函数和ROUND()函数相似但是并不相同,它把一个数字截短成为一个小数个数的数字,但是不进行四舍五入哈:

select truncate(1.799999999,2),truncate(-555.5555,10),truncate(1.23456,2);
/*
+-------------------------+------------------------+---------------------+
| truncate(1.799999999,2) | truncate(-555.5555,10) | truncate(1.23456,2) |
+-------------------------+------------------------+---------------------+
|                    1.79 |        -555.5555000000 |                1.23 |
+-------------------------+------------------------+---------------------+
1 row in set (0.00 sec)
*/

如果我们给truncate()函数的第二个参数加一个负值的话看看会返回什么?没错,小数前保留多少位。

select truncate(1.799999999,-2),truncate(-555.5555,-10),truncate(1.23456,-2);
/*
+--------------------------+-------------------------+----------------------+
| truncate(1.799999999,-2) | truncate(-555.5555,-10) | truncate(1.23456,-2) |
+--------------------------+-------------------------+----------------------+
|                        0 |                       0 |                    0 |
+--------------------------+-------------------------+----------------------+
1 row in set (0.00 sec)
*/

select truncate(133.99,-2),truncate(-555.5555,-10),truncate(1.23456,-2);
/*
+---------------------+-------------------------+----------------------+
| truncate(133.99,-2) | truncate(-555.5555,-10) | truncate(1.23456,-2) |
+---------------------+-------------------------+----------------------+
|                 100 |                       0 |                    0 |
+---------------------+-------------------------+----------------------+
1 row in set (0.00 sec)
*/

ABS()函数获取数字绝对值:

select abs(-1.222),abs(99);
/*
+-------------+---------+
| abs(-1.222) | abs(99) |
+-------------+---------+
|       1.222 |      99 |
+-------------+---------+
1 row in set (0.00 sec)
*/

SIGN()函数返回数字的符号,取决于返回结果是正数(1),负数(-1)或者零(0):

select sign(-1.22),sign(0),sign(1.22),sign(abs(-1.22));
/*
+-------------+---------+------------+------------------+
| sign(-1.22) | sign(0) | sign(1.22) | sign(abs(-1.22)) |
+-------------+---------+------------+------------------+
|          -1 |       0 |          1 |                1 |
+-------------+---------+------------+------------------+
1 row in set (0.00 sec)
*/

RAND()函数返回0到1之间的随机数:

select rand(),rand(),rand();
/*
+-------------------+------------------+-------------------+
| rand()            | rand()           | rand()            |
+-------------------+------------------+-------------------+
| 0.097297903240936 | 0.87414158030799 | 0.078814222550778 |
+-------------------+------------------+-------------------+
1 row in set (0.00 sec)
*/

提供一个参数(种子)使RAND()随机数生成一个指定的值

select rand(10),rand(15),rand(20);
/*
+------------------+------------------+------------------+
| rand(10)         | rand(15)         | rand(20)         |
+------------------+------------------+------------------+
| 0.65705152196535 | 0.90796706910056 | 0.15888261251047 |
+------------------+------------------+------------------+
1 row in set (0.00 sec)
*/


select rand(10),rand(15),rand(20);
/*
+------------------+------------------+------------------+
| rand(10)         | rand(15)         | rand(20)         |
+------------------+------------------+------------------+
| 0.65705152196535 | 0.90796706910056 | 0.15888261251047 |
+------------------+------------------+------------------+
1 row in set (0.00 sec)
*/

关于这个种子,我查了一些资料,基本上有些发晕。

我认为最好的一个材料是这样说的:

。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。原文地址:rand()每次产生的随机数都一样

呃,还有人说rand()的效率问题,这也是网上讨论比较多的。可以参照mysql使用rand随机查询记录效率测试

至于一些指数,对数之类的,至少我用的不多,就懒得记了,用到时再查吧,呵呵,我是个懒人。

呵呵,又一篇MySQL的日志完成了,开心 :shock:

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/05/02/300/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

本文目前尚无任何评论.

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)