欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL rand()函數(shù)、rand(n)、生成不重復(fù)隨機(jī)數(shù)

 更新時(shí)間:2024年11月18日 10:48:56   作者:五月天的尾巴  
MySQL提供了rand()函數(shù)來生成隨機(jī)數(shù),包括無參數(shù)rand()和有參數(shù)rand(n)等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

有時(shí)候我們想要生成一個(gè)唯一不重復(fù)的隨機(jī)數(shù),mysql提供了rand()函數(shù)來實(shí)現(xiàn)該功能。

本文首先介紹rand()的基本使用,分別介紹round與rand的合用、ceiling與rand的合用、floor與rand的合用、md5與rand的合用

一、rand()與rand(n)

  • rand() 即無參數(shù)的,會生成一個(gè)[0,1)之間的float型隨機(jī)數(shù)。此時(shí)產(chǎn)生的隨機(jī)數(shù)是隨機(jī)的,不可重復(fù)的;
  • rand(n),即有參數(shù)數(shù),它會使用參數(shù)n作為隨機(jī)數(shù)生成的種子。每次使用相同的種子值n,將得到相同的隨機(jī)排序結(jié)果。因此這種隨機(jī)數(shù)是可重復(fù)的。這種隨機(jī)數(shù)也是偽隨機(jī)的‌

rand(n)函數(shù):

  • n是int類型的數(shù)字,所以只要是數(shù)字就行。不同的種子值生成的隨機(jī)數(shù)是不一樣的;對于同一個(gè)種子值n,每次返回的隨機(jī)數(shù)是固定的。
  • 同一次查詢時(shí),結(jié)果集中可能會產(chǎn)生重復(fù)隨機(jī)數(shù)。
  • 多次查詢時(shí),每次返回的隨機(jī)數(shù)與上一次是一致的。

注意:頻繁地在一個(gè)很大的數(shù)據(jù)集上使用RAND()可能會導(dǎo)致性能問題,因?yàn)檫@會導(dǎo)致數(shù)據(jù)庫引擎在每次查詢時(shí)都生成一個(gè)新的隨機(jī)數(shù)。

示例如下:

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)

我們發(fā)現(xiàn):

  • 當(dāng)直接調(diào)用rand()函數(shù)時(shí),每次生成的隨機(jī)數(shù)都是不同的。
  • 當(dāng)直接調(diào)用rand(n)函數(shù)時(shí),若種子n相同,則生成的隨機(jī)數(shù)是可重復(fù)且多次查詢是一致的。

上面我們說rand(n)函數(shù),每次使用相同的種子值n,將得到相同的隨機(jī)排序結(jié)果,這是什么意思呢?為了便于理解上面兩種示例,我們把rand(),rand(n) 結(jié)合表數(shù)據(jù)一起看一下。

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()函數(shù)查詢了兩次,每次查詢每一行返回的隨機(jī)數(shù)都不相同
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)函數(shù)查詢了兩次
-- 同一次查詢中可能會返回重復(fù)的數(shù)字(注意:數(shù)據(jù)量小的情況不一定有重復(fù)值)
-- 但是多次查詢時(shí),第二次與第一次返回的結(jié)果相同。
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)

可以發(fā)現(xiàn):

  • rand()函數(shù):每次查詢都生成不一樣的數(shù)據(jù)。同一次查詢中每行數(shù)據(jù)的隨機(jī)數(shù)都不一樣;多次查詢時(shí)與上一次生成的隨機(jī)數(shù)也不一致。
  • rand(n)函數(shù):同一次查詢中數(shù)據(jù)可能會產(chǎn)生重復(fù)(注意:數(shù)據(jù)量小的情況不一定有重復(fù)值);多次查詢時(shí)與上一次生成的隨機(jī)數(shù)是一致的。 即是指定了隨機(jī)數(shù)的種子,那么多次查詢的結(jié)果是一樣的。

二、rand()使用示例

2.1、rand()與order by/group by使用隨機(jī)排序分組

rand()函數(shù)用于隨機(jī)生成一個(gè)不重復(fù)的數(shù)字,所以當(dāng)rand()與order by組合使用時(shí),可以實(shí)現(xiàn)數(shù)據(jù)隨機(jī)排序。
使用場景: 例如可以用于樣本抽樣,先對數(shù)據(jù)進(jìn)行隨機(jī)排序,然后抽取前x條。

注意因?yàn)槭请S機(jī)排序,所以每次返回不同的結(jié)果。如果目標(biāo)是以隨機(jī)順序檢索行,則可以使用這樣的語句。

SELECT * FROM tbl_name ORDER BY RAND();

2.2、round()與rand()的組合使用

round(n,m):對處理的數(shù)據(jù)進(jìn)行四舍五入,
n:處理的數(shù)據(jù)
m:保留的小數(shù)位數(shù)

實(shí)例1.獲取某個(gè)區(qū)間的數(shù)據(jù)

-- 獲取0-100之間的整數(shù)
select round(100*rand(),0):

在這里插入圖片描述

實(shí)例2:獲取[40,60)的兩位小數(shù)

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

在這里插入圖片描述

2.3、rand與ceiling的組合使用

ceiling(n):對于數(shù)據(jù)n向上取整

實(shí)例1:select ceiling(1.12)

在這里插入圖片描述


實(shí)例2:select ceiling(rand());rand():隨機(jī)在[0,1)之間,故結(jié)果肯定為1

在這里插入圖片描述

實(shí)例3:隨機(jī)獲取[60,80)之間的整數(shù)

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

