Tento článek poskytuje přehled FULL JOIN
v SQL a také některé základní příklady.
SQL FULL JOIN
(nebo FULL OUTER JOIN
) vrátí všechny řádky, pokud jsou v jedné z tabulek odpovídající data.
Je to jako mít oba spojení zleva doprava do jednoho spojení.
Syntaxe
Úplné spojení určíte v FROM
doložka. Můžete použít buď FULL JOIN
nebo FULL OUTER JOIN
syntaxe.
Pomocí FULL JOIN
syntaxe:
SELECT *
FROM Table1 FULL JOIN Table2
ON Table1.Column = Table2.Column;
Pomocí FULL OUTER JOIN
syntaxe:
SELECT *
FROM Table1 FULL OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Oba dělají přesně to samé. Jde jen o to, že OUTER
klíčové slovo je nepovinné.
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 | Pták || 2 | Kočka || 3 | Pes || 4 | Králík |+-------------+-----------+ (dotčené 4 řádky)
Pets
tabulka:
+---------+-------------+-----------+---------- -+-------------+| PetId | PetTypeId | OwnerId | Jméno mazlíčka | DOB ||---------+-------------+-----------+------------ +------------|| 1 | 2 | 3 | Načechraný | 2020-11-20 || 2 | 3 | 3 | Načíst | 2019-08-16 || 3 | 2 | 2 | Škrábnout | 2018-10-01 || 4 | 3 | 3 | Wag | 2020-03-15 || 5 | 1 | 1 | Tweet | 2020-11-28 || 6 | 3 | 4 | Načechraný | 2020-09-17 || 7 | 3 | 2 | Kůra | NULL || 8 | 2 | 4 | Mňau | NULL |+---------+-------------+-----------+----------- +------------+(8 řádků ovlivněno)
Owners
tabulka:
+-----------+-------------+------------+------- ---------+-------------------+| OwnerId | Jméno | Příjmení | Telefon | E-mail ||-----------+-------------+------------+--------- --------+-------------------|| 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.
Úplný dotaz na připojení
Zde je příklad provedení úplného spojení proti dvěma z těchto tabulek.
SELECT
p.PetName,
pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+| Jméno mazlíčka | PetType ||-----------+-----------|| Tweet | Pták || Načechraný | Kočka || Škrábnout | Kočka || Mňau | Kočka || Načíst | Pes || Wag | Pes || Načechraný | Pes || Kůra | Pes || NULL | Králík |+-----------+-----------+ (dotčených 9 řádků)
V tomto příkladu dostaneme PetType
hodnota, která neodpovídá PetName
. Je to proto, že nejsou žádní králíci jako domácí mazlíčci. Ale úplné spojení způsobí Rabbit
být vrácen, i když v Pets
není žádné zvíře stůl tohoto typu. Výsledkem je NULL
hodnotu v PetName
sloupec proti Rabbit
.
To je stejný výsledek, jaký bychom dostali, kdybychom použili správné spojení, protože PetTypes
tabulka je napravo od JOIN
klíčové slovo. To by se s levým spojením nestalo, protože PetTypes
tabulka není vlevo od JOIN
klíčové slovo. Pokud bychom jej chtěli znovu vytvořit s levým spojením, museli bychom změnit pořadí tabulek tak, aby PetTypes
tabulka byla nalevo od JOIN
klíčové slovo.
Zde je to, co se stane, když změníme pořadí tabulky v našem dotazu při použití úplného spojení.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Výsledek:
+-----------+-----------+| Jméno mazlíčka | PetType ||-----------+-----------|| Tweet | Pták || Načechraný | Kočka || Škrábnout | Kočka || Mňau | Kočka || Načíst | Pes || Wag | Pes || Načechraný | Pes || Kůra | Pes || NULL | Králík |+-----------+-----------+ (dotčených 9 řádků)
Dostaneme úplně stejný výsledek. Je to proto, že úplné spojení vrátí všechny řádky, pokud jsou v jedné z tabulek odpovídající data. Jak již bylo zmíněno, je to jako mít levé a pravé spojení v jednom spojení.
Úplné připojení u 3 stolů
Zde je příklad provedení úplného spojení na všech třech stolech.
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;
Výsledek:
+-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Pták | Homer Connery || Škrábnout | Kočka | Bart Pitt || Kůra | Pes | Bart Pitt || Načechraný | Kočka | Nancy Simpson || Načíst | Pes | Nancy Simpson || Wag | Pes | Nancy Simpson || Načechraný | Pes | Boris Trump || Mňau | Kočka | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Králík | |+-----------+-----------+----------------+(10 dotčených řádků)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.
Pokud zamícháme pořadí tabulek, dostaneme stejný výsledek, i když řádky jsou uvedeny v jiném pořadí.
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;
Výsledek:
-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Pták | Homer Connery || Načechraný | Kočka | Nancy Simpson || Škrábnout | Kočka | Bart Pitt || Mňau | Kočka | Boris Trump || Načíst | Pes | Nancy Simpson || Wag | Pes | Nancy Simpson || Načechraný | Pes | Boris Trump || Kůra | Pes | Bart Pitt || NULL | Králík | || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(10 dotčených řádků)A pokud je ještě jednou zamícháme, dostaneme stále stejný výsledek.
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;
Výsledek:
+-----------+-----------+----------------+| Jméno mazlíčka | PetType | PetOwner ||-----------+-----------+----------------|| Načechraný | Kočka | Nancy Simpson || Načíst | Pes | Nancy Simpson || Škrábnout | Kočka | Bart Pitt || Wag | Pes | Nancy Simpson || Tweet | Pták | Homer Connery || Načechraný | Pes | Boris Trump || Kůra | Pes | Bart Pitt || Mňau | Kočka | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Králík | |+-----------+-----------+----------------+(10 dotčených řádků)Pokud vás zajímá, proč poslední
PetOwner
neníNULL
(jako posledníPetName
je), je to proto, že je výsledkem zřetězení řetězců. Použil jsem T-SQLCONCAT()
funkce ke zřetězení jména a příjmení vlastníka.