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

SQL完全結合

    この記事では、FULL JOINの概要を説明します SQL、およびいくつかの基本的な例。

    SQL FULL JOIN (またはFULL OUTER JOIN )いずれかのテーブルに一致するデータがある限り、すべての行を返します。

    これは、左右両方を1つの結合に結合するようなものです。

    構文

    FROMで完全結合を指定します 句。 FULL JOINのいずれかを使用できます またはFULL OUTER JOIN 構文。

    FULL JOINを使用する 構文:

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

    FULL OUTER JOINを使用する 構文:

    SELECT *
    FROM Table1 FULL OUTER JOIN Table2 
    ON Table1.Column = Table2.Column;

    これらは両方ともまったく同じことをします。 OUTER キーワードはオプションです。

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

    サンプルデータ

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

    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の列 テーブル。

    完全結合クエリ

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

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

    結果:

    +-----------+-----------+
    | PetName   | PetType   |
    |-----------+-----------|
    | Tweet     | Bird      |
    | Fluffy    | Cat       |
    | Scratch   | Cat       |
    | Meow      | Cat       |
    | Fetch     | Dog       |
    | Wag       | Dog       |
    | Fluffy    | Dog       |
    | Bark      | Dog       |
    | NULL      | Rabbit    |
    +-----------+-----------+
    (9 rows affected)

    この例では、PetTypeを取得します PetNameに対応しない値 。ペットとしてのうさぎがいないからです。ただし、完全に結合するとRabbitが発生します Petsにペットがいない場合でも、返送されます そのタイプのテーブル。これにより、NULLになります PetNameの値 Rabbitに対する列 。

    これは、PetTypesが原因で、右結合を使用した場合に得られる結果と同じです。 表はJOINの右側にあります キーワード。 PetTypesであるため、これは左結合では発生しませんでした。 テーブルはJOINの左側にありません キーワード。左結合で再作成する場合は、テーブルの順序を切り替えて、PetTypesを作成する必要があります。 テーブルはJOINの左側にありました キーワード。

    完全結合を使用しているときにクエリでテーブルの順序を切り替えると、次のようになります。

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

    結果:

    +-----------+-----------+
    | PetName   | PetType   |
    |-----------+-----------|
    | Tweet     | Bird      |
    | Fluffy    | Cat       |
    | Scratch   | Cat       |
    | Meow      | Cat       |
    | Fetch     | Dog       |
    | Wag       | Dog       |
    | Fluffy    | Dog       |
    | Bark      | Dog       |
    | NULL      | Rabbit    |
    +-----------+-----------+
    (9 rows affected)

    まったく同じ結果が得られます。これは、テーブルの1つに一致するデータがある限り、完全結合がすべての行を返すためです。前述のように、これは1つの結合で左右の結合を行うようなものです。

    3つのテーブルでの完全結合

    3つのテーブルすべてで完全結合を実行する例を次に示します。

    SELECT 
        p.PetName,
        pt.PetType,
        CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
    FROM Owners o FULL JOIN Pets p
        ON p.OwnerId = o.OwnerId
    FULL JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId;

    結果:

    +-----------+-----------+----------------+
    | PetName   | PetType   | PetOwner       |
    |-----------+-----------+----------------|
    | Tweet     | Bird      | Homer Connery  |
    | Scratch   | Cat       | Bart Pitt      |
    | Bark      | Dog       | Bart Pitt      |
    | Fluffy    | Cat       | Nancy Simpson  |
    | Fetch     | Dog       | Nancy Simpson  |
    | Wag       | Dog       | Nancy Simpson  |
    | Fluffy    | Dog       | Boris Trump    |
    | Meow      | Cat       | Boris Trump    |
    | NULL      | NULL      | Woody Eastwood |
    | NULL      | Rabbit    |                |
    +-----------+-----------+----------------+
    (10 rows affected)

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

    テーブルの順序を入れ替えると、行は異なる順序でリストされますが、同じ結果が得られます。

    SELECT 
        p.PetName,
        pt.PetType,
        CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
    FROM PetTypes pt FULL JOIN Pets p
        ON p.PetTypeId = pt.PetTypeId
    FULL JOIN Owners o 
        ON p.OwnerId = o.OwnerId;

    結果:

    -----------+-----------+----------------+
    | PetName   | PetType   | PetOwner       |
    |-----------+-----------+----------------|
    | Tweet     | Bird      | Homer Connery  |
    | Fluffy    | Cat       | Nancy Simpson  |
    | Scratch   | Cat       | Bart Pitt      |
    | Meow      | Cat       | Boris Trump    |
    | Fetch     | Dog       | Nancy Simpson  |
    | Wag       | Dog       | Nancy Simpson  |
    | Fluffy    | Dog       | Boris Trump    |
    | Bark      | Dog       | Bart Pitt      |
    | NULL      | Rabbit    |                |
    | NULL      | NULL      | Woody Eastwood |
    +-----------+-----------+----------------+
    (10 rows affected)

    そして、もう一度シャッフルしても、同じ結果が得られます。

    SELECT 
        p.PetName,
        pt.PetType,
        CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
    FROM Pets p FULL JOIN Owners o
        ON p.OwnerId = o.OwnerId
    FULL JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId;

    結果:

    +-----------+-----------+----------------+
    | 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    |
    | NULL      | NULL      | Woody Eastwood |
    | NULL      | Rabbit    |                |
    +-----------+-----------+----------------+
    (10 rows affected)

    最後のPetOwnerがなぜか疑問に思っている場合 NULLではありません (最後のようにPetName is)、それは文字列の連結の結果だからです。 T-SQLのCONCAT()を使用しました 所有者の名前と名前を連結する機能。


    1. MySQLホスティングを使用してZEITにWordPress5をインストールする

    2. OFFSET / FETCHによるページネーション:より良い方法

    3. Oracleで1か月の日数を取得する2つの方法

    4. XMLAを取得してキューブ構造を分析する