请查看下表:
客户表:
ID
Name
订单表:
ID
CustomerID
客户可以下1个或多个订单。请查看下面的SQL查询:
SELECT Customer.*
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID
WHERE CustomerID IS NULL
和
SELECT Customer.*
FROM Customer LEFT JOIN Order ON Customer.ID=Order.CustomerID AND
CustomerID IS NULL
这两个查询之间有什么区别吗?开发人员何时使用一种技术而不是另一种?
我以为在网上会有其他类似的问题,但是我没有找到答案,因此找不到问题的原因。
答案 0 :(得分:2)
就结果集和查询计划而言,这两者可能会产生相同的结果。
在这方面,他们是一样的。
如果谈论可读性,我会使用WHERE
版本,因为连接条件是显式的,WHERE
子句明确指出包含/排除的结果。
答案 1 :(得分:1)
我会尝试以自己的方式解释:
考虑下表
<强> tblQuestions 强>:
QuestionId 1 2
QuestionTitle Your Name? Your Age?
<强> tblPersons 强>:
PersonId 1 2
PersonName Person1 Person2
<强> tblAnswers 强>:
AnswerId 1
PersonId 1
QuestionId 1
Answer My Name is Person1
现在尝试使用 WHERE 进行此查询,只返回一个结果。
SELECT q.QuestionId, q.QuestionName, a.Answer
FROM tblQuestions q
LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId
WHERE a.PersonId = 2 OR a.PersonId IS null
现在使用开启尝试此查询,它将返回两个结果。
SELECT q.QuestionId, q.QuestionName, a.Answer
FROM tblQuestions q
LEFT OUTER JOIN tblAnswers a ON q.QuestionId = a.QuestionId AND
(a.PersonId = 2 OR a.PersonId IS null)
结果的差异是因为文件管理器PersonId = 1 OR PersonId Is NULL
,当通过WHERE
应用此过滤器时,结果是一条记录,当它在“ON”中应用时,结果是两条记录。< / p>
答案 2 :(得分:0)
如果您认为结果两者都会返回相同的结果。它们是有区别的。 第一个查询,
SELECT Customer.*
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID
WHERE CustomerID IS NULL
首先将应用连接获取记录并在其上面,它将应用过滤器(Where)条件。
第二次查询,
SELECT Customer.*
FROM Customer LEFT JOIN Order ON Customer.ID=Order.ID AND
CustomerID IS NULL
在连接期间,您将获得所需的结果。 表现明智这将是好事。
希望这有点意义!!
答案 3 :(得分:0)
第一种情况将返回满足条件
的结果和
第二种情况将返回将在两种情况下加入的结果