这是一个面试问题。正如问题所述,面试官基本上要求我从数据库中获取10条随机记录。如果您知道有n条记录,看起来很容易。但就我而言。我不允许搜索记录数量。
这是一种有效的方法吗?
答案 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估计查询成本略低。