先上代碼:
declare @tb table (name varchar(10),sex int)
declare @tb2 table (name varchar(10),age int)
insert into @tb values('zhangsan',12)
insert into @tb values('lisi',18)
insert into @tb values('wangwu',14)
insert into @tb2 values('zhangsan',12)
insert into @tb2 values('zhangsan',20)
insert into @tb2 values('lisi',18)
insert into @tb2 values('wangwu',14)
--select * from @tb
--select * from @tb2
select A.name,A.sex,B.age from @tb A left join @tb2 B on A.name=B.name -- A.name='zhangsan'
select A.name,A.sex,B.age from @tb A left join @tb2 B on A.name=B.name AND A.name='zhangsan'
select A.name,A.sex,B.age from @tb A left join @tb2 B on A.name=B.name WHERE A.name='zhangsan'

在left join 和right join 或者 full join 操作時,會生成臨時表, on 是生成臨時表時起作用,臨時表生成后就沒作用了,where 是生成臨時表后對臨時表中的數據進行過濾操作
inner join 會返回左右兩表到交集 (相當於 逗號連接的表連接 select * from TableA,TableB where TableA.id=TableB.id)
left join 會返回左表到全部數據,右表沒有數據時用null填補
right join 會返回右表到全部數據,左表沒有數據時用null填補
full join 會返回兩表到並集 沒有數據到一方用null 填補
結論:
1. left join, right join, full join 操作時,會生成一個臨時表
2. on 是生成臨時表的條件, 一個表中如果沒有對應數據用null填補
3. where 是生成臨時表后,對臨時表中的數據進行過濾 返回過濾后到數據
相關鏈接:
https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html
https://www.cnblogs.com/GH0522/p/8579423.html
