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
这个时候查询出来的结果就是:
原因:因为将条件放在连接里面,所以在 两张表连接到一起的之后就会执行筛选条件,然后将 外连接 多余的数据添加进去,所以结果是正确的