SQL: RIGHT JOIN und LEFT JOIN

Der Befehl RIGHT JOIN gibt alle Datensätze der rechten Tabelle aus. In manchen Datenbankmanagementsystemen wird der Befehl RIGHT OUTER JOIN genannt. Wenn kein Match in der linken Tabelle existiert, wird der Datensatz hier mit NULL aufgefüllt. Im folgenden Venn-Diagramm ist die resultierende Ausgabemenge blau eingefärbt:

Die allgemeine SQL-Syntax lautet:

SELECT column_name FROM tableA RIGHT JOIN tableB ON tableA.column_name = tableB.column_name;

Beim LEFT JOIN werden, alle Datensätze aus der linken Tabelle ausgegeben:

Der allgemeine SQL-Code lautet:

SELECT column_name FROM tableA LEFT JOIN tableB ON tableA.column_name = tableB.column_name;

Wie immer werde ich für mein Beispiel die Testdatenbank Sakila nutzen.  Z.B. möchte man wissen zu welchen Filmen keine Darstellerinformation in der Datenbank existiert, also die Actor_id = NULL ist. Beachte, dass in der SQL-Syntax die „Basistabelle“, zu der man Informationen durch einen JOIN hinzufügen möchte (hier die Tabelle FILM) rechts vom JOIN steht. Die Verknüpfung der Tabellen wird in der ON-Bedingung mit Hilfe von eindeutigen Fremdschlüsseln definiert, hier die Film_ID:

RIGHT JOIN zwischen den Tabellen FILM  und FILM_ACTOR:

SELECT b.film_id, b.title, a.* FROM film_actor a

RIGHT JOIN film b USING (film_id)

WHERE a.actor_id IS NULL

Zur besseren Lesbarkeit des SQL-Codes habe ich einige Verkürzungen genutzt, die ich hier nochmal erläutern werde:

Für die beiden Tabellen habe ich die Aliasse a und b vergeben, diese ermöglichen uns einen übersichtlicheren SQL-Code und es muss nicht mehr der komplette Tabellenname ausgeschrieben werden, sondern nur der Alias der definiert wurde: “FROM film_actor a RIGHT JOIN film b“. Außerdem nutze ich den Befehl USING anstatt ON, das ist allerdings nur möglich, wenn die Spaltennamen der Schlüssel in den beiden Tabellen identisch sind.

Durch den RIGHT JOIN werden alle Datensätze aus der rechten Tabelle (rechts vom JOIN Befehl stehend) hier also der FILM Tabelle ausgegeben, denen keine Darsteller zugeordnet sind:

Wir können uns auch alle Filme mit den entsprechenden Schauspielern ausgeben lassen:        

SELECT b.film_id, b.title, a.* FROM film_actor a

RIGHT JOIN film b USING (film_id)

Das ergeben bei einem RIGHT JOIN 5.465 Datensätze (DS), da alle Filme ausgegeben werden, auch die ohne Schauspielerinformationen.

Möchten wir uns zu der ACTOR_ID zusätzlich auch den Namen der Schauspieler ausgeben lassen müssen wir einen zusätzlichen JOIN zu der ACTOR Tabelle definieren. Mit Hilfe der Actor_ID als Schlüssel können wir ohne Probleme einen JOIN zur ACTOR Tabelle herstellen:

Beachtet werden muss, dass wir nun einen LEFT JOIN ausführen müssen, wenn wir den JOIN ans Ende des SQL-Codes setzen, da sonst die 3 Datensätze ohne Schauspielerinformation wegfallen:

SELECT b.film_id, b.title, c.* FROM film_actor a

RIGHT JOIN film b USING (film_id)

LEFT JOIN actor c USING (actor_id)

Anbei einen Überblick der Resultsets bei den verschiedenen JOIN Arten:

(Visited 1.844 times, 1 visits today)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert