SQL语句ON v WHERE

时间:2013-01-01 10:46:27

标签: sql sql-server database

请查看下表:

客户表:

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

这两个查询之间有什么区别吗?开发人员何时使用一种技术而不是另一种?

我以为在网上会有其他类似的问题,但是我没有找到答案,因此找不到问题的原因。

4 个答案:

答案 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)

第一种情况将返回满足条件

的结果

第二种情况将返回将在两种情况下加入的结果