在本教程中,您將學習從MySQL的數據庫表中選擇隨機記錄的各類技術方法。html
有時咱們須要從表中選擇隨機記錄,例如:mysql
MySQL沒有內置語句來從數據庫表中選擇隨機記錄。爲了實現這個目的,可以使用RAND
函數。 如下查詢是從數據庫表中選擇一個隨機記錄:sql
SELECT * FROM tbl ORDER BY RAND() LIMIT 1;
讓咱們詳細地看看上面的查詢語句。數據庫
若是要從數據庫表中選擇N
個隨機記錄,則須要修改LIMIT
子句後指定的值,以下所示:dom
SELECT * FROM table ORDER BY RAND() LIMIT N;
例如,要在customer
表中選擇5
個隨機客戶,請使用如下查詢:函數
SELECT t.customer_id, t.customer_name FROM studymysql.customer AS t ORDER BY RAND() LIMIT 5;
執行上面的查詢語句,獲得如下結果(每次執行結果都不太同樣) -學習
您可能會獲得一個不一樣的結果數據,由於它是隨機的。code
這種技術很是適合小表。若是在大的表上執行速度是很是緩慢的,由於MySQL必須排序整個表,以挑選隨機的行數據。查詢的速度還取決於表中的行數。表具備的行越多,MySQL都要爲每行生成隨機數,因此所需的時間就越多。htm
此技術方法要求選擇隨機記錄的表要具備自動增加的主鍵字段,而且序列的值是連續沒有間隙的。排序
如下查詢是基於主鍵列生成一個隨機數:
SELECT ROUND(RAND() * ( SELECT MAX(id) FROM table)) as id;
咱們可使用上面查詢返回的結果集來鏈接表,以下所示:
SELECT t.* FROM table AS t JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table )) AS id ) AS x WHERE t.id >= x.id LIMIT 1;
使用此技術方法,須要屢次執行查詢以獲取多個隨機行,由於若是增長返回行數限制,查詢將只提供從隨機選擇的行開始的順序行。 如下查詢是從customer
表中返回一個隨機客戶。
SELECT t.customer_id, t.customer_name FROM studymysql.customer AS t JOIN (SELECT ROUND(RAND() * (SELECT MAX(customer_id) FROM studymysql.customer)) AS customer_id ) AS x WHERE t.customer_id >= x.customer_id LIMIT 1;
執行上面的查詢語句,獲得如下結果 -
在這種狀況下,表的id
列的值落在1...N
的範圍內,而且在該範圍內的值連續沒有間隙,可使用如下技術:
1..N
範圍內選擇隨機數。如下語句可幫助您完成此操做:
SELECT table. * FROM (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table)) random_num, @num:=@num + 1 FROM (SELECT @num:=0) AS a, table LIMIT N) AS b, table AS t WHERE b.random_num = t.id;
請注意,用戶定義的變量是特定於鏈接的。因此這種技術方法不能用於鏈接池。此外,主鍵必須是整數類型,其值必須在值是連續沒有間隙的序列中。
在本教程中,咱們展現了幾種從表中選擇隨機記錄的技術方法。
StudyMySQL官方QQ羣(2): 41840707 歡迎各位MySQL學習和用戶加入。