mysql七种Join理论 - Go语言中文社区

mysql七种Join理论


在sql99语法中,增加了 join这中关联表的查询,具体有left join ,right join ,inner join。这几种查询方式组合起来大概有一下七种查询方式,如图:

 

这里用手机–>所属公司来具体实践一下,先查看一下表的内容:

           手机数据表:                                               所属公司数据表:
----------------------------------|                        ----------------------------------|
  id   phoneName   price     companyId                     id          companyName                                 
  1	vivoX9	    2000	1                           1          vivo科技股份有限公司 
  2	vivoX20	    3200	1                           2          美国apple股份有限公司
  3	vivoXPlay   4500	1                           3          小米科技股份有限公司
  4	iphone7	    6000	2                           4          华为科技股份有限公司
  5	ipone8	    7000	2
  6	ipone9      8800	2                           ------------------------------------|
  7	小米8	    3000	3
  8	坚果R1	    3000      null
  9	oppoR11	    3000      null
  10    一加5	    3500      null
  ------------------------------------

首先有上向下,从左向右一个一个逐步进行分析

1.A表作为主表,B表作为从表,不管A表的内容是否在B表有关联对象,查询的结果是A表的所有内容都会显示,具体:

 select  phoneName ,price,companyName from phone LEFT JOIN   company  on  phone.companyId = company.id;
   结果:
        vivoX9	   2000	  vivo科技股份有限公司
	vivoX20	   3200	  vivo科技股份有限公司
	vivoXPlay  4500	  vivo科技股份有限公司
	iphone7	   6000	  美国apple股份有限公司
	ipone8	   7000	  美国apple股份有限公司
	ipone9	   8800	  美国apple股份有限公司
	小米8	   3000	  小米科技股份有限公司
	坚果R1	   3000	       null
	oppoR11	   3000	       null
	一加5	   3500	       null

2.B表作为主表,A表作为从表,不管B表的内容是否在A表有关联对象,查询的结果是B表的所有内容都会显示

select  phoneName ,price,companyName from phone RIGHT JOIN  company   on phone.companyId  =company.id;
 结果:
	vivoX9	   2000	 vivo科技股份有限公司
	vivoX20    3200	 vivo科技股份有限公司
	vivoXPlay  4500	 vivo科技股份有限公司
	iphone7	   6000	 美国apple股份有限公司
	ipone8	   7000	 美国apple股份有限公司
	ipone9	   8800	 美国apple股份有限公司
	小米8      3000	小米科技股份有限公司
	null       null  华为科技股份有限公司

3.查询出A表与B表的交集,也就是仅仅查询出A表与B表有关联记录的那几条数据

select  phoneName ,price,companyName from phone inner JOIN  company   on phone.companyId  =company.id;
结果:
	vivoX9	    2000	vivo科技股份有限公司
	vivoX20	    3200	vivo科技股份有限公司
	vivoXPlay   4500	vivo科技股份有限公司
	iphone7	    6000	美国apple股份有限公司
	ipone8	    7000	美国apple股份有限公司
	ipone9	    8800	美国apple股份有限公司
	小米8	    3000	小米科技股份有限公司

4.A表作为主表,B表作为从表,仅仅查询出A表在B表没有关联的那几条记录

select  phoneName ,price,companyName from phone left JOIN   company   on phone.companyId  =company.id where company.id is null;
结果:
    坚果R1	3000    null
    oppoR11	3000	null
    一加5	3500	null

5.B表作为主表,A表作为从表,仅仅查询出B表在B表没有关联的那几条记录

 select  phoneName ,price,companyName from phone RIGHT JOIN  company   on phone.companyId  =company.id where  phone.companyId is null;
 结果:
  null   null    华为科技股份有限公司

6.A表与B表的并集,也就是将A表与B表的记录加起来

select  phoneName ,price,companyName from phone LEFT JOIN   company  on  phone.companyId = company.id UNION
select  phoneName ,price,companyName from phone RIGHT JOIN  company   on phone.companyId  =company.id;
 结果:
    vivoX9	2000	vivo科技股份有限公司
    vivoX20	3200	vivo科技股份有限公司
    vivoXPlay	4500	vivo科技股份有限公司
    iphone7	6000	美国apple股份有限公司
    ipone8	7000	美国apple股份有限公司
    ipone9	8800	美国apple股份有限公司
    小米8	3000	小米科技股份有限公司
    坚果R1	3000	     null
    oppoR11	3000	     null
   一加5	3500	     null
    null	null  华为科技股份有限公司

7.A表与B表的并集,但是除去他们共有的部分:

select  phoneName ,price,companyName from phone left JOIN   company   on phone.companyId  =company.id where company.id is null
union
select  phoneName ,price,companyName from phone RIGHT JOIN  company   on phone.companyId  =company.id where  phone.companyId is null;
结果:
	坚果R1	3000	  null
	oppoR11	3000      null
	一加5	3500	  null
	null	null    华为科技股份有限公司
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Bingo_fang/article/details/80572807
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 00:33:21
  • 阅读 ( 820 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