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

Verbinden Sie 3 Tabellen in SQL

In SQL können Sie drei oder mehr Tabellen verknüpfen, indem Sie nach der ersten eine weitere Verknüpfung hinzufügen.

Sie können auch verschachtelte Joins ausführen, indem Sie einen Join als Join-Bedingung für einen anderen angeben.

Syntax

Die gebräuchlichste Art, drei Tabellen zu verbinden, sieht ungefähr so ​​aus:

SELECT *
FROM Table1 
INNER JOIN Table2
    ON Condition
INNER JOIN Table3
    ON Condition; 

Dabei wird ein innerer Join verwendet, aber Sie können den gewünschten Join-Typ wie bei jedem anderen Join angeben. Sie können bei Bedarf auch Join-Typen kombinieren (Beispiel unten).

Sie können auch verschachtelte Joins verwenden, indem Sie einen Join als Join-Bedingung für einen anderen Join angeben. So:

SELECT *
FROM Table1 
JOIN (Table2
            JOIN Table3
            ON Condition)
ON Condition; 

Beispieldaten – Die 3 Tabellen

Angenommen, wir haben die folgenden drei Tabellen.

Die Customers Tabelle:

+--------------+-----------+------------- --+----------------+| Kunden-ID | Kundenname | PostalCityId | Telefonnummer ||--------------+----------------+--------------- -+----------------|| 1 | Homer McKenzie | 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NULL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 |+-------------+----------------+---------- ------+----------------+(10 Zeilen betroffen)

Die Cities Tabelle:

+----------+----------------+----------------- -+--------------+| CityId | Ortsname | StateProvinceId | Bevölkerung ||----------+-----------+------------------ +--------------|| 3673 | Bogen März | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gassport | 33 | 1248 || 21692 | Medizin-Loge | 17 | 2009 || 26483 | Peeples-Tal | 3 | 428 || 33475 | Sylvanit | 27 | 103 || 17054 | Jessie | 35 | 25 || 19586 | Lisa | 28 | NULL || 37403 | Wimbledon | 35 | 216 |+----------+-----------+------------------ +--------------+(9 Zeilen betroffen)

Die StateProvinces Tabelle:

+--------------+---------------------+---- -------------+-------------+--------------+| StateProvinceId | StaatProvinzCode | StaatProvinzName | LänderID | Bevölkerung ||------+---------------------+----- -----------+-------------+--------------|| 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | N.E. | Nebraska | 230 | 1943256 || 31 | New Jersey | New-Jersey | 230 | 8899339 || 33 | NY | New York | 230 | 20437172 || 35 | ND | North Dakota | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 |+------+---------------------+----- -----------+-------------+-------------+(8 Zeilen betroffen )

Beispiel 1 – Inner Join 3 Tabellen

Der beliebteste Join-Typ ist der Inner Join, also fangen wir damit an.

Hier ist ein Beispiel für die Verknüpfung der obigen drei Tabellen mit zwei Inner Joins.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Ergebnis:

+---------------------+----------------+------- ---------+| StaatProvinzName | Ortsname | Kundenname ||---------------------+----------------+-------- --------|| Nebraska | Lisa | Homer McKenzie || Kansas | Medizin-Loge | Bart Pitt || New York | Gassport | Lisa McQueen || North Dakota | Jessie | Steve Simpson || Tennessee | Frankewing | Vinn Allen || Colorado | Bogen März | Veejay Smith || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(7 Zeilen betroffen)

Beispiel 2 – Kombinieren von Join-Typen

Sie können Join-Typen kombinieren, wenn Sie drei oder mehr Tabellen verbinden.

Hier ist ein Beispiel für die Kombination eines Inner Join mit einem Left Join.

SELECT
    s.StateProvinceName,
    ci.CityName,
    cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu  
ON cu.PostalCityId = ci.CityId; 

Ergebnis:

---------------------+----------------+-------- --------+| StaatProvinzName | Ortsname | Kundenname ||---------------------+----------------+-------- --------|| Colorado | Bogen März | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gassport | Lisa McQueen || Kansas | Medizin-Loge | Bart Pitt || Arizona | Peeples-Tal | NULL || North Dakota | Jessie | Steve Simpson || Nebraska | Lisa | Homer McKenzie || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(8 Zeilen betroffen)

In diesem Fall haben wir eine Stadt (Peeples Valley), die noch keine Kunden hat.

Der Grund, warum wir diese Informationen jetzt sehen können, ist, dass der linke Join Zeilen zurückgibt, die Daten in der linken Tabelle enthalten, selbst wenn es keine übereinstimmenden Zeilen in der linken Tabelle gibt.

