Tento článek poskytuje přehled LEFT JOIN v SQL a také některé základní příklady.
LEFT JOIN , nebo LEFT OUTER JOIN , vrátí řádky, které obsahují data v levé tabulce (vlevo od JOIN klíčové slovo), i když v pravé tabulce nejsou žádné odpovídající řádky.
Syntaxe
Levé spojení určíte v FROM doložka. Můžete použít buď LEFT JOIN nebo LEFT OUTER JOIN syntaxe.
Pomocí LEFT JOIN syntaxe:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Pomocí LEFT OUTER JOIN syntaxe:
SELECT *
FROM Table1 LEFT 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 | 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.
Dotaz na levé připojení
Zde je příklad provedení levého spojení proti dvěma z těchto tabulek.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId; Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Levé spojení způsobí, že dostaneme PetType hodnota, která neodpovídá PetName . Nejsou žádní králíci jako domácí mazlíčci. Ale levé 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 .
Stalo se to jen proto, že Rabbit byl v levé tabulce (tj. vlevo od LEFT JOIN klíčová slova). OK, moje formátování to dělá více „nahoře“ než „vlevo“, ale máte obrázek.
Co se stane, když v našem dotazu změníme pořadí tabulky.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId; Výsledek:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Tentokrát Rabbits nebyl vrácen. Je to proto, že jeho tabulka (PetTypes ) byl na pravé straně spojení.
Pokud bychom chtěli Rabbits, museli bychom to změnit na pravé spojení nebo úplné spojení které mají být vráceny pomocí této tabulky.
Připojení vlevo u 3 stolů
Zde je příklad provedení levého spojení na všech třech stolech.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId; Výsledek:
+-----------+-----------+----------------+ | PetName | PetType | PetOwner | |-----------+-----------+----------------| | Tweet | Bird | Homer Connery | | Scratch | Cat | Bart Pitt | | Bark | Dog | Bart Pitt | | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Meow | Cat | Boris Trump | | NULL | NULL | Woody Eastwood | +-----------+-----------+----------------+ (9 rows affected)
Tentokrát máme majitele domácího mazlíčka, který žádné zvíře nemá.
Mohli bychom znovu zamíchat pořadím stolů a dostali bychom jiný výsledek.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM PetTypes pt LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId
LEFT JOIN Owners o
ON p.OwnerId = o.OwnerId; Výsledek:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Tweet | Bird | Homer Connery | | Fluffy | Cat | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Meow | Cat | Boris Trump | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | NULL | Rabbit | | +-----------+-----------+---------------+ (9 rows affected)
Tentokrát jsme dostali extra typ domácího mazlíčka (Rabbit ), ale ne další vlastník.
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-SQL CONCAT() funkce ke zřetězení jména a příjmení vlastníka.