概述
连表是SQL常用的操作,但是连表不一样,得到的结果也不一样(在数据量大的时候尤为明显),这里就是对关联表中一些筛选用的关键字的具体区别做了一个详细的梳理。
首先准备两张表,分别是tb_student和tb_class表
tb_class表:
tb_student表:
一、内连接
1、隐式内连接:把连接条件放到where关键字后面。
语法:select 要查询的内容 from 表1,表2 where 连接条件 [and 筛选条件];
select * from tb_student s,tb_class c where s.cid = c.cid
结果如图:
如果不写连接条件,将查询出表1*表2,笛卡尔积
select * from tb_student,tb_class
结果如图:
2、显式内连接:使用inner join来连接,将连接条件放到on后面。
语法:select 要查询的内容 from 表1 inner join 表2 on 连接条件 [where 筛选条件];
select * from tb_class c inner join tb_student s on s.cid = c.cid
结果如图:
二、外连接
两张表中一张表作为基表,查询出该表所有的数据,另外一张表作为连接表,查询出该表与基表能够匹配的数据。如果基表数据匹配不上,就用null来填充。
1、左外连接:左边的表作为基表,右边的表作为连接表
语法:select 要查询的内容 from 表1,表2 where 连接条件 [and 筛选条件];
select * from tb_class c left join tb_student s on s.cid = c.cid
结果如图:
从图中可以看出,左外连接查出了左表的全部数据,on关键字是对left join的右表(tb_student表)进行了条件的的筛选,发现学生表中没有cid为5的学生,所以返回了null。
2、右外连接:右边的表作为基表,左边的表作为连接表
语法:select 要查询的内容 from 连接表 right join 基表 on 连接条件 [where 筛选条件];
select * from tb_class c right join tb_student s on s.cid = c.cid
结果如图:
从图中可以看出,右外连接查出了右表的全部数据,on关键字是对right join的左表(tb_class表)进行了条件的的筛选,因为学生表中只有四条数据,没有cid为5的学生,所以查询的结果没有cid为5的班级数据。
注意:外连接中表的书写顺序将直接影响查询结果。
总结
1、一般来说,在进行多表联查时,都使用的是左连接,或者右连接,因为where是用来写条件的,一般不会用于连接表;再者where会把所有表中的数据都查询出来,再过滤,在性能问题上左连接和右连接,都要更优。
2、where连接:隐式内连接,主要是直接将两张表的数据,组合成一张临时表,然后通过where来筛选条件。通过两个表中相同的字段的值来对两个表进行连接。
3、inner join:显式内连接,则是与where连接比较相似,是将on中的条件放到where上,只返回满足条件的。
4、left join(right join)左外连接(或右外连接),它不管on中的条件是否为真,都会返回左表(或右表)中的所有数据,再对另一个表的连接字段进行匹配,如果匹配不上,就会用null填充。
标签:Right,Join,cid,where,Inner,join,tb,连接,select From: https://www.cnblogs.com/echosada/p/17833438.html