第12课 联结表

第12课 联结表
12.1 联结
SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。
 
12.1.1 关系表
关系表的设计就是要把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相关联(所以才叫关系数据库)。
可伸缩(scale):能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好(scale well)。
 
12.1.2 为什么使用联结
联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。
 
12.2 创建联结
创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
 
注:
这两个表用 WHERE 子句正确地联结,WHERE 子句指示 DBMS 将 Vendors 表中的 vend_id 与 Products 表中的 vend_id 匹配起来。
 
12.2.1 WHERE子句的重要性
在联结两个表时,实际要做的是将
第一个表中的每一行与第二个表中的每一行配对。WHERE 子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有 WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。
 
笛卡儿积(cartesian product)
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
 
提示:叉联结
有时,返回笛卡儿积的联结,也称叉联结(cross join)
 
12.2.2 内联结
目前为止使用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内联结(inner join)。其实,可以对这种联结使用稍微不同的语法,明确指定联结的类型。下面的 SELECT 语句返回与前面例子完全相同的数据:
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 的相同。
 
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 = 20007;
 
注意:性能考虑
DBMS 在运行时关联指定的每个表,以处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能下降越厉害。
 
现在回顾一下第 11 课中的例子,如下的 SELECT 语句返回订购产品RGAN01 的顾客列表:
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'));
 
如第 11 课所述,子查询并不总是执行复杂 SELECT 操作的最有效方法,下面是使用联结的相同查询:
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';
分析:
如第 11课所述,这个查询中的返回数据需要使用 3个表。但在这里,我们没有在嵌套子查询中使用它们,而是使用了两个联结来连接表。这里有三个 WHERE 子句条件。前两个关联联结中的表,后一个过滤产品 RGAN01 的数据。
 
12.3 小结
posted @ 2022-06-22 14:40  lqsj2018  阅读(30)  评论(0编辑  收藏  举报