Dieser Artikel gibt einen Überblick über den LEFT JOIN
in SQL sowie einige grundlegende Beispiele.
Der LEFT JOIN
, oder LEFT OUTER JOIN
, gibt Zeilen zurück, die Daten in der linken Tabelle enthalten (links von JOIN
Schlüsselwort), auch wenn es keine übereinstimmenden Zeilen in der rechten Tabelle gibt.
Syntax
Sie geben einen linken Join im FROM
an Klausel. Sie können entweder den LEFT JOIN
verwenden oder LEFT OUTER JOIN
Syntax.
Mit dem LEFT JOIN
Syntax:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Verwenden des LEFT OUTER JOIN
Syntax:
SELECT *
FROM Table1 LEFT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Beide machen genau dasselbe. Es ist nur das OUTER
Schlüsselwort ist optional.
Beispiele
Hier sind einige Beispiele zur Veranschaulichung.
Beispieldaten
Hier sind zunächst die Tabellen, die wir für die Beispiele verwenden werden.
Die PetTypes
Tabelle:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Die Pets
Tabelle:
+---------+-------------+-----------+-----------+------------+ | 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)
Die Owners
Tabelle:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Beachten Sie Folgendes:
- Die
PetTypeId
Spalte derPets
table ist ein Fremdschlüssel derPetTypeId
derPetTypes
Tabelle (das ist der Primärschlüssel dieser Tabelle). - Die
OwnerId
Spalte derPets
table ist ein Fremdschlüssel derOwnerId
Spalte derOwners
Tabelle.
Die Left-Join-Abfrage
Hier ist ein Beispiel für eine Linksverknüpfung mit zwei dieser Tabellen.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Ergebnis:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Der linke Join bewirkt, dass wir einen PetType
erhalten Wert, der keinem PetName
entspricht . Es gibt keine Kaninchen als Haustiere. Aber der linke Join verursacht Rabbit
zurückgegeben werden, obwohl in den Pets
kein Haustier enthalten ist Tabelle dieser Art. Dies führt zu einem NULL
Wert im PetName
Spalte gegen Rabbit
.
Dies geschah nur, weil Rabbit
war in der linken Tabelle (also links vom LEFT JOIN
). Schlüsselwörter). OK, meine Formatierung macht es mehr „oben“ als „links“, aber Sie bekommen das Bild.
Folgendes passiert, wenn wir die Tabellenreihenfolge in unserer Abfrage ändern.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ergebnis:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Dieses Mal Rabbits
wurde nicht zurückgegeben. Das liegt daran, dass seine Tabelle (PetTypes
) befand sich auf der rechten Seite des Joins.
Wir müssten es zu einem Right Join oder einem Full Join ändern, wenn wir Rabbits
wollten mit dieser Tabellenreihenfolge zurückgegeben werden.
Linker Join an 3 Tischen
Hier ist ein Beispiel für die Durchführung eines Linksjoins für alle drei Tabellen.
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;
Ergebnis:
+-----------+-----------+----------------+ | 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)
Diesmal haben wir einen Haustierbesitzer, der kein Haustier hat.
Wir könnten die Reihenfolge der Tabellen erneut mischen und würden ein anderes Ergebnis erhalten.
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;
Ergebnis:
+-----------+-----------+---------------+ | 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)
Dieses Mal haben wir den zusätzlichen Haustiertyp (Rabbit
). ), aber nicht der zusätzliche Besitzer.
Falls Sie sich fragen, warum der letzte PetOwner
ist nicht NULL
(wie zuletzt der PetName
ist), weil es das Ergebnis einer Zeichenfolgenverkettung ist. Ich habe das T-SQL CONCAT()
verwendet Funktion, um den Vor- und Nachnamen des Besitzers zu verketten.