多表关联和左、右连接,内连接

多表连接

首先要介绍一下集合的概念:集合具有无序性、唯一性。

无序性:指集合内部元素没有相对顺序的概念,对于两个集合而言,只要元素值和元素个数相同则两个集合相等。

唯一性:指集合内部元素不存在值相等的元素。

上图所示集合是错误的,因为有2个‘3’违背了唯一性

上图所示的两个集合是相同的,集合元素是无序的


集合的运算:交集、并集、相乘

交集:两个集合公共元素组成的集合

并集:连个集合所有元素组成的集合

相乘:也成笛卡尔积,两个集合所有元素组合的集合

多表关联和左、右连接,内连接_第1张图片

集合1*集合2的结果如下:

其中(1,3)是集合1中的‘1’和集合2中的‘3’的组合

一张表其实就相当于一个集合,每一行是集合的一个元素


现在有两表

goods表:包含商品ID,栏目ID,商品名,有8个商品

多表关联和左、右连接,内连接_第2张图片

channel表:栏目ID,栏目名,有3个栏目

多表关联和左、右连接,内连接_第3张图片


想在想得到一张报价单包含商品ID,商品名,栏目ID,栏目名,该如何去做?


全相乘:笛卡尔积 总共有3*8=24 条记录

即两表各个行的所有组合

选出其中满足要求的行

多表关联和左、右连接,内连接_第4张图片

虽然得出了正确答案,但是如果goods表和channel表很大的话,如goods表有1W条记录,channel也有1W条记录。则需要在内存中生成一张1W*1W的临时表,而且绝大部分记录都不是我们所需的。所以全相乘浪费了空间、降低了效率。


左连接:语法 表1 left join 表2 on 条件

以表1为基准选出满足条件的表2的行

多表关联和左、右连接,内连接_第5张图片


右连接:语法 表2 right join 表1 on 条件  等价于 表1 left join 表2 on 条件

所以左右连接往往可以互换,但是右连接有点反逻辑思维,建议选用左连接。

多表关联和左、右连接,内连接_第6张图片


内连接:语法 表1 inner join 表2 on 条件


可见左右连接、内连接、全相乘都可以完成所要求的功能,但是全相乘的效率是最低的,因为全相乘生成的是一张很大的临时表,而且没有索引。

以左连接为例 “A left join B on 条件” 其实相当于一张临时表,包含A表和B表所有的字段,以及满足条件的B的所有的行。而且后面可以接where 等子句。


多表联查:

A ,B,C,D表关联

A left join B on 条件1 left join C on 条件2 left join D on 条件3


左右连接和内连接的区别

现有两张表

第一张表为男生表,记录了男生的姓名和配偶的编号

第二张表为女生表,记录了女生的姓名和自己的编号



第一种情况:主持人请所有男生都上台,并且带上自己的配偶。这时不管男生有没有配偶都要上台,所以是以男生表为基准关联女生表

可以考虑用左连接

多表关联和左、右连接,内连接_第7张图片

屌丝比较悲剧,在女生表中没有他的配偶,所以gname和gname.other都为NULL。高富帅肯定美女环抱,所以有多行记录。


第二种情况:主持人请所有女生都上台,并且带上自己的配偶。这时不管女生有没有配偶都要上台,所以是以女生表为基准关联男生表

可以考虑用左连接

多表关联和左、右连接,内连接_第8张图片

小美也比较悲剧,在男生表中没有对应的配偶,所以bname和bname.other都为NULL。至于小娇、小芝、小琳跟高富帅和小王的关系就比较乱了,也有多行。


第三种情况:主持人请所有有配偶的男女生上台,这是就可以用内连接了



可见boy left join girl on boy.other = girl.other含义是:在girl表中找到满足条件boy.other = girl.other的行与boy表中对应的行组合,boy表中没有在girl表中匹配的行补NULL。


左右连接及内连接的关系:

左右连接可以相互转换。A left join B on 条件 等价于 B left join A on 条件

内连接 A inner join B on 条件 是   A left join B on 条件 和 B right join A on 条件的交集。

你可能感兴趣的:(内连接,多表关联,左右连接)