MYSQL必知必会笔记:第十五章联结表

外键

外键(foreign key)外键为某个表中的一列,它包含另一个表 的主键值,定义了两个表之间的关系

  • 这样做的好处如下:
    1. 供应商信息不重复,从而不浪费时间和空间;
    2. 如果供应商信息变动,可以只更新vendors表中的单个记录
    3. 相关表中的数据不用改动;
    4. 由于数据无重复,显然数据是一致的,这使得处理数据更简单。

总之,关系数据可以有效地存储和方便地处理
因此,关系数据库的可伸缩性远比非关系数据库要好

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

为什么要使用联结

分解数据为多个表能更有效地存储,更方便地处理,并 且具有更大的可伸缩性

联结是一种机制,用来在一条SELECT 语句中关联表,因此称之为联结
使用特殊的语法,可以联结多个表返 回一组输出,联结在运行时关联表中正确的行

维护引用完整性

重要的是,要理解联结不是物理实体,它在实际的数据库表中不存在
联结由MySQL根据需 要建立,它存在于查询的执行当中。

在使用关系表时,仅在关系列中插入合法的数据非常重要
如果在products表中插入拥有非法供应商ID (即没有在vendors表中出现)
的供应商生产的产品,则这些 产品是不可访问的因为它们没有关联到某个供应商

为防止这种情况发生,可指示MySQL只允许在products表的

供应商ID列中出现合法值(即出现在vendors表中的供应商)。

这就是维护引用完整性,它是通过在表的定义中指定主键和外

键来实现的

创建联结

格式:

select 列1,列2,列3 
from 表1,表2
where 表1.列=表2.列

输入:

select vend_name,prod_name,prod_price 
from vendors,products
where vendors.vend_id=products.vend_id

分析:

  1. 最大的差别是所指定的两个列(prod_name 和prod_price)在一个表中,而另一个列(vend_name)在另一个表中的FROM
  2. 子句列出了两个表,分别是vendors和products。它们就是这条SELECT 语句联结的两个表的名字
  3. 这两个表用WHERE子句正确联结,WHERE子句 指示MySQL匹配vendors表中的vend_id和products表中的vend_id
  4. WHERE子句作为 过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行

内部联结

目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的 相等测试。这种联结也称为内部联结

可以写成:

select1,2,3 
from1 inner join2
on1.=2.

输入:

select vend_name,prod_name,prod_price 
from vendors inner join products
on vendors.vend_id=products.vend_id

联结多个表

QL对一条SELECT语句中可以联结的表的数目没有限制。创建联结

的基本规则也相同。首先列出所有表,然后定义表之间的关系

性能考虑

MySQL在运行时关联指定的每个表以处理联结。

这种处理可能是非常耗费资源的,因此应该仔细,不要联结

不必要的表。联结的表越多,性能下降越厉害

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tree_Root.

大佬给点饭吃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值