Bei einem SQL JOIN handelt es sich um eine Ab­fra­ge­ope­ra­ti­on, die mehrere Tabellen einer re­la­tio­na­len Datenbank verknüpft und deren Da­ten­sät­ze (Tupel) gefiltert nach einer vom Benutzer de­fi­nier­ten Se­lek­ti­ons­be­din­gung ausgibt.

KI-Assistent kostenlos – Ihr smarter All­tags­hel­fer
  • DSGVO-konform & sicher gehostet in Deutsch­land
  • Pro­duk­ti­vi­tät steigern – weniger Aufwand, mehr Output
  • Direkt im Browser starten – ohne In­stal­la­ti­on

Der ge­läu­figs­te JOIN-Typ des re­la­tio­na­len Da­ten­bank­mo­dells ist der SQL INNER JOIN. In der Praxis nutzen Anwender bei­spiels­wei­se dann INNER JOINs, wenn zwei Da­ten­bank­ta­bel­len anhand gleicher Spalten verbunden werden sollen. Dabei wird jeder Datensatz der einen Tabelle mit einem ent­spre­chen­den Datensatz der anderen Tabelle zu­sam­men­ge­führt. Da­ten­sät­ze, zu denen das Datenbank-Ma­nage­ment­sys­tem (DBMS) keine Ent­spre­chung in der jeweils anderen Tabelle findet, werden aus­ge­blen­det. Ein SQL OUTER JOIN hingegen gibt nicht nur die Da­ten­sät­ze beider Tabellen aus, die die Se­lek­ti­ons­be­din­gung (bei­spiels­wei­se die Gleich­heit der Werte zweier Spalten) erfüllen, sondern zu­sätz­lich auch alle übrigen Tupel der einen bzw. der anderen Tabelle. Bezogen auf die Le­se­rich­tung der SQL-Syntax spricht man von einer linken und einer rechten Tabelle. Die je­wei­li­gen Ope­ra­tio­nen heißen dem­entspre­chend LEFT OUTER JOIN und RIGHT OUTER JOIN. Möchten Sie im Rahmen von Da­ten­bank­ab­fra­gen zu­sätz­lich zu den Da­ten­sät­zen, die die Se­lek­ti­ons­be­din­gung erfüllen, auch sämtliche Da­ten­sät­ze der linken und rechten Tabelle ausgeben, handelt es sich um einen FULL OUTER JOIN. Das Prinzip der un­ter­schied­li­chen JOIN-Typen lässt sich sehr gut durch Men­gen­dia­gram­me ver­an­schau­li­chen:

Un­ter­ar­ten des OUTER JOINs

Jeder OUTER JOIN wird als LEFT OUTER JOIN, RIGHT OUTER JOIN oder FULL OUTER JOIN rea­li­siert.

Tipp

Das Keyword OUTER ist in der SQL-Syntax optional. In der Regel nutzen Anwender die verkürzte Schreib­wei­se LEFT JOIN, RIGHT JOIN und FULL JOIN.

Wir ver­an­schau­li­chen die Funk­ti­ons­wei­se von OUTER JOINs anhand der Da­ten­bank­ta­bel­len „mit­ar­bei­ter“ und „kfz“.

Tabelle: mit­ar­bei­ter

m_id nachname vorname kfz_id
1 Schmidt Udo 3
2 Müller Wolfgang 1
3 Meyer Günther 1
4 Krause Helmut 2
5 Fischer Hugo NULL

Die Tabelle „mit­ar­bei­ter“ umfasst die Vor- und Nachnamen der Mit­ar­bei­ter eines fiktiven Un­ter­neh­mens sowie die Kennung des zu­ge­wie­se­nen Fir­men­wa­gens (kfz_id). Pri­mär­schlüs­sel der Tabelle ist eine wi­der­spruchs­freie Mit­ar­bei­ter-ID (m_id). Dem Mit­ar­bei­ter mit der ID 5 (Hugo Fischer) wurde bisher kein Fir­men­wa­gen zu­ge­wie­sen. Die Zelle der ent­spre­chen­den Spalte enthält daher einen Nullwert.

Hinweis

Der Nullwert NULL ist ein Wert, der für die Ab­we­sen­heit eines Wertes steht. Er ent­spricht nicht dem Zah­len­wert 0.

Tabelle: kfz

