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 | 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.
Ú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í
PetOwnerneníNULL(jako posledníPetNameje), 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.