ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL学习——联结表

2021-06-27 12:02:25  阅读:201  来源: 互联网

标签:存储 供应商 MySQL 联结 学习 vend products 表中


在这里插入图片描述
欢迎关注微信公众号:摸鱼汪的杂货铺

十五、联结表

15.1 联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。联结是利用SQL的SELECT能执行的最重要的操作。

15.1.1 关系表

现在,假如有由一供应商生产的多种物品,那么在何处存储供应商信息(如,供应商名、地址、联系方式等)呢?将这些数据与产品信息分开存储的理由如下:
1.因为同一供应商生产的每个产品的供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间。
2.如果供应商信息改变(例如,供应商搬家或电话号码变动),只需要改动一次即可。
3.如果有重复数据(即每种产品都存储供应商信息),很难保证每次输入该数据的方式相同。不一致的数据在报表中很难利用。

关键是,相同数据出现多次决不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。

在这个例子中,可建立两个表,一个存储供应商信息,另一个存储产品信息。venders表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识。此标识称为主键(primary key),可以是供应商ID或任何其他唯一值

products表只存储产品信息,他除了供应商ID(venders表的主键)外不存储其他供应商信息。venders表的主键又叫作products的外键,他将venders表与products表关联。利用供应商ID能从vendors表中找出相应供应商的详细信息。

外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
这样做的好处:
1.供应商信息不重复,从而不浪费时间和空间。
2.如果供应商信息变动,可以只更新vendors表中的单个记录,相关表中的数据不用改动。
3.由于数据无重复,显然数据是一致的,这使得处理数据更简单。
总之,关系数据可以有效地存储和方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。

可伸缩性(scale) 能够适应不断增加的工作量而不失败。设计良好的数据或应用程序称之为可伸缩性性好(scale well)

15.1.2 表与表之间的关系

1. 多表之间的关系
	1. 分类:
		1. 一对一:
			* 如:人和身份证
			* 分析:一个人只有一个身份证,一个身份证只能对应一个人
		2. 一对多(多对一):
			* 如:部门和员工
			* 分析:一个部门有多个员工,一个员工只能对应一个部门
		3. 多对多:
			* 如:学生和课程
			* 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
	2. 实现关系:
		1. 一对多(多对一):
			* 如:部门和员工
			* 实现方式:在多的一方建立外键,指向一的一方的主键。
		2. 多对多:
			* 如:学生和课程
			* 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
		3. 一对一:
			* 如:人和身份证
			* 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。

15.1.3 为什么使用联结

正如所述,分解数据为了多个能更有效的存储,更方便地处理,并且具有更大地可伸缩性。但这好处是由代价的。
如果数据存储在多个表中,怎样用单挑SELECT语句查询出数据?
答案是使用联结。简单的说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊语法,可以连接多个表返回一组输出,连接在运行时关联表中正确的行。

15.2 创建联结

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子句也与之前不一样列出来两个表vendors和products。它们就是这条SELECT语句联结的两个表的名字。WHERE子句中看到两个匹配列以vendors.vend_id和products.vend_id指定,这里需要使用完全限定列名,因为如果只给出vend_id则MySQL不知道使用哪个。

15.2.1 WHERE子句的重要性

如果去掉上一句的WHERE子句会出现什么事情呢?

会发现这不是我们想要的额结果,所以不要忘记WHERE子句,否则MySQL将返回比想要的数据多得多的数据。应当保证WHERE子句的正确性。

标签:存储,供应商,MySQL,联结,学习,vend,products,表中
来源: https://blog.csdn.net/m0_46363470/article/details/118270693

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有