Modul Datenbanken IN EF Gymnasium Lerbermatt
Docs » sql:join3

JOIN über drei Tabellen

Syntax von JOIN

SELECT * | Attribut [, Attribut] FROM Tabellenname1
xx [xx];
 
xx :=
INNER | (LEFT|RIGHT [OUTER]) JOIN Tabellenname2
ON Tabellenname1.Attribut = Tabellenname2.Attribut

Selbstverständlich können auch drei und mehr Tabellen miteinander verbunden werden. Es wird aber relativ rasch ziemlich unübersichtlich und bei grossen Datenmengen arschlangsam💩.

Als Datenmodell schauen wir das folgende Beispiel an:

Die Tabelle "tblKunden" in der Mitte ist für uns quasi die Haupttabelle. Und hier wollen wir nun beispielsweise eine Liste wie die folgende erstellen:

Aufgabe 1

Versuchen Sie, mit Hilfe der Syntax-Angabe ganz oben ein solches SQL-Statement zu erstellen. Sie benötigen hierfür noch keine WHERE-Klausel. Filtern wollen wir noch nicht. Verwenden Sie einen INNER JOIN.

Lösung

Für den JOIN braucht es immer zwei Zeilen:

  1. Klausel mit JOIN (inner, outer)
  2. Klausel mit ON, um die Verbindung der Tabelle anzugeben

Und gemäss Syntax-Angabe gehören die beiden zusammen, d.h.:

  1. Erster JOIN mit ON-Klausel
  2. Zweiter JOIN mit ON-Klausel
  3. etc.

Es könnte ja auch sein, dass man zuerst alle JOIN-Zeilen auflisten muss und dann erst die ON-Klauseln:

INNER JOIN tblLaender
INNER JOIN tblFunktionen
ON tblKunden.tLandID = tblLaender.tLandID
ON tblKunden.tFunktionID = tblFunktionen.tFunktionID

Das ist aber falsch. Unten sehen Sie die korrekte Syntax.

SELECT tNachname, tVorname, tLandesname, tFunktion
FROM tblKunden
INNER JOIN tblLaender
ON tblKunden.tLandID = tblLaender.tLandID
INNER JOIN tblFunktionen
ON tblKunden.tFunktionID = tblFunktionen.tFunktionID
ORDER BY tNachname, tVorname;

Wenn Sie INNER JOIN verwendet haben, werden Sie wohl wieder zu wenig Datensätze angezeigt kriegen. Bei mir sind es 80.

Aufgabe 2

Testen Sie nun selbst aus, wie Sie das SQL-Statement anpassen müssen, damit sämtliche 91 Kund*innen erscheinen.

Lösung

Wie weiter oben geschrieben, ist die Tabelle "tblKunden" unsere Haupttabelle. Diese erscheint auch in der FROM Klausel. Deshalb ist sie die linke Tabelle. Also brauchen wir zweimal einen LEFT OUTER JOIN:

SELECT tNachname, tVorname, tLandesname, tFunktion
FROM tblKunden
LEFT JOIN tblLaender
ON tblKunden.tLandID = tblLaender.tLandID
LEFT JOIN tblFunktionen
ON tblKunden.tFunktionID = tblFunktionen.tFunktionID
ORDER BY tNachname, tVorname;

Kriterien in zwei Tabellen

Aufgabe 3

Erstellen Sie eine Abfrage, welche nur diejenigen Kund*innen aus der Schweiz, Österereich und Deutschland auflistet, welche die Funktion "Abteilungsleiter" oder "Verkaufsleiter" haben.

Lösung

Da die Syntax mit dem IN-Operator kürzer ist als mit OR, zeige ich hier nur diese:

SELECT tNachname, tVorname, tLandesname, tFunktion
FROM tblKunden
INNER JOIN tblLaender
ON tblKunden.tLandID = tblLaender.tLandID
INNER JOIN tblFunktionen
ON tblKunden.tFunktionID = tblFunktionen.tFunktionID
WHERE tLandesname IN ("Deutschland", "Schweiz", "Oesterreich") AND tFunktion IN ("Abteilungsleiter", "Verkaufsleiter")
ORDER BY tNachname, tVorname;
Previous Next

Modul Datenbanken IN EF Gymnasium Lerbermatt

Table of Contents

Inhaltsverzeichnis

  • JOIN über drei Tabellen
    • Syntax von JOIN
    • Aufgabe 1
    • Aufgabe 2
    • Kriterien in zwei Tabellen
    • Aufgabe 3

Theorie

  • Grundlagen zu Datenbanken
  • Datenbank-Modelle
  • Relationale Datenbanken
  • Die Abfragesprache SQL

Installation von Software

  • Demo-Datenbank herunterladen
  • SQLite installieren
  • SQLiteStudio verwenden
  • DB Browser for SQLite verwenden

Einführung in SQL

  • Erste Schritte mit SELECT
  • ORDER BY
  • LIMIT
  • WHERE
  • GROUP BY und Aggregation
  • Weitere Berechnungen
  • SELECT vollständig

Über mehrere Tabelle abfragen

  • Was ist ein JOIN?
  • JOIN mit zwei Tabellen
  • JOIN mit drei Tabellen
  • Noch mehr JOINs 😂
  • Noch ein paar Übungen