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

SQL左結合

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

    LEFT JOIN 、またはLEFT OUTER JOIN 、左側のテーブル(JOINの左側)にデータがある行を返します キーワード)、右側のテーブルに一致する行がない場合でも。

    構文

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

    LEFT JOINを使用する 構文:

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

    LEFT OUTER JOINの使用 構文:

    SELECT *
    FROM Table1 LEFT 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 PetTypes pt
    LEFT 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)

    左結合により、PetTypeが取得されます PetNameに対応しない値 。ペットとしてのウサギはいない。しかし、左結合はRabbitを引き起こします Petsにペットがいない場合でも、返送されます そのタイプのテーブル。これにより、NULLになります PetNameの値 Rabbitに対する列 。

    これは、Rabbitが原因でのみ発生しました 左側のテーブル(つまり、LEFT JOINの左側)にありました キーワード)。 OK、私のフォーマットはそれを「左」よりも「上」にしますが、あなたは絵を手に入れます。

    クエリでテーブルの順序を切り替えると、次のようになります。

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

    結果:

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

    今回はRabbits 返されませんでした。これは、そのテーブル(PetTypes )は結合の右側にありました。

    Rabbitsが必要な場合は、右結合または完全結合に変更する必要があります。 このテーブル順序を使用して返されます。

    3つのテーブルの左結合

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

    SELECT 
        p.PetName,
        pt.PetType,
        CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
    FROM Owners o LEFT JOIN Pets p
        ON p.OwnerId = o.OwnerId
    LEFT 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 |
    +-----------+-----------+----------------+
    (9 rows affected)

    今回はペットを飼っていない飼い主がいます。

    もう一度テーブルの順序を入れ替えると、別の結果が得られます。

    SELECT 
        p.PetName,
        pt.PetType,
        CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
    FROM PetTypes pt LEFT JOIN Pets p
        ON p.PetTypeId = pt.PetTypeId
    LEFT 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    |               |
    +-----------+-----------+---------------+
    (9 rows affected)
    >

    今回は追加のペットタイプ(Rabbit )、ただし追加の所有者ではありません。

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


    1. xmlノードから値をクエリする方法は?

    2. SQLite JSON_EXTRACT()

    3. SQL Server(T-SQL)の日付から週番号を抽出する

    4. MySQL LOG()関数–値の自然対数を返します