了解何时在连接上使用子查询

时间:2018-06-03 21:02:17

标签: sql sql-server database relational-database

我似乎错过了一些东西。我继续读到你应该在我阅读的大多数文章中使用连接而不是子选择。然而,自己运行一个快速实验表明,当涉及执行时间时,子查询会获得巨大的胜利。

试图获得所有出价的人的名字(我假设这些表格不言而喻)会产生以下结果。

此加入需要10秒

select U.firstname
from Bid B
inner join [User] U on U.userName = B.[user]

此子查询查询需要3秒

select firstname
from [User]
where userName in (select [user] from bid)

为什么我的实验不符合我到处阅读的内容,或者我错过了什么?

试验我发现在向两者添加不同之后执行时间是相同的。

2 个答案:

答案 0 :(得分:0)

他们不是一回事。在带有连接的查询中,您可以将行相乘或从结果中完全删除行。

Inner Join删除非匹配键上的行。它还会在任何匹配的键上乘以行,这些键在连接的一个或两个表中重复。内部联接通过增加和删除行的附加步骤。

您使用的子查询是SELECT。由于没有使用WHERE的过滤器,因此它与简单的SELECT一样快,并且由于没有连接,因此可以在选择结果的同时获得结果。

有些人可能认为外连接返回NULL类似于子查询 - 但它们仍然可以乘以行。因此,子查询和连接不是一回事。

在您提供的查询中,您希望使用第二个查询(带有子查询的查询),因为它不会乘以或删除行。

答案 1 :(得分:0)

对子查询与内部加入的良好读取
https://www.essentialsql.com/subquery-versus-inner-join/