Nicht Joints rauchen, sondern Joins setzen

Hier eine kurze Einführung über Joins in SQL.

Was sind Joins?
Mit Joins hat man die Möglichkeit “Mehr-Tabellen-Abfragen” zu machen. Wenn ich z.B. sehen möchte, Welcher Kunde, welches Produkt bestellt hat, werde ich diese Information wahrscheinlich (bei guten Datenbankdesign) nicht in einer Tabelle finden. Jetzt gibt es fünf verschiedene Joins um Tabellen mit einander zu verknüpfen.

INNER JOIN

Was passiert beim Inner Join? Beim Inner Join werden nur Datensätze ausgegeben die einen Partner in der Verknüpfungstabelle haben. Das fällt mir schwer das in die richtigen Worte zufassen, deshalb hier eine Grafik die das Prinzip erläutern sollte.

Beziehung

Wie hier unschwer zu sehen ist, besteht eine 1:n Beziehung zwischen der Customers-Tabelle und der Orders-Tabelle. Nun will ich mit einer Abfrage den Companyname haben und die dazu gehörige Freight(Frachtkosten). Syntax würde so ausschauen:

Select Companyname, Freight from Customers o
inner join Orders o on c.customerid = o.customerid


Da ich jetzt den Inner Join verwendet habe, bekomme ich NUR Einträge bei denen Kunden auch Bestellung gemacht haben. Kunden die keine Bestellung gemacht haben, haben auch keine Customerid in der Orders-Tabelle. Bestellungen die keinen Kunde haben tauchen ebenfalls nicht auf, falls das möglich wäre. Die Customerid ist in diesem Fall die Prüfspalte.

FULL OUTER JOIN

Dem Outer Join ist eigentlich egal ob der einen “Partner” in der anderen Tabelle findet oder nicht, er listet sowieso jeden Datensatz auf. Das bedeutet wenn ich für meine Abfrage auch die Kunden brauch die nie eine Bestellung gemacht haben, könnte ich den Outer Join verwenden.

Jeder Datensatz der rechten und der linken Tabelle kommt in die Ergebnismenge. Findet sich über das ON-Kriterium ein passender Partner werden beide zusammengefügt, andernfalls wird die jeweils fehlende Seite mit NULL aufgefüllt.

Beispiel zum FULL OUTER JOIN:

Select Companyname, Freight from Customers c
full outer join Orders o on C.Customerid = O.Customerid
full outer join [Order Details] od on od.Orderid = o.Orderid

Mit diesem Statement hab ich gleich zwei Tabellen gejoint und in diesem Fall würde ich alle Einträge bekommen, egal ob eine Kunde eine Bestellung hat oder nicht, was kein Vorteil ist, denn umso mehr Datensätze verglichen werden müssen umso länger dauert die Abfrage.


LEFT OUTER JOIN/RIGHT OUTER JOIN

Bei einem Left Join wird ein Datensatz der aus der linken Tabelle kommt in jedem Fall in das Ergebnis geschrieben. Wenn ein Datensatz der rechten Tabelle dem ON-Kriterium entspricht, so wird er entsprechend in den Spalten eingetragen, ansonsten bleiben die Spalten leer, also NULL. Der RIGHT JOIN arbeitet entgegengesetzt. Ein Left oder Right Join ist nichts anderes als ein Outer Join auf die Linke bzw. Rechte Tabelle.

 

CROSS JOIN

CROSS JOINs, die keine WHERE-Klausel aufweisen, erzeugen das kartesische Produkt aus den Join beteiligten Tabellen. So entspricht die Größe des Resultsets eines Kartheisches Produkt der Anzahl der Zeilen in der ersten Tabelle multipliziert mit der Anzahl der Zeilen in der zweiten Tabelle.

Beispiel zum CROSS JOIN:

Select * from Customers
cross join Orders


Wie man vielleicht schon bemerkt hat, kann man sich beim Cross Join die On-Anweisung sparen da sowieso alles mit allem multipliziert wird. Allerdings ist die Benutzung des Cross Joins sehr gering, da er doch eine etwas spezielle “Persönlichkeit” hat.

Kommentare sind geschlossen