MySQL 那些你不知道的 数学函数
这一系列写了好久,书也看了挺长时间,今天终于写到了函数了,再往下就是数据库的基本操作了,有些小兴奋。
五一小长假,大家貌似都出去玩了,我却折腾了两天了,明天估计还有一天。
小猫病了,不过还好,这小子不会这么快挂掉的。别的不说了,早日康复吧。
MySQL包括了100多种函数,从简单的数学函数到复杂的比较函数和日期操作函数,在程序开发过程中,正确的选择应用这些函数会使你少走很多弯路的。
简单的数学计算,与拼音,识字,是我从小学到现在让我一直在用的不多的东西。呵呵。
GREATEST(x1,x2,…,xn) 返回集合中最大的值,LEAST(x1,x2,…,xn) 返回集合中最小的值:
/*
+---------------------+------------------+
| 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()函数获得接近一个数的最大和最小整数值:
这个意思说的很明显了,我举个例子吧。。
/*
+---------------+-----------------+--------------+----------------+
| floor(-75.99) | ceiling(-75.99) | floor(99.99) | ceiling(99.99) |
+---------------+-----------------+--------------+----------------+
| -76 | -75 | 99 | 100 |
+---------------+-----------------+--------------+----------------+
1 row in set (0.00 sec)
*/
ROUND()函数将数值进行四舍五入:
/*
+--------------+----------------+---------------+
| round(10.33) | round(65.9999) | round(-1.345) |
+--------------+----------------+---------------+
| 10 | 66 | -1 |
+--------------+----------------+---------------+
1 row in set (0.00 sec)
*/
TRUNCATE()函数和ROUND()函数相似但是并不相同,它把一个数字截短成为一个小数个数的数字,但是不进行四舍五入哈:
/*
+-------------------------+------------------------+---------------------+
| 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()函数的第二个参数加一个负值的话看看会返回什么?没错,小数前保留多少位。
/*
+--------------------------+-------------------------+----------------------+
| 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()函数获取数字绝对值:
/*
+-------------+---------+
| abs(-1.222) | abs(99) |
+-------------+---------+
| 1.222 | 99 |
+-------------+---------+
1 row in set (0.00 sec)
*/
SIGN()函数返回数字的符号,取决于返回结果是正数(1),负数(-1)或者零(0):
/*
+-------------+---------+------------+------------------+
| 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之间的随机数:
/*
+-------------------+------------------+-------------------+
| rand() | rand() | rand() |
+-------------------+------------------+-------------------+
| 0.097297903240936 | 0.87414158030799 | 0.078814222550778 |
+-------------------+------------------+-------------------+
1 row in set (0.00 sec)
*/
提供一个参数(种子)使RAND()随机数生成一个指定的值
/*
+------------------+------------------+------------------+
| 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/
版权所有 © 转载时必须以链接形式注明作者和原始出处!