一、表连接
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
连接类型 定义
内连接 只连接匹配的行
左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配
的行),以及右边表中全部匹配的行,a.order_id = b.order_id(+)
右外连接 包含右边表的全部行(不管左边的表中是否存在与它们匹配
的行),以及左边表中全部匹配的行,a.order_id(+) = b.order_id
全外连接(也可以叫全连接) 全外连接是能够从这样两张内容不一致的表里,获取全部的信息
交叉连接 连接两个或者多个不相关的表,没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。
自连接(通常只有有人教才会说) 自连接说白了其实就是两张表结构和数据内容完全一样的表,在做数据处理的时候,我们通常会给它们分别重命名来加以区分(言外之意:不重命名也不行啊,不然数据库也不认识它们谁是谁),然后进行关联。
然后这个是我在菜鸟教程那里找的理解图
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4d0c2195699479ba5e2ecee0e7925f8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/591aca8c676d4f29aca8302555b0954e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_20,color_FFFFFF,t_70,g_se,x_16)
内连接:
sql语句一:select * from TableA JOIN TableB on TableA.ID=TableB.ID
sql语句二: select * from TableA,TableB where TableA.ID=TableB.ID
sql语句三: select * from TableA cross join TableB where TableA.ID=TableB.ID (cross join 后只能用where不能用on)
结果视图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ac924f55d21f4537a03a32ff48e61237.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_11,color_FFFFFF,t_70,g_se,x_16)
左外连接:
sql语句: select * from TableA left join TableB on TableA.ID=TableB.ID
注释:TableA(基表)中所有的行列都显示了,第三行的条件不匹配所有TableB(外表)的值都为NULL
![在这里插入图片描述](https://img-blog.csdnimg.cn/021e446caf4a499cb3ca5da36a0164c9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_11,color_FFFFFF,t_70,g_se,x_16)
右外连接:
sql语句: select * from TableA right join TableB on TableA.id=TableB.id
![在这里插入图片描述](https://img-blog.csdnimg.cn/129c1e5b6dda4b85aed59dae111a7b0a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_11,color_FFFFFF,t_70,g_se,x_16)
全外连接 :
sql语句:select * from TableA full join TableB on TableA.id=TableB.id
![在这里插入图片描述](https://img-blog.csdnimg.cn/b1ea1d53c5a14ef38ef0a89b23ebd7c1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_11,color_FFFFFF,t_70,g_se,x_16)
交叉连接:
sql语句: select * from TableA cross join TableB
![在这里插入图片描述](https://img-blog.csdnimg.cn/b4f63ec24a074d98977d2f7bbf223ba5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_20,color_FFFFFF,t_70,g_se,x_16)
返回56=30行数据,即笛卡尔积
自连接:
sql语句: select s1.Name AS Name1,s2.Name AS Name2 from TableA s2,TableA s1
![在这里插入图片描述](https://img-blog.csdnimg.cn/6a93f91b81f04d70935efad4657f0e1d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5piv6KW_55Oc5oiR5piv54y5,size_20,color_FFFFFF,t_70,g_se,x_16)
返回66=36行数据