mysql两个表设置关联_mysql---多表关联

首先为大家介绍的集合概念:收藏有障碍、唯一性。

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

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

16e90683d9dc7df725aa64489d532a78.png

上图所看到的集合是错误的。由于有2个‘3’违背了唯一性

c9b5dcfb98d1cc0f0299db8ec56693c1.png

上图所看到的的两个集合是同样的。集合元素是无序的

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

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

并集:连个集合全部元素组成的集合

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

dd798a2c2c11315a01dd86bd8ac9cd47.png

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

420a50ed93c35983d17a5cb96e4611e9.png

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

一张表事实上就相当于一个集合。每一行是集合的一个元素

如今有两表

goods表:包括商品ID。栏目ID,商品名

88d8d4cc84a26741e706235d7a23f12a.png

channel表:栏目ID,栏目名

77e0d31b67378b809af5dcf9fac76225.png

如今想得到一张报价单包括商品ID,商品名,栏目ID。栏目名。该怎样去做?

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

即两表各个行的全部组合

Center

从两个表行的全部组合中选出满足要求的行

875e6e35f54e532fc64dc1b4408ab1b6.png

尽管得出了正确答案。可是假设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的公共集)

左连接:

3bbbf188531496a71be050c171b27cce.png

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

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

推荐使用左连接。比較符合常规逻辑

Center

内连接:

Center

从左右连接和内连接的结果看,内连接少了一条记录,而左右连接出现了NULL的情况。

那左右连接和内连接之间究竟有什么关联呢?

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

c4c7e7f6f8a76d348007f5dc415ca220.bmp

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出现

版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值