Ein Join ermöglicht die Verknüpfung mehrerer verschiedener Tabellen in einer Abfrage. Dabei wird zwischen fünf verschiedenen Arten unterschieden.
Erklärung
Vorab: Bei der Verknüpfung von zwei Tabellen kann es passieren, dass zwei Attribute den gleichen Namen haben. Zum Beispiel könnte es in einem Unternehmen bei den Tabellen "Mitarbeiter" und "Kunde" das Attribut Name geben.
Wenn du bei einer SQL Abfrage ein bestimmtes Attribut aus einer bestimmten Tabelle referenzieren möchtest, kannst du Tabellenname.Attributname schreiben ...
Besuche die App, um alle Inhalte zu sehen!
... oder eine Abkürzung für den Tabellennamen im FROM Teil definieren und dann Abkürzung.Attributname verwenden:
Besuche die App, um alle Inhalte zu sehen!
Cross-Join
Ein Cross-Join verbindet jedes Tupel von Tabelle A mit jedem Tupel von Tabelle B. In der Mathematik nennt sich dies Kartesisches Produkt.
In SQL sieht die explizite Anweisung so aus:
Besuche die App, um alle Inhalte zu sehen!
Alternativ kannst du die Anweisung cross join auch weglassen, das Ergebnis ist das Gleiche. SQL verwendet dann implizit den Cross-Join :
Besuche die App, um alle Inhalte zu sehen!
Da ein Cross-Join immer alle Tupel mit allen Tupeln verknüpft, wird er nur selten verwendet.
Inner-Join
Der Inner-Join verknüpft nur zwei Tupel, wenn bei beiden Tupeln die Attributwerte eines Attributes gleich sind.
Ein Inner-Join kann in SQL mit dem inner join Befehl definiert werden. Statt inner join kannst du auch nur join schreiben, das ist für SQL das Gleiche.
Besuche die App, um alle Inhalte zu sehen!
Alternativ kannst du auch die Join-Abfrage im WHERE Teil deiner Abfrage vornehmen:
Besuche die App, um alle Inhalte zu sehen!
Natural-Join
Der Natural-Join vergleicht automatisch Attribute, die den gleichen Namen haben. In der Ergebnistabelle wird dieses Attribut dann nur einmal ausgegeben.
In SQL kannst du den Natural-Join verwenden, indem du den natural join Befehl verwendest:
Besuche die App, um alle Inhalte zu sehen!
Outer-Join
Bisher wurde ein Tupel immer aus der Ergebnistabelle gestrichen, wenn die Attributwerte aus den beiden Tabellen nicht übereingestimmt haben. Wenn die nicht gewünscht ist, dann können ein Left-Outer-Join, Full-Outer-Join, oder Right-Outer-Join verwendet werden.
Ein Left/Full/Right-Outer-Join übernimmt alle Tupel aus der linken, beiden, oder rechten Tabelle, auch wenn diese keinen Join-Partner in der anderen Tabelle haben.
In SQL sehen die drei Outer-Join-Arten dann so aus:
Left-Outer-Join übernimmt alle Tupel aus der linken/ersten Tabelle, auch wenn diese keinen Join-Partner in der zweiten Tabelle haben:
Besuche die App, um alle Inhalte zu sehen!
Full-Outer-Join übernimmt alle Tupel aus beiden Tabellen, auch wenn sie keine Join-Partner in der anderen Tabelle haben:
Besuche die App, um alle Inhalte zu sehen!
Right-Outer-Join übernimmt alle Tupel aus der rechten/zweiten Tabelle, auch wenn diese keinen Join-Partner in der ersten Tabelle haben:
Besuche die App, um alle Inhalte zu sehen!
Self-Join
Bei einem Self-Join wird eine Tabelle mit sich selbst verknüpft und verschiedene Attribute innerhalb derselben Tabelle miteinander verglichen.
In SQL sieht die Anweisung dazu dann so aus:
Besuche die App, um alle Inhalte zu sehen!
Beispiel
Für die Beispiele sollen die beiden folgenden Tabellen Mitarbeiter und Kunde verwendet werden:
Cross-Join
Der Cross-Join bildet das kartesische Produkt zwischen beiden Tabellen.
Besuche die App, um alle Inhalte zu sehen!
Da beim Cross-Join jedes Tupel mit jedem Tupel ohne Selektion kombiniert wird, findet diese Abfrage in der Praxis nur selten Anwendung.
Inner-Join
Eine Beispiel Aufgabe für einen Inner-Join könnte sein: Gib alle Paare von Mitarbeiter und Kunden an, bei denen ein Mitarbeiter einen Kunden bedient hat.
Besuche die App, um alle Inhalte zu sehen!
Natural-Join
WICHTIG! Für die Aufgabe zum Natural-Join, wird in der Tabelle Mitarbeiter das Attribut Bedient in KundeID UMBENANNT! Der Natural-Join vergleicht nur Attribute, die den gleichen Namen haben, daher muss hier das Attribut umbenannt werden!
Ein Beispiel für eine Aufgabe zum Natural-Join könnte die gleiche Anweisung wie beim Inner-Join sein, allerdings werden in der Ausgabetabelle die Attribute Bedient und KundeID zu einem Attribut zusammen gefasst.
Besuche die App, um alle Inhalte zu sehen!
Outer-Join
Im Folgenden werden Beispiele für alle drei Arten des Outer-Joins aufgezeigt. Es werden wieder beide Anfangstabellen Mitarbeiter und Kunde verwendet, inklusiver aller Attributnamen vom Anfang.
Left-Outer-Join
Besuche die App, um alle Inhalte zu sehen!
Es sind alle Tupel der "linken" Tabelle Mitarbeiter enthalten, jedoch nur Tupel der "rechten" Tabelle Kunde, bei denen die Bedingung erfüllt ist.
Full-Outer-Join
Besuche die App, um alle Inhalte zu sehen!
Es sind alle Tupel der "linken" Tabelle Mitarbeiter enthalten, sowie alle Tupel der "rechten" Tabelle Kunde. Wenn die Bedingung nicht erfüllt ist und keine Zuordnung erfolgen konnte, werden die restlichen Attributwerte mit "null"-Werten aufgefüllt.
Right-Outer-Join
Besuche die App, um alle Inhalte zu sehen!
Es sind nur Tupel der "linken" Tabelle Mitarbeiter (bei denen die Bedingung erfüllt ist) enthalten. Es sind jedoch alle Tupel der "rechten" Tabelle Kunde erhalten.
Wenn du alle Tabellen aller Join-Arten vergleichst, wird dir sicher auffallen, dass einige Join-Abfragen auf den Tabellen Mitarbeiter und Kunde zu identischen Ausgaben geführt haben. Grundsätzlich sind ALLE Join-Arten unterschiedlich, es kann jedoch vorkommen, dass sich die Ausgaben gleichen. Es muss deshalb jeder Join immer bewusst gewählt werden, da es sonst zu unerwünschten Tupeln in der Ergebnistabelle kommen kann.
Self-Join
Für den Self-Join benötigen wir eine andere Beispieltabelle. Die im Folgenden Teampartner genannte Tabelle modelliert eine Partnerarbeit in einer Klasse. Dabei hat jede Person maximal einen Teampartner.
Besuche die App, um alle Inhalte zu sehen!
Wenn eine Person aus der Tabelle Teampartner einen Teampartner hat, so wird diese Person zusammen mit dem Teampartner als ein Tupel in der Ergebnistabelle ausgegeben. Hat eine Person keinen Teampartner (hier nur Peter), so ist diese Person auch nicht Teil der Ergebnistabelle.