1.left join,right join
select * from a left join b on a.id = b.id and a.id ='12'
此sql语句效果:结果中a表筛选无效(即a表不是意愿中只有id='12'的行,而是a表全表记录依然都在,a.id='12'条件筛选无效果)
原因:a和b左连接的时候,无论条件是什么,都会把a的所有记录呈现出来,on后面的条件只能对b进行筛选,对a筛选无效。
同样右连接:select * from a right join b on 条件1 and 条件2 中
无论条件是什么,b中的所有记录都会呈现,条件1和条件2甚至更多的条件,只能对表a进行筛选,对b筛选同样无效。
2,inner join
select * from a inner join b on a.id = b.id and a.id='12' (或b.id='12')
在左连接和右连接中,由于一边的表不受条件会限制呈现出所有记录,故而条件只能针对另一边的表进行筛选。而内连接却不同,它呈现出的记录中两表完全受条件限制,条件既可以针对a表进行筛选,同样也可以针对b表进行筛选。
此连接效果等同于:select * from a,b where a.id=b.id and a.id='12'(或b.id='12')
总结:
左连接和右连接on条件只能筛选一边,内连接可以筛选任何一边的表,和对笛卡尔积进行的等值连接效果一样。
在左连接中,若要对左表的结果进行筛选,可以在on后加入where条件,如同:
select * from a left join b on a.id = b.id where a.id='12'
此时结果左表记录将仅剩下id='12'的行集,同样适用此方法也可对右连接的右表进行筛选。
事实上select * from a left join b on a.id = b.id 执行后,其结果存放在一个临时表中,where 条件则是针对临时表中的记录集进行筛选,故而最后结果中左表才会被成功筛选。