在這里插入圖片描述

2.4、rand與floor組合使用

floor():是向下取整

實(shí)例1:select floor(53.68)

在這里插入圖片描述

實(shí)例2:select floor(rand());ps:rand()向下取整必然為0

在這里插入圖片描述

實(shí)例3:[40,52)之間取整

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

在這里插入圖片描述

2.5、rand與md5組合使用

md5(n):必須要有參數(shù)n,計(jì)算n對應(yīng)的md5摘要,并返回32位的十六進(jìn)制的字符串
ps:如果n為 NULL,MySQL MD5() 函數(shù)返回 NULL

實(shí)例1:select md5(123.44);

在這里插入圖片描述

實(shí)例2:select md5(rand());

在這里插入圖片描述

三、總結(jié)

3.1、rand()與rand(n)的區(qū)別

rand()函數(shù)

  • 每次生成是隨機(jī)數(shù)都是不一致且不重復(fù)的。
  • 適用場景:樣本抽樣,對數(shù)據(jù)隨機(jī)排序后獲取前x條。每次排序的結(jié)果都是隨機(jī)的、不一致的。

rand(n:int)函數(shù)

  • n是個(gè)int類型的種子參數(shù),每個(gè)種子生成的隨機(jī)數(shù)都是不同的。但是相同的種子每次返回的隨機(jī)數(shù)都是固定的。如rand(2)每次返回的值是固定的。
  • 同一次查詢時(shí)結(jié)果集中可能會產(chǎn)生重復(fù)的數(shù)字。
  • 多次查詢時(shí)每次返回的隨機(jī)數(shù)與上一次查詢結(jié)果一致。
  • 適用場景:用于需要重復(fù)生成相同隨機(jī)數(shù)序列的場景,例如模擬實(shí)驗(yàn)或測試中需要重復(fù)執(zhí)行相同的隨機(jī)操作。

到此這篇關(guān)于MySQL rand()函數(shù)、rand(n)、生成不重復(fù)隨機(jī)數(shù)的文章就介紹到這了,更多相關(guān)MySQL rand() rand(n)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 關(guān)于MySql數(shù)據(jù)庫Update批量更新不同值的實(shí)現(xiàn)方法

    關(guān)于MySql數(shù)據(jù)庫Update批量更新不同值的實(shí)現(xiàn)方法

    這篇文章主要介紹了關(guān)于MySql數(shù)據(jù)庫Update批量更新不同值的實(shí)現(xiàn)方法,數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫,定義和操作數(shù)據(jù),維護(hù)數(shù)據(jù)的完整性和安全性,需要的朋友可以參考下
    2023-05-05
  • MySQL中ON DUPLICATE KEY UPDATE語句的使用

    MySQL中ON DUPLICATE KEY UPDATE語句的使用

    INSERT INTO ... ON DUPLICATE KEY UPDATE?是一個(gè)強(qiáng)大的SQL語句,它結(jié)合了插入新記錄和更新已存在記錄的功能于一體,本文就來介紹一下MySQL中ON DUPLICATE KEY UPDATE語句的使用,感興趣的可以了解一下
    2024-08-08
  • MySQL無法創(chuàng)建外鍵的原因及解決方法

    MySQL無法創(chuàng)建外鍵的原因及解決方法

    這篇文章主要介紹了MySQL無法創(chuàng)建外鍵的原因及解決方法,然后在文中給大家及時(shí)了MySQL無法創(chuàng)建外鍵、查詢外鍵的屬性知識,感興趣的朋友一起看看吧
    2017-10-10
  • MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵

    MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵

    主鍵是用于唯一標(biāo)識數(shù)據(jù)庫表中每一行數(shù)據(jù)的一列或一組列,主鍵可以確保數(shù)據(jù)的唯一性和完整性,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • MySQL錯誤ERROR 2002 (HY000): Can''t connect to local MySQL server through socket

    MySQL錯誤ERROR 2002 (HY000): Can''t connect to local MySQL ser

    這篇文章主要介紹了MySQL錯誤ERROR 2002 (HY000): Can't connect to local MySQL server through socket,需要的朋友可以參考下
    2014-10-10
  • MySql5.7.18字符集配置圖文詳解

    MySql5.7.18字符集配置圖文詳解

    本文通過圖文并茂的形式給大家介紹了mysql5.7.18字符集配置教程,非常不錯,具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-06-06
  • win2008 R2 WEB環(huán)境配置之MYSQL 5.6.22安裝版安裝配置方法

    win2008 R2 WEB環(huán)境配置之MYSQL 5.6.22安裝版安裝配置方法

    這篇文章主要介紹了win2008 R2 WEB環(huán)境配置之MYSQL 5.6.22安裝版安裝配置方法,需要的朋友可以參考下
    2016-06-06
  • Mysql的row_number函數(shù)使用介紹

    Mysql的row_number函數(shù)使用介紹

    這篇文章主要為大家介紹了Mysql的row_number函數(shù)使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 淺析MySQL并行復(fù)制

    淺析MySQL并行復(fù)制

    這篇文章主要介紹了MySQL并行復(fù)制的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • 一篇文章看懂SQL中的開窗函數(shù)

    一篇文章看懂SQL中的開窗函數(shù)

    開窗函數(shù)也叫分析函數(shù)有兩類,一類是聚合開窗函數(shù),一類是排序開窗函數(shù),下面這篇文章主要給大家介紹了關(guān)于SQL中開窗函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評論