你的浏览器不支持canvas

Enjoy life!

数据库-SQL(七)联结表

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

  • 参考资料
    • 《MySQL必知必会(文字版)》

1、联结

1.1 关系表

  • 现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是

select


  • 关系表设的设计目的:
    • 把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联。

  • 在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。
  • Vendors 表包含所有供应商信息,每个供应商占一行,具有唯一的标识。【此标识称为主键(primary key),可以是供应商 ID 或任何其他唯一值。】
  • Products 表只存储产品信息,除了存储供应商 IDVendors 表的主键)外,它不存储其他有关供应商的信息。
  • Vendors 表的主键将 Vendors 表与 Products 表关联,利用供应商 ID 能从 Vendors 表中找出相应供应商的详细信息。

select

  • 优点
    • 供应商信息不重复,不会浪费时间和空间;
    • 如果供应商信息变动,可以只更新 Vendors 表中的单个记录,相关表中的数据不用改动;
    • 由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单。

1.2 为什么使用联结

  • 将数据分解为多个表能更有效地存储,更方便地处理,并且可伸缩性更好。
  • 如果数据存储在多个表中,可使用联结检索出数据。
  • 联结是一种机制,用来在一条 SELECT 语句中关联表,因此称为联结。

1.3 创建联结

  • 创建联结:指定要联结的所有表以及关联它们的方式即可
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id; 

select

  • FROM 子句列出了两个表:VendorsProducts。【它们就是这条 SELECT 语句联结的两个表的名字。】
  • 这两个表用 WHERE 子句正确地联结,WHERE 子句指示 DBMSVendors 表中的 vend_idProducts 表中的 vend_id

  • 笛卡儿积(cartesian product):由没有联结条件的表关系返回的结果
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products; 

select

1.4 内联结

  • 等值联结:基于两个表之间的相等测试,这种联结也称为内联结(inner join
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
 ON Vendors.vend_id = Products.vend_id; 
  • 此语句中的 SELECT 与前面的 SELECT 语句相同,但 FROM 子句不同。
  • 这里,两个表之间的关系是以 INNER JOIN 指定的部分 FROM 子句。
  • 在使用这种语法时,联结条件用特定的 ON 子句而不是 WHERE 子句给出。
  • 传递给 ON 的实际条件与传递给 WHERE 的相同。

1.5 联结多个表

  • 显示订单 20007 中的物品
SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
 AND OrderItems.prod_id = Products.prod_id
 AND order_num = 20007; 

select

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

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。