kfz_id marke modell kenn­zei­chen baujahr hu
1 VW Caddy B KH 778 2016 18.12.2018
2 Opel Astra B PO 654 2010 12.08.2019
3 BMW X6 B MW 780 2017 01.09.2018
4 Porsche Boxster B AA 123 2018 23.12.2020

In der Tabelle „kfz“ wurden In­for­ma­tio­nen zum Fuhrpark des Un­ter­neh­mens erfasst: Marke des Fir­men­wa­gens, Modell, das Kenn­zei­chen, das Baujahr sowie das Datum der nächsten Haupt­un­ter­su­chung (hu). Jedem Fir­men­wa­gen ist eine wi­der­spruchs­freie ID zu­ge­ord­net (kfz_id), die als Pri­mär­schlüs­sel der Tabelle fungiert.

Beide Tabellen sind durch eine Fremd­schlüs­sel­be­zie­hung mit­ein­an­der verknüpft. Der Pri­mär­schlüs­sel der Tabelle „kfz“ (die kfz_id) wurde als Fremd­schlüs­sel in die Tabelle „mit­ar­bei­ter“ in­te­griert. Dies er­mög­licht es uns, beide Tabellen über eine ge­mein­sa­me Spalte zu verbinden.

Hinweis

Während gültige Pri­mär­schlüs­sel keine Nullwerte enthalten dürfen, verletzen Nullwerte in Fremd­schlüs­seln nicht die In­te­gri­tät eines Da­ten­sat­zes.

SQL LEFT OUTER JOIN

Bei einem LEFT OUTER JOIN gilt die Tabelle auf der linken Seite des JOIN-Operators als dominante Tabelle. In der re­la­tio­na­len Algebra werden LEFT OUTER JOINs mit folgendem Operator notiert:.

Um die Tabellen „mit­ar­bei­ter“ und „kfz“ im Rahmen eines LEFT OUTER JOINs zu verbinden, bietet sich folgende Operation an:

mit­ar­bei­ter ⟕ kfz_id=kfz_idkfz

Die In­ter­ak­ti­on mit dem DBMS erfolgt in der Da­ten­bank­spra­che SQL. Die oben dar­ge­stell­te Formel ent­spricht folgendem SQL-Statement:

SELECT * FROM mitarbeiter LEFT JOIN kfz ON mitarbeiter.kfz_id = kfz.kfz_id;

Die Tabelle „mit­ar­bei­ter“ steht auf der linken Seite des JOIN-Operators, die Tabelle „kfz“ auf der rechten. Als Se­lek­ti­ons­be­din­gung de­fi­nie­ren wir mit­ar­bei­ter.kfz_id = kfz.kfz_id. Die Er­geb­nis­men­ge eines LEFT OUTER JOIN umfasst alle Da­ten­sät­ze der linken Tabelle sowie jene Da­ten­sät­ze der rechten Tabelle, die die JOIN-Bedingung erfüllen. Es werden somit nur Da­ten­sät­ze der Tabelle „kfz“ in die Er­geb­nis­men­ge des JOINs auf­ge­nom­men, die in der Spalte kfz_id einen Wert enthalten, für den das DBMS auch einen ent­spre­chen­den Wert in der Tabelle „mit­ar­bei­ter“ findet.

Fehlende Werte in der Er­geb­nis­ta­bel­le werden als Nullwerte aus­ge­ge­ben.

Hinweis

Anders als bei INNER JOINs ist bei OUTER JOINs die Rei­hen­fol­ge der Tabellen im SQL-Statement zu beachten. Bei einem LEFT JOIN werden alle Da­ten­sät­ze der Tabelle links vom JOIN-Operator komplett aus­ge­ge­ben, bei einem RIGHT JOIN alle Da­ten­sät­ze der Tabelle rechts vom JOIN-Operator.

Als Ergebnis des LEFT OUTER JOINs erhalten wir folgende Tabelle.

Tabelle: LEFT OUTER JOIN über die Tabellen „mit­ar­bei­ter“ und „kfz“

m_id nachname vorname mit­ar­bei­ter.kfz_id kfz.kfz_id marke modell kenn­zei­chen baujahr hu
1 Schmidt Udo 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Müller Wolfgang 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Meyer Günther 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Krause Helmut 2 2 Opel Astra B PO 654 2010 12.08.2019
5 Fischer Hugo NULL NULL NULL NULL NULL NULL NULL

Die Er­geb­nis­ta­bel­le weist zwei Be­son­der­hei­ten auf:

