Tento článek poskytuje přehled přirozeného spojení v SQL a také několik základních příkladů.
Co je to přirozené spojení?
Přirozené spojení SQL je typ ekvi-spojení, které implicitně kombinuje tabulky založené na sloupcích se stejným názvem a typem. Predikát spojení vzniká implicitně porovnáním všech sloupců v obou tabulkách, které mají ve spojených tabulkách stejné názvy sloupců.
Sada výsledků obsahuje pouze jeden sloupec pro každou dvojici stejně pojmenovaných sloupců. Pokud nebudou nalezeny žádné sloupce se stejnými názvy, výsledkem bude křížové spojení.
Syntaxe
Přirozené spojení lze použít na jakýkoli INNER
, LEFT
, RIGHT
, nebo FULL
připojit. Jednoduše před typ spojení přidáte NATURAL
klíčové slovo.
Příklad syntaxe použité pro vnitřní spojení:
SELECT *
FROM Table1 NATURAL INNER JOIN Table2
ON Table1.Column = Table2.Column;
Vidíte jako INNER
je výchozí hodnota, můžete to udělat také takto:
SELECT *
FROM Table1 NATURAL JOIN Table2
ON Table1.Column = Table2.Column;
NATURAL
klíčové slovo umístí implicitní USING
klauzule k omezením spojení. Tvoří USING
seznam obsahující všechny názvy sloupců, které se objevují v obou vstupních tabulkách. To samozřejmě platí pouze pro DBMS, které podporují USING
doložka.
Ne všechny DBMS podporují přirozená spojení, takže se podívejte do dokumentace vašeho DBMS.
Když píšu toto, přirozené spojení jsou podporovány v PostgreSQL, MySQL, MariaDB, SQLite a Oracle. Přirozená spojení však nejsou podporována v SQL Server (2019).
Příklady
Zde je několik příkladů k demonstraci.
Ukázková data
Za prvé, zde jsou tabulky, které použijeme pro příklady.
PetTypes
tabulka:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabulka:
+---------+-------------+-----------+-----------+------------+ | 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
tabulka:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Všimněte si, že:
PetTypeId
ve sloupciPets
tabulka je cizí klíčPetTypeId
zPetTypes
tabulka (což je primární klíč této tabulky).OwnerId
ve sloupciPets
tabulka je cizí klíčOwnerId
ve sloupciOwners
stůl.
Příklad 1 – Přirozené vnitřní spojení
Zde je příklad provedení přirozeného vnitřního spojení proti dvěma z těchto tabulek.
SELECT
PetName,
PetType
FROM Pets
NATURAL JOIN PetTypes;
Výsledek:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat (8 rows)
V tomto příkladu přirozené spojení implicitně spojilo tabulky na dvou PetTypeId
(tj. Pets.PetTypeId
a PetTypes.PetTypeId
sloupec).
Toto je implicitní způsob, jak provést následující:
SELECT
PetName,
PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);
Což ve skutečnosti dělá následující.
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Příklad 2 – Přirozené správné spojení
Zde je příklad provedení přirozeného pravého spojení proti dvěma z těchto tabulek. Tentokrát musíme určit typ spojení, protože nechceme (výchozí) vnitřní spojení.
SELECT
p.PetName,
pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;
Výsledek:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat | Rabbit (9 rows)
V tomto případě je to stejné jako následující:
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Příklad 3 – Přirozené úplné spojení na 3 stolech
Zde je příklad provedení přirozeného úplného spojení na všech třech stolech.
SELECT
PetName,
PetType,
CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;
Výsledek:
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)
Tentokrát máme majitele domácího mazlíčka, který nemá domácího mazlíčka, a také typ zvířete, který není přiřazen k domácímu mazlíčkovi.
Příklad 4 – Použití hvězdičky (*
) Zástupný znak
Zde je příklad, který používá zástupný znak hvězdičky (*) k výběru všech sloupců.
SELECT *
FROM Pets
NATURAL JOIN PetTypes;
Výsledek:
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)
Všimněte si, že pettypeid
sloupec je vrácen pouze jednou, i když existují dva sloupce s tímto názvem (jeden v každé tabulce). Takto se přirozená spojení zabývají sloupci stejného jména napříč tabulkami.