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条件里,这里说的是外连接(包括左连接和右连接)。