MySQL rand()函数、rand(n)、生成不重复随机数
波罗框架
2025-07-25
有时候我们想要生成一个唯一不重复的随机数,mysql提供了rand()函数来实现该功能。
本文首先介绍rand()的基本使用
其次分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用
一、rand()与rand(n)
rand() 即无参数的,会生成一个[0,1)之间的float型随机数。此时产生的随机数是随机的,不可重复的;
rand(n),即有参数数,它会使用参数n作为随机数生成的种子。每次使用相同的种子值n,将得到相同的随机排序结果。因此这种随机数是可重复的。这种随机数也是伪随机的
rand(n)函数:
n是int类型的数字,所以只要是数字就行。不同的种子值生成的随机数是不一样的;对于同一个种子值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)
AI写代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们发现:
当直接调用rand()函数时,每次生成的随机数都是不同的。
当直接调用rand(n)函数时,若种子n相同,则生成的随机数是可重复且多次查询是一致的。
上面我们说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()函数:每次查询都生成不一样的数据。同一次查询中每行数据的随机数都不一样;多次查询时与上一次生成的随机数也不一致。
rand(n)函数:同一次查询中数据可能会产生重复(注意:数据量小的情况不一定有重复值);多次查询时与上一次生成的随机数是一致的。 即是指定了随机数的种子,那么多次查询的结果是一样的。
二、rand()使用示例
2.1、rand()与order by/group by使用随机排序分组
rand()函数用于随机生成一个不重复的数字,所以当rand()与order by组合使用时,可以实现数据随机排序。
使用场景: 例如可以用于样本抽样,先对数据进行随机排序,然后抽取前x条。
注意:因为是随机排序,所以每次返回不同的结果。如果目标是以随机顺序检索行,则可以使用这样的语句。
SELECT * FROM tbl_name ORDER BY RAND();
AI写代码
1
2.2、round()与rand()的组合使用
round(n,m):对处理的数据进行四舍五入,
n:处理的数据
m:保留的小数位数
本文首先介绍rand()的基本使用
其次分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用
一、rand()与rand(n)
rand() 即无参数的,会生成一个[0,1)之间的float型随机数。此时产生的随机数是随机的,不可重复的;
rand(n),即有参数数,它会使用参数n作为随机数生成的种子。每次使用相同的种子值n,将得到相同的随机排序结果。因此这种随机数是可重复的。这种随机数也是伪随机的
rand(n)函数:
n是int类型的数字,所以只要是数字就行。不同的种子值生成的随机数是不一样的;对于同一个种子值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)
AI写代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们发现:
当直接调用rand()函数时,每次生成的随机数都是不同的。
当直接调用rand(n)函数时,若种子n相同,则生成的随机数是可重复且多次查询是一致的。
上面我们说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()函数:每次查询都生成不一样的数据。同一次查询中每行数据的随机数都不一样;多次查询时与上一次生成的随机数也不一致。
rand(n)函数:同一次查询中数据可能会产生重复(注意:数据量小的情况不一定有重复值);多次查询时与上一次生成的随机数是一致的。 即是指定了随机数的种子,那么多次查询的结果是一样的。
二、rand()使用示例
2.1、rand()与order by/group by使用随机排序分组
rand()函数用于随机生成一个不重复的数字,所以当rand()与order by组合使用时,可以实现数据随机排序。
使用场景: 例如可以用于样本抽样,先对数据进行随机排序,然后抽取前x条。
注意:因为是随机排序,所以每次返回不同的结果。如果目标是以随机顺序检索行,则可以使用这样的语句。
SELECT * FROM tbl_name ORDER BY RAND();
AI写代码
1
2.2、round()与rand()的组合使用
round(n,m):对处理的数据进行四舍五入,
n:处理的数据
m:保留的小数位数
最新文章
MySQL-生成随机数字、字符串、日期、验证码及 UUID的方法
2025-07-25
如果想要重现某些场景,需要确保每次运行时生成相同的随机数。这种情况下可以为 RAND 函数传递一个输入参数,设置一个随机数种子...
如何在MySQL数据库表中随机取出数据?
2025-07-25
要从MySQL数据库表中随机取出数据,可以使用 ORDER BY RAND() 语句。以下是一个示例代码:,,“sql,SELECT * FROM your_table_name ORDER BY RAND() LIMIT 1;,`,,这个查询会从 your_table_name 表中随机选择一行数据。你可以根据需要调整 LIMIT` 的值来获取更多行数据。...
PHP闭包、生成器和反射技术的深入研究及使用方法
2025-07-25
本文深入研究了PHP中闭包、生成器和反射技术的使用方法,并提供了具体的代码示例。闭包可以用来简化代码、封装函数、实现回调和处理事件;生成器可以节省内存、提高性能,在处理大量数据时非常有用;反射技术可以在运行时获取和操作代码,用于依赖注入、自动装配和代码分析等场景。通过学习和应用这些高级特性,开发者可以提高代码质量、降低开发成本,并编写更加灵活和高效的PHP代码。...