我正在使用(select * from tbl2)tbl中的select top 5,它是从tbl2获取所有记录还是仅获取特定记录,即5

时间:2017-07-26 20:34:25

标签: sql sql-server

我正在使用从(选择*来自tbl2)tbl中选择前5位,是否从tbl2获取所有记录然后它只获得特定记录,即5?或者只从内存中获取5条记录。假设我们在tbl2中有1000条记录。

2 个答案:

答案 0 :(得分:0)

SELECT TOP子句用于指定要返回的记录数。

它将查询结果集中返回的行限制为指定的行数或行百分比。当TOP与ORDER BY子句一起使用时,结果集仅限于前N个有序行;否则,它以未定义的顺序返回前N行。

SELECT TOP number | percent column_name(s)      FROM table_name     条件;

答案 1 :(得分:0)

为了将来参考,SQL实际上有大量令人惊叹的在线文档/资源。例如:This google search.

关于你的问题,它会拉出符合你标准的前五个结果,所以它取决于你。它将通过,并找到符合您条件的前五个结果。如果这些是最后的结果,它仍然需要对所有行进行比较和过滤,唯一的区别是它必须向您的计算机发送更少的行。

例如,假设我们有一个包含两列的表my_table:Customer_ID(唯一)和First_Purchase_Date(2015-01-01和2017-07之间的date值 - 26)。如果我们只是执行SELECT TOP 5 * FROM my_table,那么它将通过并拉出它找到的前五行,而不会查看其余的行。另一方面,如果我们执行SELECT TOP 5 * FROM my_table WHERE First_Purchase_Date = '2017-05-17',那么它必须遍历所有行,直到它找到五行,其中有First_Purchase_Date的2017-05-17。如果First_Purchase_Date被编入索引,这不应该非常昂贵,因为它或多或少都知道要查找的位置。如果不是,那么它取决于SQL如何决定构建表,以及它是否创建了任何有用的统计信息。最糟糕的情况是,它没有任何统计数据,所需的行可能是数据库中的最后五行,在这种情况下,它必须完成数据库中所有行的比较。

顺便说一句,这是一个有点糟糕的想法,因为返回的列不一定会保持一致。抛出ORDER BY子句可能是个好主意,以确保每次都能获得相同的记录。