ホームページ >データベース >mysql チュートリアル >直接の外部キー関係を持たずにテーブルを結合するにはどうすればよいですか?
データは多くの場合、外部キーによって関係が定義された複数のテーブルに保存されます。ただし、2 つのテーブルに直接の外部キー関係がない場合でも、3 番目のテーブルを介して結合できる場合があります。この質問では、このような結合を実行して複数のテーブルから特定の情報を抽出する方法を示します。
テーブル結合には外部キーが必要であるという想定に反して、外部キーは必要ありません。代わりに、テーブルごとに定義された述語に基づいてテーブルを結合できます。
直接の外部キー関係がないテーブルを結合するには、次の手順に従います:
CROSS JOIN
または INNER JOIN
演算子を使用してテーブルを結合します。 WHERE
句を使用して、接続されたデータをフィルタリングするための追加の条件を追加します。 ステートメントとテーブル:
各テーブルには、テーブルに含まれる行を定義する述語があります。たとえば、Species
テーブルには、種名が木の種類と最大高さに対応する行が含まれています。
クエリ述語:
クエリには、FROM
、WHERE
およびその他の句に基づく述語もあります。テーブルのエイリアスを使用すると、列の名前を変更でき、結合条件が容易になります。
結合テーブル:
CROSS JOIN
と INNER JOIN
は AND
を使用して述語を結合します。 UNION
は OR
を使用し、EXCEPT
は AND NOT
を使用して述語を結合します。 ON
句と WHERE
句を使用して、追加の結合条件を指定できます。
選択テーブル:
適切なテーブルを選択するには、目的の出力を検討し、必要な列を含むテーブルを特定します。共有する述語に基づいてそれらを結合します。
外部キーとクエリ:
外部キーはクエリの実行には影響しません。整合性制約は強制されますが、接続は制限されません。クエリはテーブル述語に対して評価されます。
クエリの例:
「北極」地域森林の森林名、種名、木材の種類を抽出するには:
<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
列に基づいて結果をフィルタリングします。出力は森林と種の名前で並べ替えられます。
注: 論理的な正確性を確保し、3 つのテーブルを結合できるようにするために、クエリ例は説明から修正されています。 元の例の ON Tree.Tr_species=Tree.Tr_forest
条件は、テーブル内の 2 つの異なる列を結合しようとしているため、間違っています。 修正されたクエリでは、正しい結合条件が使用されます。
以上が直接の外部キー関係を持たずにテーブルを結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。