如何在纯SQL中请求随机行(或尽可能接近真正的随机)?
当前回答
请参阅这篇文章:从数据库表中随机选择一行的SQL。它介绍了在MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2和Oracle中执行此操作的方法(以下内容是从该链接复制的):
用MySQL随机选择一行:
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
使用PostgreSQL随机选择一行:
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
使用Microsoft SQL Server随机选择一行:
SELECT TOP 1 column FROM table
ORDER BY NEWID()
使用IBM DB2选择一个随机行
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
使用Oracle随机选择一条记录:
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
其他回答
您也可以尝试使用new id()函数。
只需编写一个查询并使用order by new id()函数。它是随机的。
我不知道这有多有效,但我以前用过:
SELECT TOP 1 * FROM MyTable ORDER BY newid()
因为guid是非常随机的,所以顺序意味着您得到的是随机行。
你没说你用的是哪台服务器。在旧版本的SQL Server中,你可以使用这个:
select top 1 * from mytable order by newid()
在SQL Server 2005及以上版本中,你可以使用TABLESAMPLE来获取一个可重复的随机样本:
SELECT FirstName, LastName
FROM Contact
TABLESAMPLE (1 ROWS) ;
如果可能的话,使用存储语句来避免RND()上的索引和创建记录编号字段的效率低下。
PREPARE RandomRecord FROM "SELECT * FROM table LIMIT ?,1"; SET @n=FLOOR(RAND()*(SELECT COUNT(*) FROM table)); EXECUTE RandomRecord USING @n;
正如@BillKarwin对@cnu回答的评论所指出的那样…
当与LIMIT结合使用时,我发现随机排序的JOIN比直接对实际行进行排序执行得更好(至少在PostgreSQL 9.1中)。 SELECT * FROM tbl_post AS t 加入…… JOIN (SELECT id, CAST(-2147483648 * RANDOM() AS integer) AS rand 从tbl_post WHERE create_time >= 1349928000 ) r ON r.id = t.d id WHERE create_time >= 1349928000 AND… ORDER BY r.r rand 限制100
只要确保“r”为与它连接的复杂查询中的每个可能的键值生成一个“rand”值,但仍然尽可能限制“r”的行数。
CAST as Integer对于PostgreSQL 9.2特别有用,它对整型和单精度浮点类型有特定的排序优化。
推荐文章
- 准备好的语句如何防止SQL注入攻击?
- 如何改变一个列的数据类型在PostgreSQL表?
- 随机字符串生成器返回相同的字符串
- 如何结合日期从一个字段与时间从另一个字段- MS SQL Server
- 如何在不知道其名称的情况下删除SQL默认约束?
- SQL语法区分大小写吗?
- MySQL工作台:如何保持连接活动
- 左连接与Where子句
- 如何使用实体框架只更新一个字段?
- 在表变量上创建索引
- 为什么历史上人们使用255而不是256作为数据库字段大小?
- 如何选择记录从过去24小时使用SQL?
- 如何为查询返回的每一行执行存储过程一次?
- 按IN值列表排序
- 如何使用SQL Server 2008做多个CASE WHEN条件?