12.1 使用联结
联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
12.2 创建联结
创建联结的方法是:指定要联结的所有表以及关联它们的方式。
看这样一个例子:
SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
输出的结果是:
SELECT语句所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。 FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT 语句联结的两个表的名字。这两个表用WHERE子句正确联结, WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
可 以 看 到 要 匹 配 的 两 个 列 以 vendors.vend_id 和 products.vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id, 则MySQL不知道指的是哪一个(它们有两个,每个表中一个)。
12.2.1 使用WHERE的重要性
这里引入笛卡尔积的概念:
由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
上面的例子中,如果没有WHERE子句,得到的结果就是笛卡尔积结果。
12.2.2 内部联结
前面所描述的联结都是等值联结,也叫内部联结。
下面的SELECT语句返回与前面例子完全相同的数据:
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
这里,两个表之间的关系是FROM子句的组成部分,以INNERJOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。
12.2.3 联结多个表
在上一章子查询我们举了一个例子
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 = 'TNT2'; ) );
如果改成多表联结,可以这样改:
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 = 'TNT2';