数据通常存储在多个表中,关系由外键定义。但是,有时两个表可能没有直接的外键关系,但它们仍然可以通过第三张表连接。本问题演示如何执行此类连接以从多个表中提取特定信息。
与需要外键进行表连接的假设相反,外键并非必需。相反,可以根据为每个表定义的谓词连接表。
要连接缺少直接外键关系的表,请遵循以下步骤:
CROSS JOIN
或 INNER JOIN
运算符组合表。WHERE
子句添加其他条件以筛选已连接的数据。语句和表:
每个表都有一个谓词来定义它包含的行。例如,Species
表包含这样的行:物种名称对应其木材类型和最大高度。
查询谓词:
查询也根据 FROM
、WHERE
和其他子句具有谓词。表别名允许重命名列并促进连接条件。
连接表:
CROSS JOIN
和 INNER JOIN
使用 AND
组合谓词。UNION
使用 OR
,而 EXCEPT
使用 AND NOT
组合谓词。ON
和 WHERE
子句可用于指定其他连接条件。
选择表:
要选择正确的表,请考虑所需的输出并确定包含必要列的表。根据它们共享的谓词连接它们。
外键和查询:
外键不影响查询执行。它们强制执行完整性约束,但不限制连接。查询根据表谓词进行评估。
示例查询:
要提取“ARCTIC”区域森林的森林名称、物种名称和木材类型:
<code class="language-sql">SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype FROM Forest INNER JOIN Tree ON Forest.Fo_name = Tree.Tr_forest INNER JOIN Species ON Tree.Tr_species = Species.Sp_name WHERE Forest.Fo_loc='ARCTIC' ORDER BY Forest.Fo_name, Species.Sp_name;</code>
此查询通过 Tr_species
和 Tr_forest
列有效地连接了 Forest
、Species
和 Tree
表,并根据 Fo_loc
列筛选结果。输出按森林和物种名称排序。
注意:示例查询已根据描述进行了修正,以确保逻辑正确性并能够连接三个表。 原始示例中 ON Tree.Tr_species=Tree.Tr_forest
条件是错误的,因为它试图在一个表内连接两个不同的列。 修正后的查询使用了正确的连接条件。
以上是如何在没有直接外键关系的情况下连接表?的详细内容。更多信息请关注PHP中文网其他相关文章!