从表中选择10个随机记录而不查询记录数

时间:2013-10-22 16:33:05

标签: sql

这是一个面试问题。正如问题所述,面试官基本上要求我从数据库中获取10条随机记录。如果您知道有n条记录,看起来很容易。但就我而言。我不允许搜索记录数量。

这是一种有效的方法吗?

2 个答案:

答案 0 :(得分:3)

SELECT * FROM table ORDER BY RAND() LIMIT 10

答案 1 :(得分:2)

这看起来基本上与SQL Server Random Sort重复,基本上是How to request a random row in SQL?的副本。

后者对引用此帖子的多个RDBMS有一个全面的答案:

SQL to Select a random row from a database table

Microsoft SQL Server的答案是:

SELECT TOP 10 * FROM table ORDER BY NEWID();

这在大型表格上表现不佳。它扫描整个表,为每一行生成一个唯一的数字(一个16位的GUID),然后按该唯一的数字对结果进行排序。

在SQL Server中简单地按RAND()排序不会产生随机的记录列表。 RAND()在语句的开头被评估一次,所以你实际上是通过一个常量排序,这根本就不是排序。没有ORDER BY,你会得到相同的结果。实际上,在我的SQL Server 2005实例中,无论是否使用ORDER BY RAND(),查询计划和结果都是相同的。

SQL Server中的RAND()采用种子值,因此您可能认为可以将变量表列值传递给RAND函数并获得随机结果。从某种意义上说,你可以。您可以将IDENTITY或其他唯一列传递给RAND函数,但不会获得与没有相同的顺序。从一个不经意的观察者看来,顺序是随机的。但它是可重复的。 SQL Server中的RAND()函数将始终为同一连接上的相同种子返回相同的值:

“对于一个连接,如果使用指定的种子值调用RAND(),则所有后续的RAND()调用都会根据种子RAND()调用生成结果。”

http://technet.microsoft.com/en-us/library/ms177610.aspx

因此,虽然您会得到一个似乎是随机列表的内容,但如果您在同一连接中多次执行它,您将得到相同的列表。根据您的要求,这可能足够好。

根据我对小桌子的有限测试,具有唯一列种子的RAND估计查询成本略低。