この記事では、SQLの自然結合の概要と、いくつかの基本的な例について説明します。
ナチュラルジョインとは何ですか?
SQL自然結合は、同じ名前とタイプの列に基づいてテーブルを暗黙的に結合する一種の等結合です。結合述部は、結合されたテーブルで同じ列名を持つ両方のテーブルのすべての列を比較することによって暗黙的に発生します。
結果セットには、同じ名前の列のペアごとに1つの列のみが含まれます。同じ名前の列が見つからない場合、結果は相互結合になります。
構文
自然結合は、任意のINNER
に適用できます。 、LEFT
、RIGHT
、またはFULL
加入。結合タイプの前にNATURAL
を付けるだけです。 キーワード。
内部結合で使用される構文の例:
SELECT *
FROM Table1 NATURAL INNER JOIN Table2
ON Table1.Column = Table2.Column;
INNER
として表示 はデフォルト値ですが、次のようにすることもできます:
SELECT *
FROM Table1 NATURAL JOIN Table2
ON Table1.Column = Table2.Column;
NATURAL
キーワードは暗黙のUSING
を配置します 結合制約の節。 USING
を形成します 両方の入力テーブルに表示されるすべての列名で構成されるリスト。これは明らかに、USING
をサポートするDBMSにのみ適用されます。 条項。
すべてのDBMSが自然結合をサポートしているわけではないため、DBMSのドキュメントを確認してください。
私がこれを書いているとき、自然結合はPostgreSQL、MySQL、MariaDB、SQLite、およびOracleでサポートされています。ただし、SQL Server(2019)では自然結合はサポートされていません。
例
実例をいくつか示します。
サンプルデータ
まず、例に使用する表を次に示します。
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
の列 テーブル。
例1-自然な内部結合
これらのテーブルのうちの2つに対して自然な内部結合を実行する例を次に示します。
SELECT
PetName,
PetType
FROM Pets
NATURAL JOIN PetTypes;
結果:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat (8 rows)
この例では、自然結合は2つのPetTypeId
のテーブルを暗黙的に結合しました 列(つまり、Pets.PetTypeId
列、およびPetTypes.PetTypeId
列)。
これは、次のことを行う暗黙の方法です。
SELECT
PetName,
PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);
これは実際に次のことを行います。
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
例2–自然な右結合
これらのテーブルのうちの2つに対して自然な右結合を実行する例を次に示します。今回は、(デフォルトの)内部結合が不要なため、結合タイプを指定する必要があります。
SELECT
p.PetName,
pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;
結果:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat | Rabbit (9 rows)
この場合、次のことを行うのと同じです。
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
例3–3つのテーブルでの自然な完全結合
これは、3つのテーブルすべてで自然な完全結合を実行する例です。
SELECT
PetName,
PetType,
CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;
結果:
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 | | Woody Eastwood | Rabbit | (10 rows)
今回は、ペットを飼っていないペットの飼い主と、ペットに割り当てられていないペットの種類があります。
例4–アスタリスクの使用(*
)ワイルドカード文字
アスタリスク(*)ワイルドカード文字を使用してすべての列を選択する例を次に示します。
SELECT *
FROM Pets
NATURAL JOIN PetTypes;
結果:
pettypeid | petid | ownerid | petname | dob | pettype -----------+-------+---------+---------+------------+--------- 2 | 1 | 3 | Fluffy | 2020-11-20 | Cat 3 | 2 | 3 | Fetch | 2019-08-16 | Dog 2 | 3 | 2 | Scratch | 2018-10-01 | Cat 3 | 4 | 3 | Wag | 2020-03-15 | Dog 1 | 5 | 1 | Tweet | 2020-11-28 | Bird 3 | 6 | 4 | Fluffy | 2020-09-17 | Dog 3 | 7 | 2 | Bark | | Dog 2 | 8 | 4 | Meow | | Cat (8 rows)
pettypeid
に注意してください その名前の列が2つ(各テーブルに1つ)ある場合でも、columnは1回だけ返されます。これは、自然結合がテーブル間で同じ名前の列を処理する方法です。