この記事では、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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | +-----------+-------------+------------+----------------+-------------------+
注:
-
PetTypeIdPetsの列 テーブルはPetTypeIdの外部キーですPetTypesの テーブル(そのテーブルの主キーです)。 -
OwnerIdPetsの列 テーブルは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()を使用しました 所有者の名前と名前を連結する機能。