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 | [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.
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.