Verknüpfungen – Cross Joins, Inner Joins und Outer Joins

Bisher haben wir in unserer Datenbank immer nur auf einer Tabelle alleine gearbeitet. Das hätte man genau so gut auch noch in einem Tabellenkalkulationsprogramm wie Excel erledigen können. Das besondere an Datenbanken ist, dass die Tabellen untereinander kombinierbar sind (sein sollen) und somit Spalten aus beliebigen Tabellen zusammengeführt werden können. Dazu verknüpft man die gewünschten Tabellen untereinander. Diese Verknüpfung nennt man “join”.

Die einfachste Form einer Verknüpfung ist ein sogenannter CROSS JOIN. Hier wird ein kartesisches Produkt der Tabellen gebildet die miteinander verknüpft wurden.
Im Beispiel sieht das wie folgt aus:

SELECT k.kd_nr AS “Kundennummer”, k.name AS “Nachname”, k.vorname AS “Vorname”, o.plz AS “Postzleitzahl mal Kunden”
FROM kunden AS k CROSS JOIN ort as o;

CROSSJOIN

Was haben wir gemacht? Wir haben insgesamt 8 Kunden und 6 Orte. Bei einem CROSS JOIN wird jedem Wert der Tabelle Kunde jeder Wert der Tabelle Ort zugewiesen. Wir haben also je Kunde 6mal einen Ort zugewiesen. 8×6 ergibt 48.

Wir wollten aber sicherlich nicht wissen wo unsere Kunden überall wohnen könnten, sondern wir wollen wissen wo sie wohnen. Hier kommt der wohl gebräuchlichste JOIN in Frage. Der sogenannte INNER JOIN. Ein Beispiel:

SELECT k.kd_nr AS “Kundennummer”, k.name AS “Nachname”, k.vorname AS “Vorname”, o.ort AS “Wohnort”
FROM kunden AS k INNER JOIN ort AS o
ON k.plz = o.plz
ORDER BY k.kd_nr;

INNERJOIN

Sieht doch schon viel besser aus. Jetzt ist aber in der Abfrage einiges enthalten was einer Erklärung bedarf. Nehmen wir die Abfrage einmal Zeile für Zeile auseinander.

SELECT k.kd_nr AS “Kundennummer”, k.name AS “Nachname”, k.vorname AS “Vorname”, o.ort AS “Wohnort”

Die SELECT-Anweisung kennen wir. Dass vor “kd_nr” ein “k.” steht ist neu. Ebenso stehen solche Bezeichner auch vor allen anderen Attributen. Warum?
Ganz einfach. Wir arbeiten hier ja mit zwei Tabellen, der Tabelle “kunden” und der Tabelle “ort”. Damit der SQL-Server weiß, welches Attribut aus welcher Tabelle er auswählen soll müssen wir ihm das mitteilen. Wir könnten genauso gut schreiben: SELECT kunden.kd_nr AS “Kundennummer”, kunden.name AS “Nachname”…. In der Praxis wird aber mit kurzen Bezeichnern gearbeitet um den Aufwand gering zu halten. Woher aber weiß die SELECT Anweisung was mit “k.” und “o.” gemeint ist? Wie bereits im Abschnitt Datenbanabfragen angesprochen, wird die SELECT-Anweisung vom Server erst nach der FROM-Klausel ausgeführt. Das heisst:

FROM kunden AS k INNER JOIN ort AS o

In dieser Zeile werden die Bezeichner zugewiesen, die wir in der Zeile darüber bereits verwendet haben. Dieser Umstand führt am Anfang gerne zu Verwirrungen, aber wenn man sich die Reihenfolge der Abarbeitung vor Augen führt, kommt man sehr gut damit klar.

ON k.plz = o.plz

Hier entsteht die eigentliche Verknüpfung. Das “ON” schlägt die Brücke von einer Tabelle zur nächsten und benutzt dazu den Fremdschlüssel der einen Tabelle (kunden) und den Primärschlüssel der anderen Tabelle (ort). Wir haben die Tabellen also anhand ihrer Schlüsselattribute verknüpft.

Das “ORDER BY k.kd_nr;” hat hier rein kosmetische Gründe um die Ausgabe des Servers geordnet und überprüfbar darzustellen.

So wie wir die beiden Tabellen “kunden” und “ort” miteinander verbunden haben, können auch drei oder mehr Tabellen untereinander verknüpft werden.

Wir wollen wissen, welcher Lieferant welches Produkt herstellt und woher der Lieferant kommt:

SELECT  a.art_nr AS “Artikel Nummer”, a.art_bez AS “Produkt”, l.firmenname AS “Hersteller”, o.ort AS “Herkunftsort”
FROM artikel AS a INNER JOIN lieferanten AS l
ON a.lieferant_nr = l.lieferanten_nr
INNER JOIN ort AS o
ON l.plz = o.plz;

 JOINmitDreiTabellen

Was haben wir gemacht? Wir haben die Tabelle Artikel über das Schlüsselattribut(fremd) “lieferant_nr” mit der Tabelle “lieferanten” und dem dortigen Schlüsselattribut(primär) “lieferanten_nr” verknüpft und wollten aus beiden Tabellen die Attribute “art_nr”, “art_bez” und “firmenname” ausgeben. Darüberhinaus haben wir die verknüpften Tabellen (“artikel” und “lieferanten” ) über das Fremdschlüsselattribut “plz” der Tabelle “lieferanten” mit der Tabelle “ort” über deren Primärschlüssel “plz” miteinander verknüpft und uns den Ort als Herkunftsort ausgeben lassen.

Das Thema “Joins” ist zugegebenermaßen ein sehr komplexes Gebiet und man sollte sich nicht entmutigen lassen, wenn es nicht auf Anhieb eingängig erscheint. Im nächsten Teil widmen wir uns den OUTER JOINS, aber zunächst lassen wir CROSS- und INNER JOIN einmal sacken.

Ein Gedanke zu „Verknüpfungen – Cross Joins, Inner Joins und Outer Joins

  1. Pingback: Die Beiträge im Überblick | SQL – Arbeiten mit Datenbanken

Hinterlasse eine Antwort

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

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>