当联接表时,您所创建的联接类型决定了出现在结果集中的行。您可以创建下列类型的联接:
- 内部联接 一个联接,仅显示在两个联接的表中匹配的行。(这是查询设计器中的默认联接类型。)例如,您可以联接 titles 和 publishers 表,以创建一个结果集,显示每本书名的出版商名称。在一个内部联接中,结果集中不包含没有出版商信息的书名,也不包含没有书名的出版商。 注意 当您创建一个内部联接,因此不包括在结果集中时,包含 NULL 的列不与任何值匹配。Null 值不与其他的 null 值匹配。
- 外部联接 一个联接,包括那些即使它们在联接表中没有相关行的行。您可以创建一个外部联接的三个变体来指定所包括的不匹配行:
- 左外部联接 包括第一个命名表(“左”表,出现在 JOIN 子句的最左边)中的所有行。在右表中的不匹配行不出现。例如,下面的 SQL 语句举例说明了一个 titles 表和 publishers 表之间的左外部联接包括所有的标题,即使是那些没有出版商信息的标题: SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles LEFT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
- 右外部联接 包括第二个命名表(“右”表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之间的右外部联接包括所有的出版商,即使是那些在 titles 表中没有书名的行。
- 完全外部联接 包括所有联接表中的所有行,不论它们是否匹配。例如,titles 和 publishers 之间的一个完全外部联接显示所有标题和所有出版商,即使是那些在另一个表中没有匹配值的。
创建自联接
您可以用一个表和它自己联接,也就是说,创建一个自联接。如果您想同一个表中查找与其他行有共同值的行。例如,您可以利用一个自联接查找拥有同一个邮政编码的两个作者。
象其他联接一样,自联接需要至少两个表。不同的是,您并不是将另一个表添加到查询,而是添加同一个表的第二个实例。这样,您就可以把表的第一个实例中的一个列和在第二个实例中的同一个列进行比较,这样就可以使您相互比较列中的值。表的每个实例必须唯一,因此查询设计器给表的第二个实例指定一个别名。
例如,如果您创建一个自联接来查找有同样邮政编码的所有作者,您将表的第一个实例中的 zip 列和第二个实例中的 zip 列进行比较。结果生成的联接条件可能看上去像下面这样:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip创建一个自联接通常需要多个联接条件。主联接条件是这个联接所基于的那个条件。在作者邮政编码的那个例子中,主联接条件是基于在 zip 列查找一个确切的匹配。
然而,如果您的联接仅基于这个条件,表中的每个行将在结果集中至少出现两次。每个列和它自己匹配,导致了重复。此外,除联接值的顺序外,相同行的联接结果是颠倒的。
要消除这些重复,您可以包含第二个联接条件,以筛选掉重复的行。第二个联接条件可能会用小于(<)运算符比较主键(在该示例中是 au id 列)。生成的联接条件可能看上去像这样:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip AND authors.au_id < authors1.au_id当您创建一个自联接时,查询设计器通常自动创建第二个联接条件,因为它是基于一个主键。然后您可以手动添加主联接条件。
|