Das vorherige Beispiel, in dem zwei Inner Joins kombiniert wurden, hat diese Zeile nicht zurückgegeben, da Inner Joins nicht übereinstimmende Zeilen aus beiden Tabellen verwerfen. Es gibt nur Zeilen zurück, wenn in beiden Tabellen mindestens eine Zeile vorhanden ist, die der Join-Bedingung entspricht.

Neue Beispieldaten – 3 verschiedene Tabellen

Für die verbleibenden Beispiele verwenden wir die folgenden Tabellen.

Die PetTypes Tabelle:

+-------------+-----------+| PetTypeId | Haustiertyp ||-------------+-----------|| 1 | Vogel || 2 | Katze || 3 | Hund || 4 | Hase |+-------------+-----------+(4 Zeilen betroffen)

Die Pets Tabelle:

+---------+------------+-----------+---------- -+------------+| Haustier-ID | PetTypeId | Eigentümer-ID | Haustiername | Geburtsdatum ||---------+------------+-----------+----------- +------------|| 1 | 2 | 3 | Flauschig | 2020-11-20 || 2 | 3 | 3 | Holen | 2019-08-16 || 3 | 2 | 2 | Kratzer | 01.10.2018 || 4 | 3 | 3 | Wackeln | 2020-03-15 || 5 | 1 | 1 | Twittern | 2020-11-28 || 6 | 3 | 4 | Flauschig | 2020-09-17 || 7 | 3 | 2 | Rinde | NULL || 8 | 2 | 4 | Miau | NULL |+---------+------------+-----------+----------- +------------+(8 Zeilen betroffen)

Die Owners Tabelle:

+-----------+------------+-----------+------- ---------+-------------------+| Eigentümer-ID | Vorname | Nachname | Telefon | E-Mail ||-----------+-------------+------------+-------- --------+-------------------|| 1 | Homer | Conner | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trumpf | (349) 611-8908 | NULL || 5 | Holzig | 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.

Beispiel 3 – Left Join 3 Tabellen

Lassen Sie uns einen Drei-Tabellen-Join mit zwei linken Joins erstellen.

Hier ist ein Beispiel für die Ausführung von zwei Linksverknüpfungen mit diesen 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:

+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(9 Zeilen betroffen) 

Hier haben wir einen Haustierbesitzer, der kein Haustier hat. Wir können das überprüfen, indem wir uns die Pets.OwnerId ansehen -Spalte und sehen, dass es keinen Wert gibt, der Woody Eastwoods OwnerId entspricht in den Owners Tabelle.

Beispiel 4 – Rechte Verknüpfung von 3 Tabellen

Der rechte Join ist das Gegenteil des linken Joins. Hier ist ein Beispiel, das dieselben drei Tabellen verwendet.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o 
    ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt 
    ON p.PetTypeId = pt.PetTypeId; 

Ergebnis:

+-----------+-----------+---------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+---------------|| Twittern | Vogel | Homer Connery || Flauschig | Katze | Nancy Simpson || Kratzer | Katze | Bart Pitt || Miau | Katze | Boris Trumpf || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Rinde | Hund | Bart Pitt || NULL | Kaninchen | |+-----------+-----------+---------------+(9 Zeilen betroffen)

Dieses Mal haben wir einen zusätzlichen Haustiertyp (Rabbit ), aber nicht der zusätzliche Eigentümer. Dies liegt daran, dass Right Joins Zeilen zurückgeben, die Daten in der rechten Tabelle enthalten, selbst wenn es keine übereinstimmenden Zeilen in der linken Tabelle gibt.

Übrigens der Grund der letzte PetOwner ist nicht NULL (wie zuletzt der PetName ist) liegt daran, dass es das Ergebnis einer Zeichenfolgenverkettung ist. Ich habe das T-SQL CONCAT() verwendet Funktion, um den Vor- und Nachnamen des Besitzers zu verketten.

Beispiel 5 – Vollständige Verknüpfung von 3 Tabellen

Die vollständige Verknüpfung ist wie eine linke und eine rechte Verknüpfung in einem. Es gibt alle Zeilen zurück, solange es in einer der Tabellen übereinstimmende Daten gibt.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
    ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
    ON p.PetTypeId = pt.PetTypeId; 

Ergebnis:

+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood || NULL | Kaninchen | |+-----------+-----------+----------------+(10 Zeilen betroffen) 

Dieses Mal erhalten wir eine Kombination der Ergebnisse, die wir in den beiden vorherigen Beispielen erhalten haben.

Beispiel 6 – Verschachtelte Joins

Wie bereits erwähnt, können Sie auch verschachtelte Joins erstellen.

Hier ist ein Beispiel für einen verschachtelten Join.

SELECT 
    p.PetName,
    pt.PetType,
    CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o 
LEFT JOIN    (Pets p
        LEFT JOIN PetTypes pt
        ON p.PetTypeId = pt.PetTypeId)
ON p.OwnerId = o.OwnerId; 

Ergebnis:

+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(9 Zeilen betroffen)