sql >> データベース >  >> RDS >> Database

SQL自然結合

    この記事では、SQLの自然結合の概要と、いくつかの基本的な例について説明します。

    ナチュラルジョインとは何ですか?

    SQL自然結合は、同じ名前とタイプの列に基づいてテーブルを暗黙的に結合する一種の等結合です。結合述部は、結合されたテーブルで同じ列名を持つ両方のテーブルのすべての列を比較することによって暗黙的に発生します。

    結果セットには、同じ名前の列のペアごとに1つの列のみが含まれます。同じ名前の列が見つからない場合、結果は相互結合になります。

    構文

    自然結合は、任意のINNERに適用できます。 、LEFTRIGHT 、またはFULL 加入。結合タイプの前にNATURALを付けるだけです。 キーワード。

    内部結合で使用される構文の例:

    SELECT *
    FROM Table1 NATURAL INNER JOIN Table2 
    ON Table1.Column = Table2.Column;

    INNERとして表示 はデフォルト値ですが、次のようにすることもできます:

    SELECT *
    FROM Table1 NATURAL JOIN Table2 
    ON Table1.Column = Table2.Column;

    NATURAL キーワードは暗黙のUSINGを配置します 結合制約の節。 USINGを形成します 両方の入力テーブルに表示されるすべての列名で構成されるリスト。これは明らかに、USINGをサポートするDBMSにのみ適用されます。 条項。

    すべてのDBMSが自然結合をサポートしているわけではないため、DBMSのドキュメントを確認してください。

    私がこれを書いているとき、自然結合はPostgreSQL、MySQL、MariaDB、SQLite、およびOracleでサポートされています。ただし、SQL Server(2019)では自然結合はサポートされていません。

    実例をいくつか示します。

    サンプルデータ

    まず、例に使用する表を次に示します。

    PetTypes テーブル:

    +-------------+-----------+
    | PetTypeId   | PetType   |
    |-------------+-----------|
    | 1           | Bird      |
    | 2           | Cat       |
    | 3           | Dog       |
    | 4           | Rabbit    |
    +-------------+-----------+
    (4 rows affected)

    Pets テーブル:

    +---------+-------------+-----------+-----------+------------+
    | PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
    |---------+-------------+-----------+-----------+------------|
    | 1       | 2           | 3         | Fluffy    | 2020-11-20 |
    | 2       | 3           | 3         | Fetch     | 2019-08-16 |
    | 3       | 2           | 2         | Scratch   | 2018-10-01 |
    | 4       | 3           | 3         | Wag       | 2020-03-15 |
    | 5       | 1           | 1         | Tweet     | 2020-11-28 |
    | 6       | 3           | 4         | Fluffy    | 2020-09-17 |
    | 7       | 3           | 2         | Bark      | NULL       |
    | 8       | 2           | 4         | Meow      | NULL       |
    +---------+-------------+-----------+-----------+------------+
    (8 rows affected)

    Owners テーブル:

    +-----------+-------------+------------+----------------+-------------------+
    | OwnerId   | FirstName   | LastName   | Phone          | Email             |
    |-----------+-------------+------------+----------------+-------------------|
    | 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
    | 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
    | 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
    | 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
    | 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
    +-----------+-------------+------------+----------------+-------------------+

    注:

    • PetTypeId Petsの列 テーブルはPetTypeIdの外部キーです PetTypesの テーブル(そのテーブルの主キーです)。
    • OwnerId Petsの列 テーブルはOwnerIdの外部キーです Ownersの列 テーブル。

    例1-自然な内部結合

    これらのテーブルのうちの2つに対して自然な内部結合を実行する例を次に示します。

    SELECT 
        PetName,
        PetType
    FROM Pets
    NATURAL JOIN PetTypes;

    結果:

     petname | pettype 
    ---------+---------
     Fluffy  | Cat
     Fetch   | Dog
     Scratch | Cat
     Wag     | Dog
     Tweet   | Bird
     Fluffy  | Dog
     Bark    | Dog
     Meow    | Cat
    (8 rows)

    この例では、自然結合は2つのPetTypeIdのテーブルを暗黙的に結合しました 列(つまり、Pets.PetTypeId 列、およびPetTypes.PetTypeId 列)。

    これは、次のことを行う暗黙の方法です。

    SELECT 
        PetName,
        PetType
    FROM Pets
    INNER JOIN PetTypes USING (PetTypeId);

    これは実際に次のことを行います。

    SELECT 
        p.PetName,
        pt.PetType
    FROM Pets p
    INNER JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

    例2–自然な右結合

    これらのテーブルのうちの2つに対して自然な右結合を実行する例を次に示します。今回は、(デフォルトの)内部結合が不要なため、結合タイプを指定する必要があります。

    SELECT 
        p.PetName,
        pt.PetType
    FROM Pets p
    NATURAL RIGHT JOIN PetTypes pt;

    結果:

     petname | pettype 
    ---------+---------
     Fluffy  | Cat
     Fetch   | Dog
     Scratch | Cat
     Wag     | Dog
     Tweet   | Bird
     Fluffy  | Dog
     Bark    | Dog
     Meow    | Cat
             | Rabbit
    (9 rows)

    この場合、次のことを行うのと同じです。

    SELECT 
        p.PetName,
        pt.PetType
    FROM Pets p
    RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId;

    例3–3つのテーブルでの自然な完全結合

    これは、3つのテーブルすべてで自然な完全結合を実行する例です。

    SELECT 
        PetName,
        PetType,
        CONCAT(FirstName, ' ', LastName) AS PetOwner
    FROM Owners NATURAL FULL JOIN Pets
    NATURAL FULL JOIN PetTypes;

    結果:

     petname | pettype |    petowner    
    ---------+---------+----------------
     Fluffy  | Cat     | Nancy Simpson
     Fetch   | Dog     | Nancy Simpson
     Scratch | Cat     | Bart Pitt
     Wag     | Dog     | Nancy Simpson
     Tweet   | Bird    | Homer Connery
     Fluffy  | Dog     | Boris Trump
     Bark    | Dog     | Bart Pitt
     Meow    | Cat     | Boris Trump
             |         | Woody Eastwood
             | Rabbit  |  
    (10 rows)

    今回は、ペットを飼っていないペットの飼い主と、ペットに割り当てられていないペットの種類があります。

    例4–アスタリスクの使用(* )ワイルドカード文字

    アスタリスク(*)ワイルドカード文字を使用してすべての列を選択する例を次に示します。

    SELECT *
    FROM Pets
    NATURAL JOIN PetTypes;

    結果:

     pettypeid | petid | ownerid | petname |    dob     | pettype 
    -----------+-------+---------+---------+------------+---------
             2 |     1 |       3 | Fluffy  | 2020-11-20 | Cat
             3 |     2 |       3 | Fetch   | 2019-08-16 | Dog
             2 |     3 |       2 | Scratch | 2018-10-01 | Cat
             3 |     4 |       3 | Wag     | 2020-03-15 | Dog
             1 |     5 |       1 | Tweet   | 2020-11-28 | Bird
             3 |     6 |       4 | Fluffy  | 2020-09-17 | Dog
             3 |     7 |       2 | Bark    |            | Dog
             2 |     8 |       4 | Meow    |            | Cat
    (8 rows)

    pettypeidに注意してください その名前の列が2つ(各テーブルに1つ)ある場合でも、columnは1回だけ返されます。これは、自然結合がテーブル間で同じ名前の列を処理する方法です。


    1. データファイルとStatisticaのマージ、パート1

    2. MySQLで過去1時間のデータを取得する方法

    3. クラウドフォーメーションテンプレートを使用して、RDSでMySQLインスタンスを起動します

    4. シーケンス値を1にリセット