Denne artikel giver et overblik over LEFT JOIN
i SQL, samt nogle grundlæggende eksempler.
LEFT JOIN
, eller LEFT OUTER JOIN
, returnerer rækker, der har data i den venstre tabel (til venstre for JOIN
søgeord), selvom der ikke er nogen matchende rækker i den højre tabel.
Syntaks
Du angiver en venstre joinforbindelse i FROM
klausul. Du kan bruge enten LEFT JOIN
eller LEFT OUTER JOIN
syntaks.
Brug af LEFT JOIN
syntaks:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Brug af LEFT OUTER JOIN
syntaks:
SELECT *
FROM Table1 LEFT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Begge disse gør nøjagtig det samme. Det er bare, at OUTER
søgeord er valgfrit.
Eksempler
Her er nogle eksempler til demonstration.
Eksempel på data
For det første er her de tabeller, vi skal bruge til eksemplerne.
PetTypes
tabel:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabel:
+---------+-------------+-----------+-----------+------------+ | 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
tabel:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Bemærk at:
PetTypeId
kolonne iPets
tabel er en fremmednøgle tilPetTypeId
afPetTypes
tabel (som er den primære nøgle til den pågældende tabel).OwnerId
kolonne iPets
tabel er en fremmednøgle tilOwnerId
kolonne iOwners
tabel.
Den venstre deltagelsesforespørgsel
Her er et eksempel på at udføre en venstre join mod to af disse borde.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Venstre joinforbindelse får os til at få en PetType
værdi, der ikke svarer til et PetName
. Der er ingen kaniner som kæledyr. Men den venstre join forårsager Rabbit
skal returneres, selvom der ikke er noget kæledyr i Pets
bord af den type. Dette resulterer i en NULL
værdi i PetName
kolonne mod Rabbit
.
Dette skete kun fordi Rabbit
var i den venstre tabel (dvs. til venstre for LEFT JOIN
). søgeord). OK, min formatering gør det mere "over" end "venstre", men du får billedet.
Her er, hvad der sker, hvis vi ændrer tabelrækkefølgen i vores forespørgsel.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Denne gang Rabbits
blev ikke returneret. Det er fordi dens tabel (PetTypes
) var på højre side af sammenføjningen.
Vi bliver nødt til at ændre det til en højre join eller en fuld join, hvis vi ville have Rabbits
skal returneres med denne bordbestilling.
Venstre deltagelse på 3 borde
Her er et eksempel på at udføre en venstre join på alle tre borde.
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;
Resultat:
+-----------+-----------+----------------+ | 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)
Denne gang har vi en kæledyrsejer, der ikke har et kæledyr.
Vi kunne igen blande rækkefølgen af bordene rundt, og vi ville få et andet resultat.
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;
Resultat:
+-----------+-----------+---------------+ | 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)
Denne gang fik vi den ekstra kæledyrstype (Rabbit
), men ikke den ekstra ejer.
Hvis du undrer dig over, hvorfor den sidste PetOwner
er ikke NULL
(som sidst PetName
er), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQL CONCAT()
funktion til at sammenkæde ejerens for- og efternavn.