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 | 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 | +-----------+-------------+------------+----------------+-------------------+
Všimněte si, že:
PetTypeIdve sloupciPetstabulka je cizí klíčPetTypeIdzPetTypestabulka (což je primární klíč této tabulky).OwnerIdve sloupciPetstabulka je cizí klíčOwnerIdve sloupciOwnersstů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.