SQL Join Grundlagen

SQL Joins

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 ...

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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 :

Hier versteckt sich noch mehr!
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.

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Alternativ kannst du auch die Join-Abfrage im WHERE Teil deiner Abfrage vornehmen:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Beispiel

Für die Beispiele sollen die beiden folgenden Tabellen Mitarbeiter und Kunde verwendet werden:

\underline{\text{MitarbeiterID}}MitarbeiterID\underline{\text{MitarbeiterID}}
\text{Name}Name\text{Name}
\overline{\text{Bedient}}Bedient\overline{\text{Bedient}}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\underline{\text{KundeID}}KundeID\underline{\text{KundeID}}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Amir}Amir\text{Amir}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}

Cross-Join

Der Cross-Join bildet das kartesische Produkt zwischen beiden Tabellen.

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{Bedient}Bedient\text{Bedient}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{1}1\text{1}
\text{Amir}Amir\text{Amir}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{1}1\text{1}
\text{Amir}Amir\text{Amir}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}

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.

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{Bedient}Bedient\text{Bedient}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}

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.

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}

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

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{Bedient}Bedient\text{Bedient}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}

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

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{Bedient}Bedient\text{Bedient}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{null}null\text{null}
\text{null}null\text{null}
\text{null}null\text{null}
\text{1}1\text{1}
\text{Amir}Amir\text{Amir}

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

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{MitarbeiterID}MitarbeiterID\text{MitarbeiterID}
\text{Name}Name\text{Name}
\text{Bedient}Bedient\text{Bedient}
\text{KundeID}KundeID\text{KundeID}
\text{Name}Name\text{Name}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{2}2\text{2}
\text{Emira}Emira\text{Emira}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Lena}Lena\text{Lena}
\text{null}null\text{null}
\text{null}null\text{null}
\text{null}null\text{null}
\text{1}1\text{1}
\text{Amir}Amir\text{Amir}

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.

\underline{\text{PersonenID}}PersonenID\underline{\text{PersonenID}}
\text{Name}Name\text{Name}
\text{TeampartnerID}TeampartnerID\text{TeampartnerID}
\text{1}1\text{1}
\text{Peter}Peter\text{Peter}
\text{null}null\text{null}
\text{2}2\text{2}
\text{Mia}Mia\text{Mia}
\text{5}5\text{5}
\text{3}3\text{3}
\text{Andrea}Andrea\text{Andrea}
\text{4}4\text{4}
\text{4}4\text{4}
\text{Amir}Amir\text{Amir}
\text{3}3\text{3}
\text{5}5\text{5}
\text{Elena}Elena\text{Elena}
\text{2}2\text{2}
Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\text{PersonenID}PersonenID\text{PersonenID}
\text{Name}Name\text{Name}
\text{TeampartnerID}TeampartnerID\text{TeampartnerID}
\text{PersonenID}PersonenID\text{PersonenID}
\text{Name}Name\text{Name}
\text{TeampartnerID}TeampartnerID\text{TeampartnerID}
\text{2}2\text{2}
\text{Mia}Mia\text{Mia}
\text{5}5\text{5}
\text{5}5\text{5}
\text{Elena}Elena\text{Elena}
\text{2}2\text{2}
\text{3}3\text{3}
\text{Andrea}Andrea\text{Andrea}
\text{4}4\text{4}
\text{4}4\text{4}
\text{Amir}Amir\text{Amir}
\text{3}3\text{3}
\text{4}4\text{4}
\text{Amir}Amir\text{Amir}
\text{3}3\text{3}
\text{3}3\text{3}
\text{Andrea}Andrea\text{Andrea}
\text{4}4\text{4}
\text{5}5\text{5}
\text{Elena}Elena\text{Elena}
\text{2}2\text{2}
\text{2}2\text{2}
\text{Mia}Mia\text{Mia}
\text{5}5\text{5}

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.

Nächstes Thema:
Entities im ER-Modell

Weiter
Entities im ER-Modell

simpleclub ist am besten in der App.

Mit unserer App hast du immer und überall Zugriff auf: Lernvideos, Erklärungen mit interaktiven Animationen, Übungsaufgaben, Karteikarten, individuelle Lernpläne uvm.

Jetzt simpleclub Azubi holen!

Mit simpleclub Azubi bekommst du Vollzugang zur App: Wir bereiten dich in deiner Ausbildung optimal auf deine Prüfungen in der Berufsschule vor. Von Ausbilder*innen empfohlen.

Jetzt simpleclub Azubi holen