| 从两个或更多个表中组 所有组合。对于每个组合, 束的列表,参考 SQL Refer |
合数据的过程称为连接表。数据 它都测试连接条件。连接条件是 ence。 |
库管理程序从指定的表中形成行的 带有一些约束的搜索条件。有关约 |
| 注意:连接条件涉及的 条件的方式与计算其他搜索 |
列的数据类型不必相同;然而, 条件的方式相同,并且使用相同 |
这些数据类型必须相容。计算连接 的比较规则。 |
| 如果未指定连接条件, 完全不相关。该结果称为这 |
则返回在 FROM 子句中列出的表 两个表的交叉积。 |
中行的所有组合,即使这些行可能 |
| 本节中的示例基于下面两个表。这两 中并不存在。这两个表一般用来概述关于 雇员的姓名以及这些雇员的职务说明,而 姓名以及这些雇员所参与的项目。 |
个表只是样本数据库中表的简化形式,在样本数据库 连接的重点。 SAMP_STAFF 列出未作为合同工雇用的 SAMP_PROJECT 则列出雇员(合同工和全职人员)的 |
| 这些表如下: |
| 图 5. SAMP_PROJECT 表 |
|
| 图 6. SAMP_STAFF 表 |
|
| 下列示例产生两个表的交叉积。因未指定连接条件,所以给出了行的所有组合: |
| SELECT SAMP_PROJECT.NAME, |
| SAMP_PROJECT.PROJ, S |
AMP_STAFF.NAME, SAMP_STAFF.JOB |
| FROM SAMP_PROJECT, SAMP_STAFF |
| 此语句产生下列结果: |
|
| 两个主要的连接类型是 连接只保留交叉积中满足连 在,则结果表中不包括该信 |
内连接和外连接。到目前为止, 接条件的那些行。如果某行在一 息。 |
所有示例中使用的都是内连接。内 个表中存在,但在另一个表中不存 |
| 下列示例产生两个表的内连接。该内连接列出分配给某个项目的全职雇员信息: |
| SELECT SAMP_PROJECT.NAME, |
| SAMP_PROJECT.PROJ, S |
AMP_STAFF.NAME, SAMP_STAFF.JOB |
| FROM SAMP_PROJECT, SAMP_STAFF |
| WHERE SAMP_S |
TAFF.NAME = SAMP_PROJECT.NAM |
E |
| 或者,也可以指定如下内连接: |
| SELECT SAMP_PROJECT.NAME, |
| SAMP_PRO |
JECT.PROJ, SAMP_STAFF.NAME, |
SAMP_STAFF.JOB |
| FROM SAMP_PR |
OJECT INNER JOIN SAMP_STAFF |
| ON SAMP_STAFF.NAME = S |
AMP_PROJECT.NAME |
| 结果是: |
![]() |
| 注意:该内连接的结果由右表和左表 'Thompson' 都包括在列出所有全职雇员 和合同雇员的 SAMP_PROJECT 表中。 |
中姓名列的值匹配的行组成- 'Haas' 和 的 SAMP_STAFF 表中以及列出分配给某个项目的专职 |
| 外连接是内连接和左表 连接时,可任意将一个表指 |
和/或右表中未包括内连接中的 定为左表而将另一个表指定为右 |
那些行的并置。当对两个表执行外 表。外连接有三种类型: |
| 左外连接包括内连接和左表中未包括在内连接中的那些行。 |
| 右外连接包括内连接和右表中未包括在内连接中的那些行。 |
| 全外连接包括内连接以及左表和右表中未包括在内连接中的行。 |
| 使用 SELECT 语句来指 JOIN、RIGHT OUTER JOIN 关键字的第二个表。在 ON |
定要显示的列。在 FROM 子句中 或 FULL OUTER JOIN 的第一个 关键字后面,指定表示要连接的 |
,列出后跟关键字 LEFT OUTER 表的名称。接着需要指定后跟 ON 表之间关系的连接条件。 |
| 在下列示例中,将 SAMP_STAFF 指定 用 LEFT OUTER JOIN,列出所有全职和合 号,如果是全职雇员(在 SAMP_STAFF 中 |
为右表,而 SAMP_PROJECT 则被指定为左表。通过使 同雇员(在 SAMP_PROJECT 中列出)的姓名和项目编 列出),还列出这些雇员的职位: |
| SELECT SAMP_PRO |
JECT.NAME, SAMP_PROJECT.PROJ |
, |
| SAMP_STA |
FF.NAME, SAMP_STAFF.JOB |
| FROM SAMP_PROJECT LEFT O |
UTER JOIN SAMP_STAFF |
| ON SAMP_ST |
AFF.NAME = SAMP_PROJECT.NAME |
| 此语句产生下列结果: |
|
| 所有列中都具有值的那些行是该内连 'Thompson' 既在 SAMP_PROJECT(左表 满足连接条件的行,右表的列上出现空值 列出的合同雇员,因而未在 SAMP_STAFF 。 |
接的结果。这些都是满足连接条件的行: 'Haas' 和 )中列出又在 SAMP_STAFF(右表)中列出。对于不 : 'Lutz' 和 'Walker' 都是在 SAMP_PROJECT 表中 表中列出。注意:左表中的所有行都包括在结果集中 |
| 在下一个示例中,将 S 用 RIGHT OUTER JOIN 列出 将这些雇员分配给了某个项 |
AMP_STAFF 指定为右表而 SAMP_ 所有专职雇员(在 SAMP_STAFF 目(在 SAMP_PROJECT 中列出) |
PROJECT 则被指定为左表。通过使 中列出)的姓名和工作职位,如果 ,还列出他们的项目编号: |
| SELECT SAMP_PROJECT.NAME, |
| SAMP_PRO |
JECT.PROJ, SAMP_STAFF.NAME, |
SAMP_STAFF.JOB |
| FROM SAMP_PROJECT RIGHT |
OUTER JOIN SAMP_STAFF |
| ON SAMP_ST |
AFF.NAME = SAMP_PROJECT.NAME |
| 结果为: |
|
| 象在左外连接中一样,所有列中都具 件的行: 'Haas'和'Thompson'既在 SAMP 中列出。对于不满足连接条件的行,右表 分配项目的专职雇员。虽然他们在 SAMP_ :右表中的所有行都包括在结果集中。 |
有值的那些行是内连接的结果。这些都是满足连接条 _PROJECT(左表)中列出又在 SAMP_STAFF(右表) 的列上出现空值: 'Lucchessi'和'Nicholls'都是未 STAFF 中列出,但未在 SAMP_PROJECT 中列出。注意 |
| 下一个示例对 SAMP_PROJECT 表和 S 有专职雇员(包括未分配项目的雇员)和 |
AMP_STAFF 表使用 FULL OUTER JOIN。该示例列出所 合同雇员的姓名: |
| SELECT SAMP_PRO |
JECT.NAME, SAMP_PROJECT.PROJ |
, |
| SAMP_STA |
FF.NAME, SAMP_STAFF.JOB |
| FROM SAMP_PROJECT FULL O |
UTER JOIN SAMP_STAFF |
| ON SAMP_STAFF.NAME = S |
AMP_PROJECT.NAME |
| 结果为: |
|
| 此结果包括左外连接、 接和右外连接一样,对于不 SAMP_PROJECT 中的每一行 |
右外连接以及内连接。列出所有 满足连接条件的值,相应列中出 都包括在结果集中。 |
专职雇员和合同雇员。正如左外连 现空值。 SAMP_STAFF 和 |
