等值联接(内部联接)
建立两个表,一个存储供应商信息,另一个存储
产品信息。vendors表包含所有供应商信息,每个供应商占一行,每个供
应商具有唯一的标识。此标识称为主键(primary key)(在第1章中首次
提到),可以是供应商ID或任何其他唯一值。
products表只存储产品信息,它除了存储供应商ID(vendors表的主
键)外不存储其他供应商信息。vendors表的主键又叫作products的外键,
它将vendors表与products表关联,利用供应商ID能从vendors表中找出
相应供应商的详细信息。
外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
可伸缩性(scale) 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好(scale well)。
创建连接
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子句。与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,
WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
可以看到要匹配的两个列以 vendors.vend_id 和 products.
vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id,
则MySQL不知道指的是哪一个(它们有两个,每个表中一个)。
笛卡儿积(cartesian product) 由没有联结条件的表关系返回
的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘
以第二个表中的行数。
不要忘了WHERE子句 应该保证所有联结都有WHERE子句,否
则MySQL将返回比想要的数据多得多的数据。同理,应该保
证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回
不正确的数据
叉联结 有时我们会听到返回称为叉联结(cross join)的笛卡
儿积的联结类型。
内部连接
目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型。
下面的SELECT语句返回与前面例子完全相同的数据:
SELECT vend_name, prod_id, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以INNERJOIN指定。
在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。

浙公网安备 33010602011771号