SQL之六

                       SQL之联结表 

1.联结
SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用SQL的select能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分。
2.关系表
有一个包含产品目录的数据库表,其中每类物品占一行。对于每一种物品,要存储的信息包括产品描述,价格,以及生产该产品的供应商。
现在有同一供应商生产的多种物品,那么在何处存储供应商名,地址,联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:
(1)同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间。
(2)如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修改一次即可。
(3)如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同,不一致的数据在报表中就很难利用。
关键是,相同的数据出现多次决不是一件好事,这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联(所以才叫关系数据库)。
3.在这个例子中可建立两个表:一个存储供应商信息,另一存储信息。Vendors表包含所有供应商信息,另一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识为主键(primary key),可以是供应商ID或任何其他唯一值。
Products表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,它不存储其他有关供应商的信息。Vendors表的主键将Vendors表中找出相应供应商的详细信息。
这样做的好处是:
(1) 供应信息不重复,不会浪费时间和空间;
(2) 如果供应商信息变动,可以只更新Vendors表中的单个记录,相关表中的数据不用改动
(3) 由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单
总之,关系数据可以有效地存储,方便地处理。因此,关系数据库的可伸缩性比非关系数据库要好。
可伸缩(scale):能够适应不断增加的工作量而不失败。涉及良好的数据库或应用程序称为可伸缩性好(scale well)
2.为什么使用联结?
如前所述,将数据分解为多个表能更有效地存储,更方便地处理,并且可伸缩性更好。但这些好处是有代价的。
如果数据存储在多个表中,怎样用一条select语句就检索出数据呢?
答案是使用联结。简单说,联结是一种机制,用来在一条select语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
3.创建联结
创建联结的方法非常的简单,指定要联结的所有表以及关联他们的方式即可。
举个简单的列子如下:
Select vend_name,prod_name,prod_price from Vendors,Products where Vendors.vend_id = Products.vend_id;
4.where子句的重要性
使用where子句建立联结关系似乎有点奇怪,但实际上有个很充分的理由的。要记住,在一条select语句中联结几个表时,相应的关系是运行中构造的。在数据库表的定义中没有指示DBMS如何对表进行联结的内容。你必须自己做这件事情。在联结两个表时,你必须自己做这件事情。在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。Where子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有where子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。
笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
举个语句会出现笛卡尔积:
Select vend_name,prod_name,prod_price from Vendors,Products;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值