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

SQL右結合

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

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

    構文

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

    RIGHT JOINを使用する 構文:

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

    RIGHT OUTER JOINを使用する 構文:

    SELECT *
    FROM Table1 RIGHT 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
    RIGHT 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に対する列 。

    これは、Rabbitが原因でのみ発生しました 右側のテーブル(つまり、RIGHT JOINの右側)にありました キーワード)。

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

    SELECT 
        p.PetName,
        pt.PetType
    FROM PetTypes pt
    RIGHT JOIN Pets p
    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 Pets p RIGHT JOIN PetTypes pt 
        ON p.PetTypeId = pt.PetTypeId
    RIGHT JOIN Owners o 
        ON p.OwnerId = o.OwnerId;

    結果:

    +-----------+-----------+----------------+
    | 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 Pets p RIGHT JOIN Owners o 
        ON p.OwnerId = o.OwnerId
    RIGHT JOIN PetTypes pt 
        ON p.PetTypeId = pt.PetTypeId;

    結果:

    +-----------+-----------+---------------+
    | 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. JDBCResultSetgetDateは精度を失います

    2. Postgresドロップテーブルの構文エラー

    3. SQL Serverデータベーステーブルにデータテーブルを挿入するにはどうすればよいですか?

    4. MariaDBでのADDDATE()のしくみ