使用一個簡單的例子规惰,說明他們之間的區(qū)別
使用的表:[Sales.Orders]訂單表和[Sales.Customers]客戶表洗搂,和上一篇博客的表相同
業(yè)務(wù)要求:查詢出 : 所有的用戶 在 2012-10-10 16:44:51.000訂單數(shù)量
通常篩選條件都會添加到連接外面 where 里面堤结,例如:
select
c.custid,count(o.orderid)
from [Sales.Customers] c left join [Sales.Orders] o
on c.custid=o.custid
where o.orderdate='2012-10-10 16:44:51.000'
group by c.custid
查詢結(jié)果:
通過結(jié)果,可以明顯看出:這是不對的唆香,因為將沒有訂單的用戶沒有搜索出來舶替,
這是為什么呢:因為where 條件是在 表連接之后進(jìn)行篩選的鸡典,所以會將那些 不在條件里面的數(shù)據(jù) 進(jìn)行 清除掉芳悲。
如果我們將 篩選條件放在 連接的里面就不一樣了
select
c.custid,COUNT(orderid) --含有g(shù)roup by 的語句 查詢內(nèi)容只能含有 group by 后面的 字段和 組函數(shù)
from [Sales.Customers] c left outer join [Sales.Orders] o
on c.custid=o.custid and o.orderdate='2012-10-10 16:44:51.000'--條件在連接里面
group by c.custid
這個時候查詢出來的結(jié)果就是:
原因:因為將條件放在連接里面氛堕,所以在 兩張表連接到一起的之后就會執(zhí)行篩選條件馏臭,然后將 外連接 多余的數(shù)據(jù)添加進(jìn)去,所以結(jié)果是正確的