本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的 SELECT 语句。
12.1 联结
SQL 最强大的功能之一就是能在数据查询的执行中联结表。
在这个例子中,可建立两个表,一个存储供应商信息,另一个存储产品信息。
Vendors 表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一的标识(此标识称为主键),可以是供应商 ID 或任何其他唯一值。
Products 表只存储产品信息,它除了存储供应商 ID(Vebdors 表的主键)外不存储其他供应商信息。
利用 Vendors 表的主键将 Vendors 表与 Products 表关联,通过供应商 ID 从 Vendors 表中找出相应供应商的详细信息。
好处:
- 供应商信息不重复,从而不浪费时间和空间
- 如果供应商信息变动,可以只更新 Vendors 表中的单个记录,相关表中的数据不用改动
- 由于数据无重复,这使得处理数据更简单
这样就使得关系数据库的可伸缩性比非关系数据库要好。
可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好
12.1.2 为什么要使用联结
如果数据存储在多个表中,怎么用单条 SELECTT 语句检索出数据?
使用联结。
使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
12.2 创建联结
例 1:
SELECT vend_name. prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
完全限定列名:在引用的列可能出现二义性时,必须使用完全限定列名(用一个句点分隔的表名和列名)
上面的例子中没有使用完全限定列名的原因是三个字段没有歧义,都是唯一的
12.2.1 WHERE 子句的重要性
在一条 SELECT 语句联结几个表时,相应的关系是在运行中构造的。
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一个配对
WHERE 子句作为过滤条件,它只包含那些匹配给定条件(联结条件)的行,如果没有 WHERE 子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起
12.2.2 内部联结
上面所用的联结称为等值联结,它基于两个表之间的相等测试,这种联结也称为内部联结。
其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型。
例 2:
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id
12.2.3 联结多个表
SQL 对一条 SELECT 语句中可以联结的表的数目没有限制。
创建联结的基本规则也相同,首先列出所有表,然后定义表之间的关系:
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 = '2007';
回顾第 11 章中子查询的例子:
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
下面使用联结的相同查询:
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND Orders.order_num = OrderItems.order_num
AND prod_id = 'RGAN01';