在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 华为科技股份有限公司