📖DQL - Join

Tabellen miteinander verknüpfen
Verknüpfung von zwei Tabellen kann, muss aber nicht über die Primär-/Fremdschlüssel-Beziehung erfolgen. Die meisten Joins sind EQUI JOINS. Darin werden zwei Tabellen über übereinstimmende Spalten verknüpft. Als Join-Operator wird ein = verwendet. Beispiel: Rechnungs- und Kundentabelle werden über die Kundennummer, die in beiden Tabellen enthalten ist, verknüpft.
Die seltene Sonderform eines Joins ist der NONEQUI JOIN. Bei Nonequi Joins gibt es keine direkt aufeinander referenzierenden Spalten. Als Join-Operator wird kein = verwendet, sondern meist kommt ein BETWEEN … AND … zum Einsatz.
⚡️ Ausprobieren
Öffne diese Beispiel-Datenbank in einem neuen Fenster: https://www.w3schools.com/sql/trysqlserver.asp?filename=trysql_func_sqlserver_concat
Hier kannst du direkt im Browser SQL Statements ausprobieren. Probiere die Beispiele hier mit einem ⚡️-Symbol aus.
Die JOIN Arten
Angenommen, du hast die folgenden zwei Tabellen, welche je eine Spalte haben:
A B
- -
1 3
2 4
3 5
4 6
Beachte, dass die Einträge 1 und 2 nur bei A, 5 und 6 nur bei B vorhanden sind. 3 und 4 gibt es bei beiden. Folgende Tabelle erklärt, wie die Ausgabe aussehen würde, wenn diese zwei Tabellen mit den verschiedenen JOIN Arten verknüpft werden:
JOIN-Art
Bild
Resultierende Tabelle
INNER JOIN
a | b
-----+-----
3 | 3
4 | 4
LEFT OUTER JOIN
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
RIGHT OUTER JOIN
a | b
-----+-----
3 | 3
4 | 4
null | 5
null | 6
FULL OUTER JOIN
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
INNER JOIN
JOIN
-Bedingung in eigener KlauselWHERE
-Klausel wird reingehaltenJOIN
-Typ widerspiegelt sich in JOIN-Ausdruck
SELECT tab1.spalte_1, tab2.spalte_2
FROM tab1
INNER JOIN tab2 ON tab1.spalte_x = tab2.spalte_y
WHERE . . .
⚡️ Ausprobieren
Erstelle ein SQL-Statement, welches mittels
INNER JOIN
die TabellenOrders
undCustomers
über dieCustomerID
verknüpft. Gib dabei mindestensOrderID
,CustomerName
undOrderDate
aus.Gib Produktname, Preis und den Namen des Herstellers aus von allen Produkten, die teurer als 100$ sind.
JOIN über WHERE-Klausel
Es ist auch möglich, zwei Tabellen über eine einfache WHERE-Klausel zu verbinden. Dies ist aber weniger performant. Es wird vor allem bei ORACLE eingesetzt, da vor Version 9i nur diese Möglichkeit bestand.
SELECT tab1.spalte_1, tab2.spalte_2
FROM tab1, tab2
WHERE tab1.spalte_x = tab2.spalte_y;
Weitere Bedingungen werden mit AND ergänzt Tabellennamen müssen bei Namensgleichheit von Spalten angegeben werden. Tabellennamen sollten vor allen Spaltennamen stehen.
⚡️ Ausprobieren
Löse die Aufgaben aus INNER JOIN mittels eines einfachen JOIN über WHERE-Klausel.
Tabellen-Alias
Wie du in den letzten zwei Beispielen sicher bemerkt hast, muss man so ziemlich viel schreiben. Um das etwas abzukürzen, kann man den Tabellen einen Alias geben, welcher dann in dieser Abfrage verwendet werden kann.
Dadurch kann man einfacher und schneller SQL-Statements schreiben, die übersichtlicher sind und dabei passieren auch noch weniger Schreibfehler.
SELECT a.spalte_1, b.spalte_2
FROM tab1 AS a, tab2 AS b
WHERE a.spalte_x = b.spalte_y;
-- Variante ohne AS
SELECT a.spalte_1, b.spalte_2
FROM tab1 a
INNER JOIN tab2 b ON a.spalte_x = b.spalte_y;
⚡️ Ausprobieren
Passe die vorigen ⚡️Ausprobieren Beispiele an und verwende Tabellen-Aliasse.
OUTER JOIN
Syntaxmässig sind OUTER JOINs gleich wie INNER JOINs. Einfach, dass Statt INNER
da LEFT OUTER
, RIGHT OUTER
oder FULL OUTER
steht.
⚡️ Ausprobieren
Passe die vorigen ⚡️Ausprobieren Beispiele an und verwende die verschiedenen OUTER JOIN
-Arten.
JOINS mit mehr als zwei Tabellen
⚡️ Ausprobieren
Liste alle Angestellten (Vorname und Nachname) auf und dazu die Namen aller Kunden, für welche die Angestellten schon einmal eine Bestellung bearbeitet haben.
Weitere JOIN Arten
CROSS JOIN
Beim
CROSS JOIN
handelt es sich um ein Kreuzprodukt (kartesisches Produkt)Es werden alle möglichen Kombinationen gebildet (jeder mit jedem)
In der Regel ungewollt!
Wird z.B. zum Generieren von Testdaten verwendet
SELF JOIN
(rekursiverJOIN
)JOIN
einer Tabelle mit sich selbstDient zur Abbildung von Hierarchien
Dieselbe Tabelle zweimal mit unterschiedlichem Alias verwenden
⚡️ Ausprobieren
Zeige mittels rekursivem
JOIN
alle Mitarbeitenden der Northwind-Datenbank an (ID, Vorname, Nachname) und zu jedem den Namen des Vorgesetzten (ReportsTo)Finde den CEO (die Person, welche keinen weiteren Vorgesetzten hat).
💡 Eigene Aufgabe
Überlege dir eine Aufgabe für eine Abfrage in der Northwind Datenbank.
Gebe die Aufgabe (noch ungelöst) morgen deinem Instruktor ab.
Die Aufgaben werden dann willkürlich zum lösen an die Klasse verteilt.
Last updated
Was this helpful?