SQL查询:On子句和where子句中的条件差异

时间:2014-05-05 13:20:12

标签: mysql sql left-join where-clause

我正在尝试区分以下2个查询

查询1:

我在条款中给出条件'Orders.OrderID!= null'

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON (Customers.CustomerID=Orders.CustomerID and Orders.OrderID is not null)

查询2:

我在where子句中给出条件'Orders.OrderID!= null'

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID where Orders.OrderID is not null

这两个查询产生了不同的结果。为什么? where子句和条件子句的执行流程是什么?

P.S我使用以下链接来测试查询http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join

6 个答案:

答案 0 :(得分:3)

在查询1中,ORders.OrderID!= null(或Orders.OrderId不为空)的差异用于过滤Orders表和query2中的行,它用于过滤行中的行结果集。

答案 1 :(得分:0)

!= NULL更改为IS NOT NULL

答案 2 :(得分:0)

!= NULL更改为IS NOT NULL不要忘记将括号放在ON子句中。

通过这种方式,您可以告诉服务器您希望在加入时满足所有条件(括号内)。

答案 3 :(得分:0)

Q2实际上与INNER JOIN Orders相同。

过滤掉没有对等的行。

更新

对于Q1,如果条件为假,则来自Customers的行包含在结果中。 对于Q2,左边连接的行被过滤掉,因为hteir OrderId为空

答案 4 :(得分:0)

除了比较“!=”之外,查询的语法与T-Sql类似。如果您使用的是MSSQL Server,则测试空值的正确方法是OrderId is not null

除了使用不同的运算符之外,查询的行为也是由处理顺序驱动的。根据所有JOIN的结果评估WHERE子句条件。对于MSSQL来说也是如此。因此,在WHERE子句中放置条件具有与进行INNER JOIN类似的效果,除非您浪费更多资源。

答案 5 :(得分:0)

不同之处在于,第一个查询将输出第一个表中的所有行,并且只输出第二个表中匹配条件的那些行。这意味着属于第二个表的列将为null,但组合行仍将存在于结果中。

在第二种情况下,将删除订单ID为null的组合行。