Der Datensatz der Tabelle „kfz“ mit der kfz_id 4 (Porsche Boxster) taucht in der Er­geb­nis­ta­bel­le nicht auf. Der Grund dafür: Für einen Pri­mär­schlüs­sel mit dem Wert 4 existiert kein passender Fremd­schlüs­sel in der Tabelle „mit­ar­bei­ter“. Die Se­lek­ti­ons­be­din­gung ist nicht erfüllt. Der Datensatz entstammt der rechten Aus­gangs­ta­bel­le und wird daher aus­ge­blen­det.

Der Fremd­schlüs­sel kfz_id der Aus­gangs­ta­bel­le „mit­ar­bei­ter“ enthält für den Datensatz zum Mit­ar­bei­ter Hugo Fischer einen Nullwert. Es lässt sich somit kein ent­spre­chen­der Pri­mär­schlüs­sel in der Tabelle „kfz“ finden. Auch hier ist die Se­lek­ti­ons­be­din­gung also nicht erfüllt. Da der Datensatz jedoch der linken Aus­gangs­ta­bel­le entstammt, wird dieser bei einem LEFT JOIN trotzdem in die Er­geb­nis­ta­bel­le auf­ge­nom­men. Fehlende Werte im Tupel der Er­geb­nis­ta­bel­le werden auf NULL gesetzt.

SQL RIGHT OUTER JOIN

Der RIGHT OUTER JOIN folgt demselben Prinzip wie der LEFT OUTER JOIN, do­mi­nie­rend ist hier jedoch nicht die linke, sondern die rechte Tabelle.

Die Er­geb­nis­men­ge eines RIGHT OUTER JOIN umfasst alle Tupel der Tabelle auf der rechten Seite des JOIN-Operators sowie die Tupel der linken Tabelle, die die JOIN-Bedingung erfüllen. Als Operator kommt folgendes Symbol zum Einsatz: .

Wir gehen erneut von den Aus­gangs­ta­bel­len „mit­ar­bei­ter“ und „kfz“ aus und de­fi­nie­ren für den RIGHT JOIN dieselbe Se­lek­ti­ons­be­din­gung wie im Beispiel zum LEFT JOIN.

Re­la­tio­na­le Algebra:

mit­ar­bei­ter ⟖ kfz_id=kfz_idkfz

SQL-Statement:

SELECT * FROM mitarbeiter RIGHT JOIN kfz ON mitarbeiter.kfz_id = kfz.kfz_id;

Die Er­geb­nis­ta­bel­le des RIGHT JOINs un­ter­schie­det sich deutlich von der des LEFT JOINs.

Tabelle: RIGHT OUTER JOIN über die Tabellen „mit­ar­bei­ter“ und „kfz“

m_id nachname vorname mit­ar­bei­ter.kfz_id kfz.kfz_id marke modell kenn­zei­chen baujahr hu
1 Schmidt Udo 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Müller Wolfgang 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Meyer Günther 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Krause Helmut 2 2 Opel Astra B PO 654 2010 12.08.2019
NULL NULL NULL 4 4 Porsche Boxster B AA 123 2018 23.12.2020

Der Datensatz zum Mit­ar­bei­ter Hugo Fischer ist in der Er­geb­nis­ta­bel­le nicht enthalten. Der Grund dafür: Die kfz_id des Da­ten­sat­zes ent­spricht dem Wert NULL und lässt sich daher keinem Datensatz der rechten Tabelle zuordnen.

Als Ergebnis des RIGHT JOINs erhalten wir alle Da­ten­sät­ze der Tabelle „kfz“ – auch den Datensatz mit der kfz_id 4, dem kein Tupel der Tabelle „mit­ar­bei­ter“ zu­ge­wie­sen wurde. Fehlende Werte werden auch hier als Nullwerte aus­ge­ge­ben.

SQL FULL OUTER JOIN

Bei einem FULL OUTER JOIN handelt es sich um eine Kom­bi­na­ti­on aus LEFT OUTER JOIN und RIGHT OUTER JOIN. Für die Operation wurde in der re­la­tio­na­len Algebra folgender Operator definiert: .

Auch den FULL JOIN ver­an­schau­li­chen wir an den Aus­gangs­ta­bel­len „mit­ar­bei­ter“ und „kfz“ und gehen dabei von derselben Se­lek­ti­ons­be­din­gung aus wie zuvor.

Re­la­tio­na­le Algebra:

mit­ar­bei­ter ⟗ kfz_id=kfz_idkfz

SQL-Statement:

