数据库在经过链接两张或多张表来返回记录时,都会生成一张中间的临时表,而后再将这张临时表返回给用户。sql
例如以下两张表:数据库
A(aid int , aname char(10) )3d
B(aid int , aname char(10) )blog
对应数据:select
执行语句: select * from a LEFT JOIN b on aid=bid im
A左链接B , 先取A中的一条记录 , 去匹配B表中每一条数据 , 假设A中其中一条数据是a1,B中一条数据是b1;d3
若是a1和b1 匹配 on 条件 ,在on中条件为 true , a1 b1 连在一块儿成为一条结果的数据,若是是false , 不成为结果;数据
而后a1 和 b2 ,a1 和 b3 …… 以此类推。img
若是 a1 跟 B表中任何一条数据都不匹配,则会返回一条像第一条数据同样的结果。B的列为 null 。co
而后拿a2 和 b1 , a2和 b2 …… 以此类推。
因此左链接最后的结果数量,当A中和数据和B中的数据不止匹配一条时,会大于A的数据量。若是都没有匹配,或者都匹配一条,就会等于A的数据量。
像如下例子:
SELECT * from a LEFT JOIN b on a.aid>b.bid
A右链接B相似也是相似,只是A和B角色互换。
select * from a right JOIN b on aid=bid
SELECT * from a RIGHT JOIN b on a.aid>b.bid
而inner join :
在 a(1-n) 和 B(1-n) 匹配时,只有 on 条件 为 true 时,才会链接为一条结果数据。不然不返回数据。
select * from a inner join b on aid =bid
若是语句中有链接on和where条件,sql 在执行时会先进行 链接, select * from a left join b on aid= bid , 至关于生成一张临时表。
而后对where 条件 进行过滤,最后获得结果。
注意区分如下两种状况
select * from a left join b on aid= bid and aid>3, 这只进行了 链接操做
select * from a left join b on aid= bid where aid>3, 链接操做之后还有where过滤
若是有表述不清,或者有误,请评论告诉我。