请说明2条SQL语句之间的区别

时间:2019-08-06 13:39:48

标签: mysql sql

我写了2条SQL语句。

SELECT 
customers.CustomerID,
orders.OrderID
FROM customers LEFT JOIN orders ON customers.CustomerID = 
orders.CustomerID AND orders.EmployeeID=4
WHERE orders.OrderID IS NULL;

还有

SELECT 
customers.CustomerID,
orders.OrderID
FROM customers LEFT JOIN orders ON customers.CustomerID = 
orders.CustomerID AND orders.EmployeeID=4 AND orders.OrderID IS NULL;

第一个返回16个条目,这是正确的(根据解决方案)。第二个返回91个条目。我将Northwind用于mysql版本。我从某处了解到,将条件放在JOIN语句中等同于在WHERE语句中进行。但是,在这里我可以看到区别。

3 个答案:

答案 0 :(得分:2)

这与对语句的订单执行以及您正在使用LEFT JOIN的事实有关。

LEFT JOIN将保留左侧的所有值不变,仅组合右侧与条件匹配的值。

WHERE子句对整个查询 进行操作(在这种情况下)。

查询1:

  1. 从左侧表格获取所有值
  2. 加入右表中符合条件的任何值
  3. 根据where条件过滤联接的输出

查询2:

  1. 从左侧表格获取所有值
  2. 加入右表中符合条件的任何值

WHERE真正类似于JOIN的唯一时刻是INNER JOIN之类的东西,它仅从左侧和右侧获得相关值。我认为至少自从我发挥SQL力量以来已经有一段时间了。

编辑-计算customers表中的行数(无),它也应返回91。

答案 1 :(得分:1)

第二个查询将返回更多行。为什么?继续阅读:

第二个查询

第二个查询将使用谓词将orders行与customers行匹配:

  

customers.CustomerID = orders.CustomerID ANDorders.EmployeeID = 4 ANDorders.OrderID为空

不匹配的customers行将始终显示在结果中。

第一个查询

现在,第一个查询将使用谓词将orders行与customers行进行匹配:

  

customers.CustomerID = orders.CustomerID ANDorders.EmployeeID = 4

然后它将过滤掉orders.OrderID为空的行,并删除未填充最后一个谓词的customer行,从而产生更少的行。未匹配的客户行可能不会显示在结果中。

示例:

create table customers (
  CustomerId int
);

create table orders (
  OrderId int,
  CustomerId int,
  EmployeeId int
);

insert into customers (CustomerId) values (1), (2), (3);

insert into orders (OrderId, CustomerId, EmployeeId) values
  (1001, 1, 3),
  (1002, 1, 4),
  (1003, 2, 1);

第一个查询返回:

CustomerId  OrderId      
----------  ----------------
2           <null>       
3           <null>      

第二个查询返回时:

CustomerId  OrderId      
----------  ----------------
1           <null>       
2           <null>       
3           <null>       

答案 2 :(得分:0)

这可能是由于Sql查询运行的顺序 FROM和JOIN。首先执行FROM子句和后续的JOIN,然后 在哪里,最后选择。

在第二种情况下,所有联接条件都同时存在,但是在第一种情况下,where子句在联接数据和过滤后产生的差异不是同时发生的,而是联接后的整体情况。