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 | 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 | +-----------+-------------+------------+----------------+-------------------+
Bemærk at:
PetTypeIdkolonne iPetstabel er en fremmednøgle tilPetTypeIdafPetTypestabel (som er den primære nøgle til den pågældende tabel).OwnerIdkolonne iPetstabel er en fremmednøgle tilOwnerIdkolonne iOwnerstabel.
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.