MySql的左连接、右连接、内连接、全连接

码农公社  210.net.cn   210是何含义?10月24日是程序员节,1024 = 210、210既 210 之意。

        最近,突然想起来数据库有好些时间没用到,所以,想把数据库有关的知识回顾一下,所以接下来这个月,基本上会以数据库的帖子来写为主,首先,很多同学都会有个错觉,觉得学习数据库会sql语句的增删改查就够了,其实,这仅仅是片面的认知,掌握了这些还远远不够,sql是你作为谋求生计的基本功,不会也得会,但是,要想变得优秀,还得学习更多的,比如:存储器、索引、事务等等。今天先和大家聊聊面试时技术官常会问你的:你说说看左连接与右连接以及全连接的区别,这个问题不管你是面试开发岗、测试岗甚至是产品岗,都会问到,接下来的慢慢看,就当回顾一下旧知识    


       在具体的介绍之前,先准备两张表,拿我自己的举例:test001(看作左表) 、  test002(看作右表)


aaaaaaaaaaa4.png

bbbbbbbbbbbcccccc.png


  1. 内连接

   关键字:inner join  

sql语句:

select*  from  table_left(表名)   inner join table_right(表名)    on   table_left.id  = table_right.id   

注释说明:结合两张表的记录,返回相关的查询结果,返回的是两个表的交集部分(即阴影部分),见下图

cccccccccccc.png


用我刚刚上面举例的两张表查询一下:SELECT* FROM test001 INNER JOIN test002 ON test001.id=test002.id


cccccccccccc.png



2.左连接

关键字:left join  

sql语句:

select*  from  table_left(表名)   left join table_right(表名)    on   table_left.id  = table_right.id   

注释说明:left join 是left outer join 的简写,全称其实是左外连接,属于外连接的一种,左连接查询,左表的信息全部展示出来,右表只会展示符合搜索条件的信息,不足的地方记为NULL


cccccccccccc.png



同样的,用我刚刚最上面准备好的两张表查询一下:

SELECT test001.id AS ID ,test001.username,test002.job FROM test001 LEFT JOIN test002 ON test001.id=test002.id


cccccccccccc.png


3.右连接

关键字:right join  sql

语句:

select*  from  table_left(表名)   right join table_right(表名)    on   table_left.id  = table_right.id   

注释说明:right join 是right outer join 的简写,全称是右外连接,也属于外连接的一种,右连接查询,右表的信息全部展示出来,左表只会展示符合搜索条件的信息,不足的地方记为NULL

cccccccccccc.png

如出一辙,用我刚刚最上面准备好的两张表查询一下:SELECT test002.id AS ID ,test001.username,test002.job FROM test001 RIGHT JOIN test002 ON test001.id=test002.id


cccccccccccc.png

看上图的右连接查询结果:右表的信息都有,左表的信息,有的就展示,没有的有用NULL表示,很容易区别


4.全连接

关键字:union / union all  

sql语句:

(select colum1,colum2,colum3... from  table_left) union (select colum1,colum2,colum3... from  table_right)        

(select colum1,colum2,colum3... from  table_left) union all (select colum1,colum2,colum3... from  table_right)


cccccccccccc.png

全连接:实际上就是把两张表合并,不管有的没的,都先给整上来。  

注意事项:①用union 时,完全相等的行,将会被合并,由于合并比较耗时,一般不直接使用 union 进行合并;通常采用union all 进行合并;          ②被union 连接的sql 子句,单个子句中不用写order by ,因为不会有排序的效果。但可以对最终的结果集进行排序;         (select  colum1,colum2....from A order by id) union all (select  colum1,colum2... from B order by id); //没有排序效果         (select colum1,colum2... from A ) union all (select colum1,colum2... from B ) order by id; //有排序效果  同样的,我用最开始最上面准备的两张表,来进行全连接合并


cccccccccccc.png

查询结果看上图:左表的字段信息和右表的字段信息都全部显示,如果你想进行id排序也可以,加个order by id   (SELECT test001.id,test001.username FROM test001)UNION ALL (SELECT test002.id,test002.job FROM test002) ORDER BY id

cccccccccccc.png

友情提示:union会自动将完全重复的数据去除掉;union all会保留那些重复的数据;所以,建议大家合理使用,根据自己的需求进行sql查询


评论