MySQL:联结表
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
联结表
联结是 SQL 的必杀技之一,可以在数据检索的时候实现联结表。在学习联结之前,需要先了解一下关系表的基本概念,给出一个写得不错的博客连接——数据库-表关系。这里只强调外键,所谓外键为某个表的一个列,该列是另一个表的主键,通过外键可以使 2 个表产生关联。
将数据存储于多个表中,可以通过组合的方式使得数据可以适应更多、更好的功能,因此如何将这些分散的数据联结为一个新的我们想要的表,就需要使用联结。
联结有一些注意事项,首先是使用联结时需要指定联结类型,第二是联结的条件需要给出,并且要保证书写正确。下面的讲解将对这些进行强调。
创建联结
想要创建联结,就需要包含多个表,同时为了消除二义性,所有的列都需要用完全限定列名来指定。
- 这里需要注意结合 WHERE 语句进行过滤,否则联结的表将会把所有被包含的行统统都联结。
也可以这么来写,使用 INNER JOIN 来指定来源于哪些表,然后用 ON 来指定联结的规则。
这种联结方式称之为等值联结或内部联结,这是根据 2 个表之间相同的字段进行联结的方式。
联结的表的个数也是没有限制的,在开销允许的范围内可以联结多个表。
表别名
联结是允许使用表别名的,使用表别名可以使重复调用表变得容易,表别名是服务器的内部行为。
自联结
自联结顾名思义,也就是一个表自己和自己按照一定的规则进行联结的用法。对于自联结我们可能要根据需求取一些表别名,因为表本身的关键字都是一样的,因此自联结会有二义性,取一些表别名更便于管理数据。
当然这个功能也可以用子查询来实现,不同的是往往自联结的用法,开销会比子查询小得多。
自然联结
所谓自然联结,指的是对表进行联结时应该至少有一个列出现在多个表中,并排除多次出现,使每个列只返回一次。自然联结我们往往这么用,选择一个表获取全部列,然后用这份数据来规定其他表使用的字段。前面讨论的都是内联结,所谓内联结根据 2 个表之间相同的字段进行联结的方式,可以理解为取交集,所有的内联结都是自然联结。
外部联结
现在来看看外联结,所谓外联结就是联结表包含了没有关联的行。外联结有 2 种,分别是左外联结和右外联结,分别使用关键字 LEFT OUTER JOIN 和 RIGHT OUTER JOIN,他们分别表示是从左边的表选择所有行还是右边的表。我们首先先来看看内联结和外联结的区别:
可以看到,外联结会把没有关联的行一并联结进来。现在看看左外联结和右外联结的区别:
由于右联结是以右侧的表为基准的,因此有些数据并没有出现。不过你也发现了,右联结其实就是左联结的 2 个表顺序倒过来写,效果是一样的。
联结使用聚集函数
在进行联结操作的时候,可以使用聚集函数来一并参与数据处理。比较典型的用法就是构建分组,然后利用分组来做联结操作。聚集函数对内联结和外联结来说都是适用的。
在这里首先对 “orders” 的 “order_num” 字段构建分组,然后将这个分组当做一个新的列去参与联结操作。
参考资料
《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
菜鸟教程——MySQL 教程