SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用 SQL的 SELECT 能执行的最重要的操作。
1、创建联结表
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 匹配起来。
要保证所有联结都有where子句,如果没有联结条件的表关系则返回的结果为笛卡儿积,也成为叉联结(检索出的行的数目将是第一个表中的行数乘以第二个表中的行数)。
2、内联结
目前为止使用的联结称为等值联结( equijoin),它基于两个表之间的相等测试。这种联结也称为内联结(inner join)。
其实,可以对这种联结使用稍微不同的语法,明确指定联结的类型。下面的 SELECT 语句返回与前面例子完全相同的数据:
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
两个表之间的关系是以 INNER JOIN 指定,联结条件用特定的 ON 子句代替where子句。
3、联结多个表
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;
这个例子显示订单 20007 中的物品。订单物品存储在 OrderItems 表中。每个产品按其产品 ID存储,它引用 Products 表中的产品。这些产品通过供应商 ID联结到 Vendors 表中相应的供应商,供应商 ID存储在每个产品的记录中。这里的 FROM 子句列出三个表, WHERE 子句定义这两个联结条件,而第三个联结条件用来过滤出订单 20007 中的物品。
以下两个查询结果是一样的:
① 子查询
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 OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';