当前位置: 首页 > 面试题库 >

JOIN或WHERE内的条件

邓德本
2023-03-14
问题内容

将条件放入JOIN子句与WHERE子句之间是否有任何区别(性能,最佳实践等)?

例如…

-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'

-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'

您更喜欢哪一个(也许是为什么)?


问题答案:

关系代数允许WHERE子句和中的谓词可互换INNER JOIN,因此即使INNER JOIN带有WHERE子句的查询也可以使谓词由优化器重新排列,以便在处理过程中将它们 排除在外JOIN

我建议您以最易读的方式编写查询。

有时,这包括使INNER JOIN相对“不完整”并将某些条件置于WHERE简单位置,以使过滤条件列表更易于维护。

例如,代替:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

写:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

但这当然取决于。



 类似资料:
  • 问题内容: 我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询: 但是我不小心跑了这个查询 (请注意,而不是最后一个子句中的) 并且都从用户ID返回了正确的员工ID。 这两个查询有什么区别?第二种形式是否仅联接满足条件的2个表的成员,而第一种形式将联接整个表,然后运行查询?一个效率比另一个效率高吗?还有其他我想念的东西吗? 谢谢! 问题答案: 对于这样的内部联接,它们在

  • 问题内容: 我必须从中删除与表无关的行(无效关系)。 这是我想做的,但是它当然不起作用。 错误: 您不能在FROM子句中指定目标表’guide_category’进行更新 问题答案: 由于锁定实现问题,不允许使用或引用受影响的表。 您需要在此处制作一个: 或只是使用:

  • 在这个候选答案中,有人断言,在某些涉及一些WHERE子句的情况下,JOIN优于LEFT JOIN,因为它不会混淆查询计划器,也不是“无意义的”。断言/假设是,这对任何人来说都应该是显而易见的。 请进一步解释或提供链接以供进一步阅读。

  • 问题内容: 我正在尝试使用Eloquent在数据库种子期间执行以下查询: 这是我在Eloquent中的实现: 尽管第一个查询始终返回完整结果,但Eloquent等价项始终为表的和字段以外的所有内容返回空元素。由于和模型都是工匠生成的骨架,因此我无所适从。 例如: 这是当我对种子(最初由Faker生成)的第一个口才查询dd()时输出的数组: 问题答案: 可以通过指定特定表中所需的特定列名来解决,如下

  • 我想对group by子句和where子句使用hibernate标准。 就像我有一个sql这样: 在使用标准组BY时,我如何在hibernate投影中传递截断的日期。

  • 问题内容: 假设我有两个表A和B以及以下查询: mysql是先执行联接还是在哪里执行? 编辑: 例如,如果A包含1000行,那么在where条件之后它将仅包含1行。在1行表上执行联接的效率要高得多,因此似乎首先执行where,然后再执行联接才更有效率。 问题答案: 在之前发生然而,… 该子句是联接所返回的所有行的过滤器,但是优化器会认识到,如果存在索引,它将用于从该匹配中检索行,则将发生联接,然后