了解何时对连接使用子查询
Understanding when to use a subquery over a join
我好像漏掉了什么。我一直在读到,在我阅读的大多数文章中,您应该使用联接而不是子 select。然而 运行 我自己的一个快速实验表明,当涉及到执行时间时,子查询大获全胜。
尝试获取已出价人员的所有名字(我认为表格不言而喻)结果如下。
此连接需要 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)
为什么我的实验与我一直阅读的内容不一致或者我遗漏了什么?
通过实验,我发现在对两者添加 distinct 后执行时间是相同的。
它们不是一回事。在带有联接的查询中,您可能会乘以行或将行从结果中完全删除。
Inner Join 删除不匹配键上的行。它还会乘以任何匹配的键上的行,这些键在一个或两个被连接的表中重复。因此,内部连接经历了乘法和删除行的额外步骤。
您使用的子查询是 SELECT。由于没有使用 WHERE 的过滤器,因此它与简单的 SELECT 一样快,并且由于没有连接,您获得结果的速度与可以选择的结果一样快。
有些人可能会争辩说 Outer join return NULL 类似于子查询 - 但它们仍然可以乘以行。因此,子查询和连接不是一回事。
在您提供的查询中,您想使用第二个查询(带有子查询的那个),因为它不会增加或删除行。
子查询与内部联接的好读物
https://www.essentialsql.com/subquery-versus-inner-join/
我好像漏掉了什么。我一直在读到,在我阅读的大多数文章中,您应该使用联接而不是子 select。然而 运行 我自己的一个快速实验表明,当涉及到执行时间时,子查询大获全胜。
尝试获取已出价人员的所有名字(我认为表格不言而喻)结果如下。
此连接需要 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)
为什么我的实验与我一直阅读的内容不一致或者我遗漏了什么?
通过实验,我发现在对两者添加 distinct 后执行时间是相同的。
它们不是一回事。在带有联接的查询中,您可能会乘以行或将行从结果中完全删除。
Inner Join 删除不匹配键上的行。它还会乘以任何匹配的键上的行,这些键在一个或两个被连接的表中重复。因此,内部连接经历了乘法和删除行的额外步骤。
您使用的子查询是 SELECT。由于没有使用 WHERE 的过滤器,因此它与简单的 SELECT 一样快,并且由于没有连接,您获得结果的速度与可以选择的结果一样快。
有些人可能会争辩说 Outer join return NULL 类似于子查询 - 但它们仍然可以乘以行。因此,子查询和连接不是一回事。
在您提供的查询中,您想使用第二个查询(带有子查询的那个),因为它不会增加或删除行。
子查询与内部联接的好读物
https://www.essentialsql.com/subquery-versus-inner-join/