Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中随机选择10条记录,不查询记录数_Sql - Fatal编程技术网

Sql 从表中随机选择10条记录,不查询记录数

Sql 从表中随机选择10条记录,不查询记录数,sql,Sql,这是一个面试问题。正如问题所说,面试官基本上要求我从数据库中随机获取10条记录。如果您知道有n条记录,看起来很容易。但就我而言。我不允许搜索记录的数量 做这件事的有效方法是什么?这看起来基本上是一个复制品,基本上是一个复制品 SELECT * FROM table ORDER BY RAND() LIMIT 10 后者对引用本文的多个RDBMS有一个全面的答案: Microsoft SQL Server的答案是: 从表中选择前10个* 按NEWID()排序 这在大型表上无法很好地执行。它扫描

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


做这件事的有效方法是什么?

这看起来基本上是一个复制品,基本上是一个复制品

SELECT * FROM table ORDER BY RAND() LIMIT 10
后者对引用本文的多个RDBMS有一个全面的答案:

Microsoft SQL Server的答案是:

从表中选择前10个* 按NEWID()排序

这在大型表上无法很好地执行。它扫描整个表,为每行生成一个唯一的编号(16位GUID),然后根据该唯一编号对结果进行排序

在SQL Server中简单地按RAND()排序不会产生随机记录列表。RAND()在语句开头计算一次,因此实际上是按一个常数排序,而这个常数根本不是真正的排序。没有ORDER BY,您将得到相同的结果。事实上,在我的SQLServer2005实例中,使用和不使用ORDER BY RAND()时,查询计划和结果都是相同的

SQL Server中的RAND()接受一个种子值,因此您可能认为可以将一个不同的表列值传递给RAND函数并获得随机结果。从某种意义上说,你可以。您可以将标识或其他唯一列传递到RAND函数中,您将无法获得与未传递相同的顺序。这个顺序将是随机的,因为它在一个偶然的观察者看来是随机的。但它是可重复的。SQL Server中的RAND()函数将始终为同一连接上的同一种子返回相同的值:

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

所以,虽然你会得到一个看似随机的列表,但如果你在同一个连接中多次执行它,你会得到相同的列表。根据您的要求,这可能足够好了


根据我对一个小表的有限测试,带有唯一列种子的RAND的估计查询成本非常低。

select*from table LIMIT 10
?这取决于您希望它的随机性。大多数RDBMS不保证排序,因此
select*from table其中rownum<11
(或
select top 10*from table
)将是随机的。什么RDBMS?什么表格结构?为什么知道表中记录的数量会有帮助?继续@MartinSmith的问题-如果表中没有10条记录,您应该返回什么?或者你可以假设有吗?你是否应该针对某个特定的RDBMS?您可以通过类似于
NEWID()
的方式进行
订购。“显然,加密技术不安全,但足以供随意使用。我喜欢这种方法,”AwokeKnowing。但是请记住,需要对Rand()函数进行种子设定,以便为每一行提供不同的结果。它将得到随机的行。但是,每次运行查询时,如果没有任何更改,则可能会得到相同的行。如果需要的话,你可以用时间来播种。好吧,我相信mysql会解决这个问题,因为这是它在手册中建议的。同样,如果需要的话,您可以使用时间种子,因为使用SQL Server可以获得相同的值,但是时间种子是好的。我喜欢这种干净的方法。