- 参考资料
- 《MySQL必知必会(文字版)》
1、联结
1.1 关系表
- 现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是
- 关系表设的设计目的:
- 把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联。
- 在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。
Vendors
表包含所有供应商信息,每个供应商占一行,具有唯一的标识。【此标识称为主键(primary key
),可以是供应商 ID 或任何其他唯一值。】Products
表只存储产品信息,除了存储供应商ID
(Vendors
表的主键)外,它不存储其他有关供应商的信息。Vendors
表的主键将Vendors
表与Products
表关联,利用供应商ID
能从Vendors
表中找出相应供应商的详细信息。
- 优点
- 供应商信息不重复,不会浪费时间和空间;
- 如果供应商信息变动,可以只更新
Vendors
表中的单个记录,相关表中的数据不用改动;- 由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单。
1.2 为什么使用联结
- 将数据分解为多个表能更有效地存储,更方便地处理,并且可伸缩性更好。
- 如果数据存储在多个表中,可使用联结检索出数据。
- 联结是一种机制,用来在一条
SELECT
语句中关联表,因此称为联结。
1.3 创建联结
- 创建联结:指定要联结的所有表以及关联它们的方式即可
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
FROM
子句列出了两个表:Vendors
和Products
。【它们就是这条SELECT
语句联结的两个表的名字。】- 这两个表用
WHERE
子句正确地联结,WHERE
子句指示DBMS
将Vendors
表中的vend_id
与Products
表中的vend_id
匹
- 笛卡儿积(
cartesian product
):由没有联结条件的表关系返回的结果
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;
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;
- 不要联结不必要的表。联结的表越多,性能下降越厉害。