12 联结表

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';           
            
原文地址:https://www.cnblogs.com/xlzfdddd/p/10159225.html