task 是用戶任務表,manageuser是用戶表,以left join 為參考:
此時主表是task,三條sql語句:注意區別。第一句無篩選條件,第二句篩選條件在on后面,第三句sql的篩選語句放到where中
SELECT t.id,t.UseManage,u.ID,u.LoginName,u.UserType FROM dbo.Task t LEFT JOIN dbo.ManageUser u ON t.UseManage=u.ID SELECT t.id,t.UseManage,u.ID,u.LoginName,u.UserType FROM dbo.Task t LEFT JOIN dbo.ManageUser u ON t.UseManage=u.ID AND t.Type=2 SELECT t.id,t.UseManage,u.ID,u.LoginName,u.UserType FROM dbo.Task t LEFT JOIN dbo.ManageUser u ON t.UseManage=u.ID where t.Type=2
搜索結果如下
總結:where 會在最終結果中篩選,on中的條件先篩選,再返回結果。
具體的可以再參看:
SQL Server 容易忽略的錯誤
轉自:pursuer.chen
16.理解外連接
接下來我就解釋一下原因:對於外連接,連接條件不會改變主表的數據,即不會刪減主表的數據
對於上面的查詢主表是orders,所以無論你在連接條件on里面怎樣設置主表的條件都不影響主表數據的輸出,影響主表數據的輸出只在where條件里,where條件影響最后數據的輸出。而對於附表Customer 的條件就應該寫在連接條件(on)里而不是where條件里,這里說的是外連接(包括左連接和右連接)。