在本教程中,您将学习从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学习和用户加入。