SQL: LEFT JOIN , RIGHT JOIN , INNER JOIN 区别 , on 和 where条件的区别

寵の児 提交于 2020-02-03 07:20:57

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    例如如下两张表:

    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过滤

    

  如果有表述不清,或者有误,请评论告诉我。

  

    

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!