Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL rand() rand(n)

MySQL rand()函数、rand(n)、生成不重复随机数

作者:五月天的尾巴

MySQL提供了rand()函数来生成随机数,包括无参数rand()和有参数rand(n)等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

有时候我们想要生成一个唯一不重复的随机数,mysql提供了rand()函数来实现该功能。

本文首先介绍rand()的基本使用,分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用

一、rand()与rand(n)

rand(n)函数:

注意:频繁地在一个很大的数据集上使用RAND()可能会导致性能问题,因为这会导致数据库引擎在每次查询时都生成一个新的随机数。

示例如下:

mysql> select rand(),rand(),rand();
+--------------------+--------------------+-------------------+
| rand()             | rand()             | rand()            |
+--------------------+--------------------+-------------------+
| 0.9601070507989331 | 0.7956807881553478 | 0.098082819113585 |
+--------------------+--------------------+-------------------+
1 row in set (0.00 sec)

mysql> select rand(1),rand(1),rand(1);
+---------------------+---------------------+---------------------+
| rand(1)             | rand(1)             | rand(1)             |
+---------------------+---------------------+---------------------+
| 0.40540353712197724 | 0.40540353712197724 | 0.40540353712197724 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)

我们发现:

上面我们说rand(n)函数,每次使用相同的种子值n,将得到相同的随机排序结果,这是什么意思呢?为了便于理解上面两种示例,我们把rand(),rand(n) 结合表数据一起看一下。

mysql> CREATE TABLE t (i INT);
Query OK, 0 rows affected (0.42 sec)

mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
-- 如下:rand()函数查询了两次,每次查询每一行返回的随机数都不相同
mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()           |
+------+------------------+
|    1 | 0.61914388706828 |
|    2 | 0.93845168309142 |
|    3 | 0.83482678498591 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()           |
+------+------------------+
|    1 | 0.35877890638893 |
|    2 | 0.28941420772058 |
|    3 | 0.37073435016976 |
+------+------------------+
3 rows in set (0.00 sec)
-- 如下:rand(n)函数查询了两次
-- 同一次查询中可能会返回重复的数字(注意:数据量小的情况不一定有重复值)
-- 但是多次查询时,第二次与第一次返回的结果相同。
mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.01 sec)

可以发现:

二、rand()使用示例

2.1、rand()与order by/group by使用随机排序分组

rand()函数用于随机生成一个不重复的数字,所以当rand()与order by组合使用时,可以实现数据随机排序。
使用场景: 例如可以用于样本抽样,先对数据进行随机排序,然后抽取前x条。

注意因为是随机排序,所以每次返回不同的结果。如果目标是以随机顺序检索行,则可以使用这样的语句。

SELECT * FROM tbl_name ORDER BY RAND();

2.2、round()与rand()的组合使用

round(n,m):对处理的数据进行四舍五入,
n:处理的数据
m:保留的小数位数

实例1.获取某个区间的数据

-- 获取0-100之间的整数
select round(100*rand(),0):

在这里插入图片描述

实例2:获取[40,60)的两位小数

select 40+round(20*rand(),2)
ps:20为60-40的差值

在这里插入图片描述

2.3、rand与ceiling的组合使用

ceiling(n):对于数据n向上取整

实例1:select ceiling(1.12)

在这里插入图片描述


实例2:select ceiling(rand());rand():随机在[0,1)之间,故结果肯定为1

在这里插入图片描述

实例3:随机获取[60,80)之间的整数

select ceiling(60+rand()*20);

在这里插入图片描述

2.4、rand与floor组合使用

floor():是向下取整

实例1:select floor(53.68)

在这里插入图片描述

实例2:select floor(rand());ps:rand()向下取整必然为0

在这里插入图片描述

实例3:[40,52)之间取整

select floor(40+rand()*12);

在这里插入图片描述

2.5、rand与md5组合使用

md5(n):必须要有参数n,计算n对应的md5摘要,并返回32位的十六进制的字符串
ps:如果n为 NULL,MySQL MD5() 函数返回 NULL

实例1:select md5(123.44);

在这里插入图片描述

实例2:select md5(rand());

在这里插入图片描述

三、总结

3.1、rand()与rand(n)的区别

rand()函数

rand(n:int)函数

到此这篇关于MySQL rand()函数、rand(n)、生成不重复随机数的文章就介绍到这了,更多相关MySQL rand() rand(n)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文