1
In diesem Abschnitt wollen wir uns mit einem besonderen Thema widmen. Dem Thema SQL-JOIN. Logisch angesiedelt ist dieses Thema bei dem SQL-DML Anweisungen, da es sich um einen besonderen Aspekt bei Select Anweisungen handelt. Zunächst müssen wir klären, was JOIN überhaupt ist, bevor wir uns dann mit den einzelnen Formen von JOINs auseinander setzen. Wie man der Abbildung entnehmen kann, gibt es sogenannte INNER und OUTER Joins. Diese wollen wir uns näher ansehen. 2
JOIN bedeutet zunächst verbinden. Es geht also darum, mehrere Tabellen miteinander zu verbinden. Wir beschränken uns auf das Verknüpfen zweier Tabellen, um die Grundproblematik zu verstehen. Das Verknüpfen von mehr als zwei Tabellen erfolgt dann analog. Doch was bedeutet nun genau Zwei Tabelle zu verbinden? Wie in der Abbildung dargestellt, betrachten wir zunächst zwei Tabellen. Nun geht es darum die Daten der beiden Tabellen (Tabellenzeilen) miteinander so zu verknüpfen, so dass wir als Ergebnis eine einzige Tabelle erhalten. Dies bedeutet, dass wir angeben müssen, wie die Zeilen aus den jeweiligen Tabellen zugeordnet werden sollen. Dies genau passiert in der sogenannten JOIN-Bedingung. Wie genau so ein JOIN-Bedingung ist, sehen wir uns als nächstes anhand eines Beispiels an. 3
Um zu verstehen, was ein JOIN genau ist, schauen wir uns das Beispiel in der Abbildung genauer an. Wir haben zwei Tabellen: 1. Tabelle A mit den Spalten Name und Ort Diese Tabelle enthält also sowas wie den Wohnort einer Person. 2. Tabelle B mit den Spalten Name und Arbeitgeber Diese Tabelle enthält also sowas wie den Arbeitgeber einer Person. Für das Verständnis von JOINS spielt es keine Rolle, ob es einen Primärschlüssel gibt und wenn ja, wie der genau aussieht. Daher benötigen wir diese Angaben hier nicht. Die Aufgabe Nun soll die Aufgabe darin bestehen, genau eine Liste zu erstellen, aus denen der Wohnort UND der Arbeitgeber einer Person hervorgeht. Die Lösung mittels JOIN Hierzu müssen wir nun die Inhalte beider Tabellen zusammenfassen. Wenn wir davon ausgehen können, dass die Verbindung bzw. Verknüpfung der Zeilen auf der Spalte Namen basiert, können wir nun folgende SELECT Anweisung erstellen. 4
SELECT * FROM TabelleA, TabelleB WHERE TabelleA.name = TabelleB.name Um den JOIN zu verstehen, schauen wir uns das Statement mal ganz genau an auf der nächsten Abbildung. 4
In Zeile (1) sehen wir zunächst eine Select-Klausel, die besagt, dass die Ergebnismenge alle Spalten enthalten sollen, die sich auf der Basis der FROM und WHERE Klausel ergeben. Alternativ hätten wir hier auch schreiben können Select TabelleA.*, TabelleB.* In Zeile (2) sehen wir, dass dort zwei Tabellennamen aufgeführt sind. Die Tabellen Namen sind durch ein Komma getrennt. In JOINs, mit mehr als zwei Tabellen, sind hier als alle Tabellen aufzuführen, die beim JOIN beteiligt sind. In Zeile (3) sehen wir die JOIN. Diese bedeutet, dass der in einer Zeile der TabelleA der Wert in der Spalte name mit dem Wert aus der Spalte name aus der TabelleB GLEICH (=) ist Dann werden die beiden Zeilen zu einer Zeile zusammengefasst. Diese neue Zeile enthält dann alle Spalten der jeweiligen Tabelle. Wie das Ergebnis aussieht, sehen wir in der nächsten Abbildung: 5
TIPP: Führen Sie nun aus dem Übungsbuch, die Übungen zum Thema INNER JOIN durch. 5
Bei dem Ergebnis werden vereinfacht ausgedrückt- die jeweils korrespondierenden Zeilen hintereinander gehängt. Machen wir uns dies wieder anhand zweier Beispiel-Zeilen klar. Der Name Müller kommt in beiden Tabellen vor. Er genügt also der JOIN- Bedingung. aus der Zeile aus TabelleA = ( Müller, Berlin ) Und Aus der Zeile aus TabelleB = ( Müller, Regional GmbH ) Wird eine neue Zeile = ( Müller, Berlin, Müller, Regional GmbH ) Also ( TabelleA.name, TabelleA.ort, TabelleB.name, TabelleB.arbeitgeber) Hinweis: 6
Würde in der Tabelle TablleB der Name Müller mehrmals auftreten (Haupt- und Neben-Arbeitgeber), dann hätten wir in der Ausgabe 2 Zeilen. 6
In dem vorherigen Beispiel haben wir ein einfaches Beispiel für einen sogenannten INNER-JOIN gesehen. Da wir als Bedingung eine = (equal) angegeben haben, spricht man in diesem Fall von einem EQUAL-JOIN. Das charakteristische an INNER JOINs ist, dass wir eine Bedingung angeben und immer an einem Ergebnis interessiert sind, bei dem die Bedingung zutrifft. Wenn es nun einen INNER JOIN gibt, so stellt sich die Frage Gibt es noch andere JOIN Arten? Gibt es auch einen OUTER JOIN (wenn es schon einen INNER-JOIN gibt ) Die Antwort lautet in beiden Fällen JA! Den OUTER-JOIN schauen wir uns als nächstes an. 7
Während man bei dem INNER-JOIN an der Ergebnismenge interessiert ist, auf deren Element die Bedingung zutrifft, gibt es in der Praxis Fälle. bei denen man immer alle Sätze einer Tabelle haben will. Sofern für eine Zeile keine passende Zeile in der Partnertabelle gefunden wird, dann sollen die Spaltenwerte mit NULL gefüllt werden. Weil dies etwas abstrakt klingt, machen wir uns den OUTER-JOIN wieder an einem Beispiel klar. In der Abbildung sind wieder unsere Tabellen A und B zu finden. Diesmal geht es um folgende Anforderung / Zielsetzung: Anforderung: Gebe mir eine Liste aller Namen aus Tabelle A mit den zugehörigen Arbeitgebern. Sofern für einen Namen KEIN Arbeitgeber eingetragen ist, so soll der Eintrag aus der Tabelle A trotzdem in der Ergebnisliste erscheinen inkl. der Spaten aus der Tabelle B. Die Spaltenwerte der Tabelle B sollen in diesem Fall mit NULL gefüllt sein. Diese Aufgabe ist am einfachsten zu lösen mit einem OUTER-JOIN. 8
Dieser sieht wie folgt aus: select * from wohnorte left outer join arbeitgeber on wohnorte.name = arbeitgeber.name Wie Sie an dem SELECT Befehl sehen, können wir die JOIN Bedingung durch das Schlüsselwort ON einleiten. Nach der JOIN Bedingung können Sie wie immer die WHERE Bedingung einfügen, wie in nachfolgendem Beispiel aufgeführt: select wohnorte.*, arbeitgeber.* from wohnorte right outer join arbeitgeber on wohnorte.name = arbeitgeber.name where wohnorte.name ='Schmidt TIPP: Führen Sie nun aus dem Übungsbuch die Aufgaben zu dem Thema OUT-JOIN durch LEFT or RIGHT --- that s the question Das Zusatz Left in dem left outer join gibt dabei an, dass alle Sätze aus der Tabelle, dessen Name auf der LINKEN Seite der JOIN Bedingung aufgeführt ist sind, in der Ergebnismenge enthalten sein sollen. Somit gibt es auch einen RIGHT OUTER JOIN. In diesem Fall bedeutet dies, dass in der Ergebnismenge als Sätze aus der Tabelle dessen Name auf der RECHTEN Seite der JOIN Bedingung aufgeführt ist sind, in der Ergebnismenge enthalten sein sollen. 8
Somit sieht ein RIGHT JOIN wie folgt aus Select * From TabelleA right outer join TabelleB On TabelleA.name = TabelleB.name Sonderübung: Überlegen, wie die Anforderung umformuliert werden müsste, wenn sie wie oben aufgeführt- einen RIGHT JOIN verwenden. 8
9
10