首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JOIN或WHERE中的条件

JOIN或WHERE中的条件
EN

Stack Overflow用户
提问于 2009-06-19 16:49:47
回答 9查看 307.1K关注 0票数 245

是否有任何差异(性能、最佳实践等)在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'

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

EN

回答 9

Stack Overflow用户

发布于 2009-06-19 18:34:50

对于内部连接,我并没有真正注意到有什么不同(但是对于所有的性能调优,您需要根据您的条件检查您的数据库)。

但是,如果您使用的是左连接还是右连接,那么将条件放在哪里会产生巨大的差异。例如,考虑以下两个查询:

SELECT *
FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderDate >'20090515'

SELECT *
FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'

第一个将只给出那些订单日期晚于2009年5月15日的记录,从而将左连接转换为内连接。

第二个将给出这些记录加上任何没有订单的客户。根据您放置条件的位置,结果集会有很大的不同。(Select *仅用于示例目的,当然您不应该在生产代码中使用它。)

例外情况是,您只想查看一个表中的记录,而不想查看另一个表中的记录。然后将where子句用于条件,而不是连接。

SELECT *
FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderID is null
票数 154
EN

Stack Overflow用户

发布于 2009-06-19 16:54:56

大多数RDBMS产品将以相同的方式优化这两个查询。在Peter Gulutzan和Trudy Pelzer的"SQL Performance Tuning“中,他们测试了多个品牌的RDBMS,没有发现性能差异。

我更喜欢将连接条件与查询限制条件分开。

如果您使用的是OUTER JOIN,有时有必要在join子句中加入条件。

票数 30
EN

Stack Overflow用户

发布于 2009-06-19 16:51:46

WHERE将在连接发生后进行过滤。

对联接进行筛选,以防止在联接过程中添加行。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1018952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档