Database
 sql >> Datenbank >  >> RDS >> Database

SQL-Left-Join

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 der Pets table ist ein Fremdschlüssel der PetTypeId der PetTypes Tabelle (das ist der Primärschlüssel dieser Tabelle).
  • Die OwnerId Spalte der Pets table ist ein Fremdschlüssel der OwnerId Spalte der Owners 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.