この記事では、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()
を使用しました 所有者の名前と名前を連結する機能。