🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集!
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨
😇MySQL的前情介绍
😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一下自己的学习过程,并且分享给大家尼!
😇本章详情
🐤本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句。
😇联结
前言
SQL最强大的功能之一就是能在数据检索查询的执行中联结 (join)表。联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的一个极为重要的组成部分。
在能够有效地使用联结前,必须了解关系表以及关系数据库设计的些基础知识。下面的介绍并不是这个内容的全部知识,但作为入门已经足够了。
😇关系表
💐理解关系表的最好方法是来看一个现实世界中的例子:
现在,假如有由同一供应商生产的多种物品,那么在何处存储供应商信息(如,供应商名、地址、联系方法等)呢?将这些数据与产品信息分开存储的理由如下。
因为同一供应商生产的每个产品的供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间。
如果供应商信息改变(例如,供应商搬家或电话号码变动),只需改动一次即可。
如果有重复数据(即每种产品都存储供应商信息),很难保证每次输入该数据的方式都相同。不一致的数据在报表中很难利用。
关键
关键是,相同数据出现多次决不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系 (relational))互相关联。
分析
🌱在这个例子中,可建立两个表,一个存储供应商信息,另一个存储产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此识称为主键 (primary key) (在第首篇文章中首次提到),可以是供应商ID或任何其他唯一值。
products表只存储产品信息,它除了存储供应商ID (vendors表的主键)外不存储其他供应商信息。vendors表的主键又叫作products的外键,它将vendors表与products表关联,利用供应商ID能从vendors表中找出相应供应商的详细信息。
外键(foreign key)
外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
好处
- 供应商信息不重复,从而不浪费时间和空间;
- 如果供应商信息变动,可以只更新vendors表中的单个记录,相关表中的数据不用改动;
- 由于数据无重复,显然数据是一致的,这使得处理数据更简单。
🌻总之,关系数据可以有效地存储和方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。
可伸缩性(scale)
能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好 (scale well)
😇为什么要使用联结
正如所述,分解数据为多个表能更有效地存储,更方便地处理,并且具有更大的可伸缩性。但这些好处是有代价的。
🌼如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
答案是使用联结。简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
维护引用完整性
维护引用完整性重要 的是,要理解联结不是物理实体。换句话说,它在实际的数据库表中不存在。联结由MySQL根据需要建立,它存在于查询的执行当中。
在使用关系表时,仅在关系列中插入合法的数据非常重要。回到这里的例子,如果在products表中插入拥有非法供应商ID即没有在vendors表中出现)的供应商生产的产品,则这些产品是不可访问的,因为它们没有关联到某个供应商。为防止这种情况发生,可指示MySQL只允许在products表的供应商ID列中出现合法值(即出现在vendors表中的供应商)这就是维护引用完整性,它是通过在表的定义中指定主键和外键来实现的。(这将在后面的文章种介绍)。
😇创建联结
联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。请看下面的例子:
输入
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name;
输出
分析
我们来考察一下此代码。SELECT语与前面所有语一样指定要检索的列。这里,最大的差别是所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。
现在来看FROM子句。与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
可以看到要匹配的两个列以vendors.vend id和products.vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id则MySQL不知道指的是哪一个 (它们有两个,每个表中一个)。
完全限定列名
在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySOL将返回错误。