数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
例如如下两张表:
A(aid int , aname char(10) )
B(aid int , aname char(10) )
对应数据:
执行语句: select * from a LEFT JOIN b on aid=bid
A左连接B , 先取A中的一条记录 , 去匹配B表中每一条数据 , 假设A中其中一条数据是a1,B中一条数据是b1;
如果a1和b1 匹配 on 条件 ,在on中条件为 true , a1 b1 连在一起成为一条结果的数据,如果是false , 不成为结果;
然后a1 和 b2 ,a1 和 b3 …… 以此类推。
如果 a1 跟 B表中任何一条数据都不匹配,则会返回一条像第一条数据一样的结果。B的列为 null 。
然后拿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过滤
如果有表述不清,或者有误,请评论告诉我。
来源:https://www.cnblogs.com/coderbill/p/5831847.html