sql之表连接 筛选条件放在 连接外和放在连接里的区别

使用一个简单的例子,说明他们之间的区别

使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同

业务要求:查询出 : 所有的用户 在 2012-10-10 16:44:51.000订单数量

通常筛选条件都会添加到连接外面 where 里面,例如:

1 select
2 c.custid,count(o.orderid)
3 from [Sales.Customers] c left join [Sales.Orders] o
4 on c.custid=o.custid
5 where o.orderdate='2012-10-10 16:44:51.000'
6 group by c.custid

查询结果:

通过结果,可以明显看出:这是不对的,因为将没有订单的用户没有搜索出来,

这是为什么呢:因为where 条件是在  表连接之后进行筛选的,所以会将那些 不在条件里面的数据 进行 清除掉。

如果我们将 筛选条件放在 连接的里面就不一样了

1 select 
2 c.custid,COUNT(orderid) --含有group by 的语句 查询内容只能含有 group by 后面的 字段和 组函数
3 from [Sales.Customers] c left outer join [Sales.Orders] o
4 on c.custid=o.custid and o.orderdate='2012-10-10 16:44:51.000'--条件在连接里面
5 group by c.custid

这个时候查询出来的结果就是:

原因:因为将条件放在连接里面,所以在 两张表连接到一起的之后就会执行筛选条件,然后将 外连接 多余的数据添加进去,所以结果是正确的

原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3433659.html