Mit Hilfe von Joins lassen sich Datenbank-Tabellen einfach in SQL-Anweisungen verknüpfen.

Ich möchte die Tabelle ‚Autor‘ mit der Tabelle ‚Buch‘ verknüpfen. Hier die Tabellenstruktur:

Autor-Tabelle Buch-Tabelle
ID NAME
1 Autor 1
2 Autor 2
3 Autor 3
4 Autor 4
ID NAME AUTOR_ID
1 Buch 1 1
2 Buch 2 1
3 Buch 3 3
4 Buch 4 4

Als erstes benötigt man in jeder der zu verknüpfenden Tabellen eine Spalte über die beide Tabellen verknüpft werden können. Dies ist in der Autor-Tabelle die Spalte ‚ID‘. In der Buch-Tabelle gibt es die Spalte ‚AUTOR_ID‘, die als sinnvolle Verknüpfungsspalte genutzt werden kann.

Die einfachste Select-Anweisung um beide Tabelle zu verknüpfen ist:

select * from autor, buch;

ID NAME ID TITEL AUTOR_ID
1 Autor 1 1 Buch 1 1
2 Autor 2 1 Buch 1 1
3 Autor 3 1 Buch 1 1
4 Autor 4 1 Buch 1 1
1 Autor 1 2 Buch 2 1
2 Autor 2 2 Buch 2 1
3 Autor 3 2 Buch 2 1
4 Autor 4 2 Buch 2 1
1 Autor 1 3 Buch 3 3
2 Autor 2 3 Buch 3 3
3 Autor 3 3 Buch 3 3
4 Autor 4 3 Buch 3 3
1 Autor 1 4 Buch 4 4
2 Autor 2 4 Buch 4 4
3 Autor 3 4 Buch 4 4
4 Autor 4 4 Buch 4 4

Für diese Verknüpfung beider Tabellen hätten wir nicht mal die zu verknüpfenden Spalten in jeder Tabelle gebraucht. In diesem Fall hier wurde praktisch jeder Datensatz aus der Autor-Tabelle jedem Datensatz aus der Buch-Tabelle zugeordnet.

Nun wollen wir aber die beiden Tabellen über die ID des Autors verknüpfen:

select * from autor a, buch b where a.id = b.autor_id;

ID NAME ID TITEL AUTOR_ID
1 Autor 1 1 Buch 1 1
1 Autor 1 2 Buch 2 1
3 Autor 3 3 Buch 3 3
4 Autor 4 4 Buch 4 4

Durch die where-Bedingung werden jetzt nur noch die Datensätze der ersten Abfrage angezeigt, bei denen die AUTOR_ID übereinstimmt. Mit dieser Anweisung wurde auch schon ein Join benutzt, der ‚inner join‘.

Man kann obige Anweisung auch schon schreiben, dass der Join in der Anweisung vorkommt:

select * from autor a join buch b where a.id = b.autor_id;

Ein weitere Alternative der Select-Anweisung entsteht, wenn man die where-Bedingung des Joins direkt vorzieht:

select * from autor a join buch b on a.id = b.autor_id;

Beim jetztigen Ergebnis werden aber nur Autoren angezeigt, die auch ein zugeordnetes Buch haben. Hat ein Autor mehrere zugeordnete Bücher, so erscheint er auch öfters in der Ergebnistabelle.

Jetzt wollen wir alle Autoren anzeigen, egal ob sie ein zugeordnetes Buch besitzen oder nicht. Dazu benutzen wir den ‚left join‘:

select * from autor a left join buch b on a.id = b.autor_id;

ID NAME ID TITEL AUTOR_ID
1 Autor 1 1 Buch 1 1
1 Autor 1 2 Buch 2 1
2 Autor 2 NULL NULL NULL
3 Autor 3 3 Buch 3 3
4 Autor 4 4 Buch 4 4

Nun erscheint auch Autor 2 in der Ergebnistabelle. Da er aber kein zugeordnetes Buch besitzt, kommen in den Buchspalten keine Werte, angezeigt durch ‚NULL‘.

Ein ‚left join‘ bedeutet das die Inhalte der Tabelle auf der linken Seite des Joins (Autor) komplett angezeigt werden, auch wenn keine Daten hierzu in der rechten Tabelle existieren.

Natürlich gibt es auch einen ‚right join‘. In diesem Fall werden dann immer alle Daten der rechten Seite in der Ergebnistabelle auftauchen, auch wenn in diesem Fall kein Autor für ein Buch existiert.

Nun wollen wir noch mehr als 2 Tabellen verknüpfen. Dazu benutzen wir obiges Beispiel: Ein Buch kann mehr als einen Autor besitzen, um nun die Zuordnung der Autoren zu den Büchern vorzunehmen, benutzen wir ein extra Tabelle, die wir als Verknüpfungstabelle zwischen Autor und Buch benutzen.

AUTOR_ID BUCH_ID
1 1
3 1
3 3
4 4
1 2

Die neue Tabelle ‚AUTOR_BUCH‘ ersetzt somit die Spalte AUTOR_ID in der Buch-Tabelle und bietet die Möglichkeit nun mehrere Autoren für ein Buch anzugeben. Nun wollen wir aber die obige ‚inner join‘-Anweisung umschreiben, um die neue Struktur einzubauen:

select a.name, b.titel from autor a, autor_buch ab, buch b where a.id = ab.autor_id and ab.buch_id = b.id;

NAME TITEL
Autor 1 Buch 1
Autor 3 Buch 1
Autor 3 Buch 3
Autor 4 Buch 4
Autor 1 Buch 2

Wir bekommen im Prinzip das gleiche Ergebnis, nur Buch 1 hat 2 Autoren. So wie es in der Verknüpfungstabelle angegeben wurde.

Jetzt schreiben wir die Select-Anweisung wieder mit Joins:

select a.name, b.titel from autor a join autor_buch ab on (ab.autor_id = a.id) join buch b on (b.id = ab.buch_id);

Wollen wir nun wieder alle Autoren angezeigt bekommen, so ersetzen wir den Join durch einen ‚left join‘:

select a.name, b.titel from autor a join autor_buch ab on (ab.autor_id = a.id) join buch b on (b.id = ab.buch_id);

NAME TITEL
Autor 1 Buch 1
Autor 1 Buch 2
Autor 2 NULL
Autor 3 Buch 1
Autor 3 Buch 3
Autor 4 Buch 4

Alternativ reicht es auch den ersten Join durch einen Left Join zuersetzen. Hier muss dann aber die ‚on‘-Bedingung zwischen AUTOR und AUTOR_BUCH ans Ende gesetzt werden:

select a.name, b.titel from autor a left join autor_buch ab join buch b on (b.id = ab.buch_id) on (ab.autor_id = a.id);

  2 Antworten zu “SQL – Tabellen verknüpfen mit Join”

  1. […] benutzen das Beispiel, dass wir in diesem Artikel beschrieben haben, um Tabellen miteinander zu verknüpfen. Dort haben wir die Tabellen Autor, Buch […]

  2. Du hast einen kopie paste fehler gemacht 🙂

    du hast

    select a.name, b.titel from autor a join autor_buch ab on (ab.autor_id = a.id) join buch b on (b.id = ab.buch_id);

    zweimal, beim zweiten mal sollte „join“ durch „left join“ ersetzt werden

 Antworten

   
Impressum Suffusion theme by Sayontan Sinha