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 | 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 | +-----------+-------------+------------+----------------+-------------------+
Beachten Sie Folgendes:
- Die
PetTypeIdSpalte derPetstable ist ein Fremdschlüssel derPetTypeIdderPetTypesTabelle (das ist der Primärschlüssel dieser Tabelle). - Die
OwnerIdSpalte derPetstable ist ein Fremdschlüssel derOwnerIdSpalte derOwnersTabelle.
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.