SELECT * FROM mitarbeiter FULL JOIN kfz ON mitarbeiter.kfz_id = kfz.kfz_id;

Das Ergebnis ent­spricht folgender Tabelle.

Tabelle: FULL OUTER JOIN für die Tabellen „mit­ar­bei­ter“ und „kfz“

m_id nachname vorname mit­ar­bei­ter.kfz_id kfz.kfz_id marke modell kenn­zei­chen baujahr hu
1 Schmidt Udo 3 3 BMW X6 B MW 780 2017 01.09.2018
2 Müller Wolfgang 1 1 VW Caddy B KH 778 2016 18.12.2018
3 Meyer Günther 1 1 VW Caddy B KH 778 2016 18.12.2018
4 Krause Helmut 2 2 Opel Astra B PO 654 2010 12.08.2019
5 Fischer Hugo NULL NULL NULL NULL NULL NULL NULL
NULL NULL NULL 4 4 Porsche Boxster B AA 123 2018 23.12.2020

Der FULL JOIN verbindet die Da­ten­sät­ze der Aus­gangs­ta­bel­len gemäß der Se­lek­ti­ons­be­din­gung, führt jedoch nicht nur die ver­bun­de­nen Da­ten­sät­ze in der Er­geb­nis­ta­bel­le auf, sondern auch die Da­ten­sät­ze beider Tabellen, die die Se­lek­ti­ons­be­din­gung nicht erfüllen.

Auch beim FULL JOIN werden fehlende Werte auf NULL gesetzt.

Hinweis

FULL OUTER JOINs haben in der Praxis eine geringe Bedeutung und werden von markt­füh­ren­den Datenbank-Ma­nage­ment­sys­te­men wie MySQL und MariaDB nicht un­ter­stützt.

NATURAL OUTER JOIN

Wie INNER JOINs lassen sich auch OUTER JOINs als NATURAL JOINs umsetzen. Die ent­spre­chen­den Ope­ra­to­ren lauten:

LEFT/RIGHT JOIN ... USING

Oder:

NATURAL LEFT/RIGHT JOIN

NATURAL OUTER JOINs verbinden Tabellen über gleich­na­mi­ge Spalten. Welche Spalten aus­ge­wählt werden, lässt sich mithilfe des USING-Schlüs­sel­worts explizit de­fi­nie­ren:

SELECT * FROM mitarbeiter LEFT JOIN kfz USING(kfz_id);

Al­ter­na­tiv können Sie auf eine Kurz­schreib­wei­se zu­rück­grei­fen, bei der das DMBS au­to­ma­tisch nach gleich­na­mi­gen Spalten sucht und die auf­ge­führ­ten Tabellen über diese verbindet:

SELECT * FROM mitarbeiter NATURAL LEFT JOIN abteilungen;

Bezogen auf die oben auf­ge­führ­ten Bei­spiel­ta­bel­len führen beide SQL-State­ments zum selben Ergebnis.

m_id nachname vorname kfz_id marke modell kenn­zei­chen baujahr hu
1 Schmidt Udo 3 BMW X6 B MW 780 2017 01.09.2018
2 Müller Wolfgang 1 VW Caddy B KH 778 2016 18.12.2018
3 Meyer Günther 1 VW Caddy B KH 778 2016 18.12.2018
4 Krause Helmut 2 Opel Astra B PO 654 2010 12.08.2019
5 Fischer Hugo NULL NULL NULL NULL NULL NULL

Beim NATURL LFET JOIN werden die Spalten mit­ar­bei­ter.kfz_id und kfz.kfz_id zur ge­mein­sa­men Spalte kfz_id zu­sam­men­ge­führt.

OUTER JOINs in der Praxis

OUTER JOINS führen in der Regel zu Ta­bel­len­ver­bün­den mit Null­wer­ten. Nützlich ist dies bei­spiels­wei­se dann, wenn man genau diese her­aus­stel­len möchte. In unserem Beispiel wurde der Porsche Boxster bisher noch keinem Mit­ar­bei­ter zu­ge­wie­sen. Der Tabelle „kfz“ ist dies nicht zu entnehmen. Und auch die Tabelle „mit­ar­bei­ter“ zeigt lediglich, dass Hugo Fischer bisher keinen Fir­men­wa­gen nutzt – nicht jedoch, welcher noch frei ist. Nach einem FULL JOIN über beide Tabellen ist auf einen Blick er­sicht­lich, dass Hugo zukünftig den Porsche fahren könnte.

Zum Hauptmenü