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

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

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

mysql两个表关联不加关联关系 mysql两个表做关联_mysql两个表关联不加关联关系

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

mysql两个表关联不加关联关系 mysql两个表做关联_mysql做关联表_02

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

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

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

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

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

mysql两个表关联不加关联关系 mysql两个表做关联_数据集_03

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

mysql两个表关联不加关联关系 mysql两个表做关联_内连接_04

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

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

现在有两表

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

mysql两个表关联不加关联关系 mysql两个表做关联_右连接_05

channel表:栏目ID,栏目名

mysql两个表关联不加关联关系 mysql两个表做关联_内连接_06

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

全相乘:笛卡尔积 总共有4*4=16 条记录

即两表各个行的所有组合

mysql两个表关联不加关联关系 mysql两个表做关联_内连接_07

从两个表行的所有组合中选出满足要求的行

mysql两个表关联不加关联关系 mysql两个表做关联_右连接_08

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

现在考虑怎样才能高效实现要求呢?常见的多表关联有左连接、右连接、内连接,哪些能帮助我们来实现上述要求呢?

左连接的语法:表A LEFT JOIN 表B ON 关联条件                    (从表B中找出与表A满足关联条件的行)

右连接的语法:表A RIGHT JOIN 表B ON 关联条件                 (从表A中找出与表B满足关联条件的行)

内连接的语法:表A INNER JOIN 表B ON 关联条件                   (求出表A和表B的公共集)

左连接:

mysql两个表关联不加关联关系 mysql两个表做关联_mysql两个表关联不加关联关系_09

第四条记录后面两个字段为NULL,因为'捷安特'的栏目信息在 表B中没有找到。

右连接:和左连接类似,可以相互转换如:表A LEFT JOIN 表B ON 关联条件  等价于 表B RIGHT JOIN 表A ON 关联条件

推荐使用左连接,比较符合常规逻辑

mysql两个表关联不加关联关系 mysql两个表做关联_mysql两个表关联不加关联关系_10

内连接:

mysql两个表关联不加关联关系 mysql两个表做关联_数据集_11

从左右连接和内连接的结果看,内连接少了一条记录,而左右连接出现了NULL的情况。那左右连接和内连接之间到底有什么关联呢?

如有两个表,表A和表B,他们可以通过公共字段来关联,他们之间的关系可以用下图来表示

mysql两个表关联不加关联关系 mysql两个表做关联_数据集_12

A INNER JOIN B

:得出的结果是表A和表B的公有数据集C

A lEFT JOIN B:得出的结果是表A记录集A1+公有数据集C,A1中会有NULL出现

B RIGHT JOIN A:得出的结果是公有数据C+表B记录集B1,B1中会有NULL出现