Wikipedia · einfach zusammengefasst · Stand
Join (SQL)
Ein SQL-Join (deutsch: Verbund) bildet aus den Datensätzen zweier Tabellen einer relationalen Datenbank eine Ergebnistabelle, deren Datensätze Attribute beider …
Inhalt5 Abschnitte
Grundidee und Beispieltabellen
Ein SQL-Join, auf Deutsch Verbund, verknüpft Datensätze aus zwei Tabellen einer relationalen Datenbank zu einer Ergebnistabelle. Diese Ergebnistabelle enthält Attribute beider Tabellen. Welche Datensätze zusammengehören, bestimmt eine Verbundbedingung. Damit setzt SQL das Konzept des Verbunds aus der relationalen Algebra um.
Der SQL-Standard unterscheidet mehrere Arten von Joins: das kartesische Produkt als CROSS JOIN, den inneren Verbund mit NATURAL JOIN und weiteren Varianten, sowie den äußeren Verbund mit LEFT OUTER JOIN, RIGHT OUTER JOIN und FULL OUTER JOIN. Ein Spezialfall ist der Self Join, bei dem eine Tabelle mit sich selbst verbunden wird.
Die Beispiele verwenden die Tabellen Mitarbeiter und Abteilung. Mitarbeiter enthält MId, Name und AbtId. Abteilung enthält AbtId und AbtName. In den Beispieldaten haben Müller, Schmidt und ein weiterer Müller Abteilungen mit den AbtId 31 oder 32. Meyer hat bei AbtId den Wert NULL, also in SQL einen unbekannten Wert. Die Abteilung Marketing mit AbtId 33 hat keine zugeordneten Mitarbeiter.
CROSS JOIN und innere Joins
Ein CROSS JOIN bildet das kartesische Produkt zweier Tabellen: Jeder Datensatz der ersten Tabelle wird mit jedem Datensatz der zweiten Tabelle kombiniert. Bei 4 Mitarbeitern und 3 Abteilungen entstehen deshalb 4 × 3 Datensätze. Wenn beide Tabellen gleichnamige Attribute besitzen, werden sie durch Voranstellen des Tabellennamens unterscheidbar gemacht, zum Beispiel Mitarbeiter.AbtId und Abteilung.AbtId. Seit SQL-92 kann man CROSS JOIN ausdrücklich schreiben; im SQL-Standard von 1989 wurde dieselbe Wirkung mit FROM Mitarbeiter, Abteilung erreicht.
Ein innerer Verbund liefert nur die Kombinationen, die eine Verbundbedingung erfüllen. Meist verlangt diese Bedingung Gleichheit bestimmter Attributwerte, sie kann aber auch andere Vergleichsoperatoren enthalten.
Beim NATURAL JOIN werden automatisch alle gleichnamigen Attribute beider Tabellen verglichen. Im Beispiel ist das gemeinsame Attribut AbtId. Das Ergebnis enthält nur Mitarbeiter, deren AbtId zu einer Abteilung passt: M1 Müller mit Verkauf, M2 Schmidt mit Technik und M3 Müller mit Technik. Meyer erscheint nicht, weil keine Abteilung zugeordnet ist; Marketing erscheint nicht, weil es keine Mitarbeiter hat. Da die verglichenen AbtId-Werte gleich sind, steht AbtId im Ergebnis nur einmal.
JOIN ... USING ... erlaubt, die Vergleichsattribute ausdrücklich anzugeben, zum Beispiel USING (AbtId). Im Beispiel ergibt das dasselbe Ergebnis wie NATURAL JOIN. Diese Form ist vorzuziehen, weil spätere gleichnamige Attribute nicht unbeabsichtigt in den Vergleich einbezogen werden. Wenn etwa beide Tabellen zusätzlich ein Attribut Ort hätten, würde NATURAL JOIN sowohl AbtId als auch Ort vergleichen, obwohl das für die Zuordnung der Abteilungen nicht beabsichtigt sein muss.
JOIN ... ON ... wird verwendet, wenn die zu vergleichenden Attribute unterschiedlich heißen oder wenn ein anderer Operator als = genutzt werden soll. Im Beispiel lautet die Bedingung ON Mitarbeiter.AbtId = Abteilung.AbtId. Das Ergebnis entspricht inhaltlich JOIN ... USING ..., aber beide verglichenen Attribute können im Ergebnis erscheinen. Die Formen mit Gleichheitsbedingung heißen Equijoin oder Gleichverbund. Wenn bei JOIN ... ON ... eine beliebige andere Bedingung genutzt wird, etwa mit ≤, spricht man von einem Theta-Join. Das optionale Schlüsselwort INNER kann bei JOIN ... USING ... und JOIN ... ON ... ergänzt werden.
Äußere Joins
Äußere Joins werden verwendet, wenn auch Datensätze erscheinen sollen, zu denen es in der anderen Tabelle keine passende Entsprechung gibt. Das ist wichtig bei unbekannten oder fehlenden Informationen. In den Beispieltabellen betrifft das Meyer, der keiner Abteilung zugeordnet ist, und Marketing, dem keine Mitarbeiter zugeordnet sind.
Ein LEFT OUTER JOIN enthält alle Datensätze der linken Tabelle, also der Tabelle links vom Schlüsselwort JOIN. Gibt es in der rechten Tabelle keinen passenden Datensatz, werden deren fehlende Werte mit NULL aufgefüllt. Bei Mitarbeiter LEFT OUTER JOIN Abteilung USING (AbtId) erscheinen alle Mitarbeiter. Für Meyer stehen die Abteilungsattribute auf NULL. Das Wort OUTER ist optional, kann aber zur Klarheit geschrieben werden.
Ein RIGHT OUTER JOIN bildet zunächst den inneren Verbund und ergänzt Datensätze aus der rechten Tabelle, zu denen links nichts passt. Bei Mitarbeiter RIGHT OUTER JOIN Abteilung USING (AbtId) erscheint zusätzlich die Abteilung Marketing. Da ihr kein Mitarbeiter zugeordnet ist, sind MId und Name NULL. Ein typisches Anwendungsbeispiel ist eine Abfrage, die alle Abteilungen mit der Anzahl ihrer Mitarbeiter ausgibt. Mit GROUP BY und count(MId) erhält man Verkauf 1, Technik 2 und Marketing 0. Dafür ist ein äußerer Verbund nötig, weil Marketing bei einem inneren Verbund gar nicht vorkäme.
Ein FULL OUTER JOIN ist die Vereinigungsmenge der Ergebnisse von LEFT OUTER JOIN und RIGHT OUTER JOIN. Im Beispiel enthält er sowohl Meyer ohne Abteilung als auch Marketing ohne Mitarbeiter.
Self Join und mehrere Tabellen
Ein Self Join verbindet eine Tabelle mit sich selbst. Dabei werden Datensätze derselben Tabelle miteinander verglichen. Damit SQL zwei Datensätze derselben Tabelle gleichzeitig unterscheiden kann, braucht man zwei explizite Tupelvariablen, also Aliasnamen für dieselbe Tabelle.
Im Beispiel sollen Mitarbeiter mit gleichem Namen, aber verschiedener MId gefunden werden. Dazu wird Mitarbeiter zweimal verwendet, etwa als MA und MB. Die Bedingung MA.MId <> MB.MId AND MA.Name = MB.Name findet M1 Müller und M3 Müller. SQL erzeugt bei SELECT-Anweisungen grundsätzlich eine Tupelvariable für jede Tabelle; normalerweise heißt sie wie die Tabelle selbst. Beim Self Join werden zwei solche Variablen für dieselbe Tabelle benötigt.
Joins können auch mit mehr als zwei Tabellen gebildet werden, weil eine Tabellenreferenz selbst wieder ein Join sein kann. Wenn zusätzlich eine Tabelle Adresse existiert, kann man beispielsweise Mitarbeiter mit Adresse über AdrId und anschließend mit Abteilung über AbtId verbinden. Der innere Verbund ist, abgesehen von der Reihenfolge der Attribute im Ergebnis, kommutativ und assoziativ. Der äußere Verbund ist nicht kommutativ und im Allgemeinen auch nicht assoziativ. Wenn mehrere Tabellen und verschiedene Join-Formen kombiniert werden, sind Klammern zur Klarheit ratsam.
Unterschiede zwischen Datenbanksystemen
Datenbankmanagementsysteme weichen teilweise vom SQL-Standard ab oder bieten eigene Schreibweisen. IBM Db2 unterstützt NATURAL JOIN nicht. Microsoft SQL Server verwendet den SQL-Dialekt Transact-SQL und unterstützt NATURAL JOIN sowie JOIN ... USING ... nicht; dort gibt es nur die Variante mit ON, mit der sich aber alle Aufgabenstellungen bewältigen lassen.
MySQL unterstützt alle Join-Formen entsprechend SQL-92, hat aber zusätzlich STRAIGHT JOIN. Damit wird dem Anfrageoptimierer die Reihenfolge vorgegeben, in der der Join ausgeführt werden soll. MySQL unterstützt FULL [OUTER] JOIN nicht; diese Form kann mit LEFT/RIGHT OUTER JOIN und UNION nachgebildet werden.
Oracle hatte eine proprietäre Syntax für äußere Joins. Erst 2001 mit Version 9 wurde die SQL-92-Syntax für äußere Joins eingeführt; heute empfiehlt Oracle die dem SQL-Standard entsprechende Syntax. PostgreSQL unterstützt alle Join-Formen entsprechend SQL-92. SQLite unterstützt nur LEFT OUTER JOIN; RIGHT OUTER JOIN und FULL OUTER JOIN können dort mit LEFT OUTER JOIN und UNION nachgebildet werden.
Lernvideos zu Join (SQL)
6:55
Join in SQL - SQL 9
Informatik - simpleclub · 250.841 Aufrufe
10:23
Joins in SQL. Einfach erklärt (Left-Join, Right-Join, Cross-Join, Left-Anti-Join)
Patrick Boekhoven · 33.895 Aufrufe
5:23
INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN in 5 Minuten erklärt
biservices · 71.401 Aufrufe
9:47
6 SQL Joins you MUST know! (Animated + Practice)
Anton Putra · 627.967 Aufrufe