In diesem Artikel lernen wir die Grundlagen des Verbindens von Tabellen in SQL kennen. Wir werden etwas über linke, rechte, innere und äußere JOINs lernen und Beispiele geben, wie man sie verwendet.
Daten in einem RDBMS (Relational Database Management System) werden in Tabellen gruppiert. Diese Tabellen haben eine starre Definition des Datentyps, der in ihnen gespeichert werden kann. Um verschiedene Tabellen und damit verschiedene Arten von Daten, die sich möglicherweise aufeinander beziehen, zu verbinden, verwenden wir die JOIN-Klausel.
Arten von JOINs
Es gibt vier Grundtypen von JOINs:INNER, OUTER, LEFT und RIGHT. Wenn zwei Tabellen verbunden werden, geben sie jeweils eine andere Teilmenge der entsprechenden Tabellen zurück, basierend auf der Bedingung in der ON-Klausel.
- LEFT- und RIGHT-JOINs führen eine ähnliche Aufgabe aus. Beide geben die Gesamtheit einer einzelnen Tabelle mit Informationen zurück, die sich auf die zweite Tabelle beziehen.
- INNER und OUTER JOINs erfüllen sehr unterschiedliche Aufgaben. INNER JOINs erzeugen ein sehr begrenztes Ergebnis, während OUTER einen vollständigen Datensatz zurückgibt.
In diesem Beispiel verwenden wir für dieses Tutorial das Beispiel einer Verkaufsabteilung und verwenden drei Tabellen:Verkäufer, Bestellungen und Kunden.
Die Tabelle der Verkäufer enthält drei Spalten:ID, Name und Provisionsrate.
Als nächstes enthält die Bestelltabelle vier Spalten:die Bestell-ID, die Gesamtkosten der Bestellung, den Kunden und, falls verfügbar, den Verkäufer.
Die Kundentabelle enthält zwei Spalten:ID und grundlegende Kontaktinformationen.
Wir haben jetzt also mehrere Informationstabellen, die für verschiedene Personen auf unterschiedliche Weise nützlich sind. Anhand dieser drei Tabellen (Verkäufer, Bestellungen und Kunde) werden wir Beispiele dafür liefern, wie jeder der JOINs nützlich sein könnte.
LINKSVERBINDUNG
Die wahrscheinlich am häufigsten verwendete Art von JOIN ist ein LEFT JOIN. Wenn Sie an die Verknüpfung der beiden Tabellen denken, befindet sich die in der FROM-Klausel erwähnte auf der linken Seite. Der in der JOIN-Klausel erwähnte steht rechts. Bei einem LEFT JOIN wird jede Zeile aus der Tabelle LEFT (oder FROM) im Ergebnis zurückgegeben und mit entsprechenden Zeilen aus der Tabelle RIGHT (oder JOIN) verknüpft, die der ON-Klausel entspricht.
Denken Sie daran, dass einige Zeilen auf der LINKEN Seite möglicherweise keine übereinstimmenden Daten auf der RECHTEN Seite haben. In diesem Fall werden die Felder, die im Ergebnis aus der RIGHT-Tabelle ausgefüllt worden wären, mit einem NULL-Wert gefüllt.
Wenn außerdem mehrere Zeilen in der RIGHT-Tabelle mit den Zeilen aus der LEFT-Tabelle übereinstimmen, werden mehrere Zeilen in die Ergebnismenge aufgenommen. Ein Venn-Diagramm zeigt, wie ein LEFT JOIN visualisiert aussehen würde:
Der Marketingleiter bittet Sie um einen Bericht über alle Bestellungen, aufgeschlüsselt nach Kunden. Sie können dafür einen LEFT JOIN verwenden:
SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;
Diese Abfrage fragt nach allen Daten in der Tabelle „Bestellungen“, die mit den Zeilen in der Tabelle „Kunden“ verknüpft sind, wobei die ID des Kunden gleich der Kunden-ID in der Bestellung ist. Das Ergebnis würde so aussehen:
Beachten Sie, dass es für den Kunden von Widgets LLC drei Einträge gibt, da er drei Bestellungen hatte. Jolly Inc. platzierte zwei Bestellungen und Acme Inc platzierte eine. Cheapo taucht in dieser Liste nicht auf, da keine Bestellungen aufgegeben wurden.
RECHTSVERBINDUNG
Der RIGHT JOIN ist dem LEFT JOIN sehr ähnlich, außer dass er jede Zeile aus der RIGHT (JOIN)-Tabelle und nur die entsprechenden Zeilen aus der LEFT (FROM)-Tabelle zurückgibt. Wenn es keine Daten in der LEFT-Tabelle gibt, werden diese Spalten wiederum mit NULL-Werten gefüllt.
Wenn die linke Tabelle mehrere Zeilen enthält, enthält die Ergebnismenge mehrere Zeilen. Sein Venn-Diagramm würde wie folgt aussehen:
Wenn das Management einen Bericht mit JEDEM Kunden wünscht; selbst wenn sie keine Bestellung aufgegeben haben, könnten wir einen RIGHT JOIN verwenden.
SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;
Wieder beginnen wir mit der Tabelle „Bestellungen“ und VERBINDEN sie mit der Kundentabelle. Da wir einen RIGHT JOIN verwendet haben, erhalten wir mindestens eine Zeile für jeden Eintrag in der RIGHT (JOIN)-Tabelle, Kunde. Wenn es eine Übereinstimmung zwischen customer.id und orders.customer_id gibt, werden die Informationen ausgefüllt. Die Ergebnisse enthalten Cheapo Co mit NULL-Werten in den Auftragsspalten:
INNER JOIN
Ein INNER JOIN gibt nur die Zeilen aus jeder Spalte zurück, die der ON-Klausel entsprechen. Wenn es auf der RECHTEN Seite keine Übereinstimmung gibt, werden die Zeilen von der LINKEN Seite ausgeschlossen und umgekehrt. Das Venn-Diagramm für einen INNER JOIN sieht folgendermaßen aus:
Es ist Zahltag und die Lohnbuchhaltung muss wissen, wie viel Provision auszuzahlen ist. Dazu müssen sie die Bestellungen kennen, die über jeden Verkäufer aufgegeben wurden. Beachten Sie, dass nicht alle Bestellungen über einen Verkäufer gingen, also kümmern wir uns nicht darum. Dafür können wir einen INNER JOIN verwenden:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Wieder beginnen wir mit der Auftragstabelle. Diesmal verbinden wir es mit dem Verkäufertisch. Wenn es einen Eintrag in der Auftragstabelle gibt, der mit einem Eintrag in der Verkäufertabelle übereinstimmt, wird die Zeile eingeschlossen. Anstatt nicht übereinstimmende Zeilen mit NULL-Werten zu füllen, werden diese Zeilen in den Ergebnissen ignoriert.
Bitte beachten Sie, dass wir der Datenbank mitteilen, nicht nur den Verkaufsbetrag und den Provisionssatz zurückzugeben, sondern auch die berechnete Provision. Die Ergebnisse würden wie folgt aussehen:
OUTER JOIN
Ein OUTER JOIN gibt alles zurück, unabhängig davon, ob es eine Übereinstimmung gibt. Wenn Sie die Ergebnisse eines LEFT- und RIGHT JOIN kombinieren, erhalten Sie einen OUTER JOIN. Das Venn-Diagramm für einen OUTER JOIN sieht folgendermaßen aus:
Jetzt ist Monatsende und der Verkaufsleiter will ALLE Verkäufe sowie alle ausgezahlten Provisionen wissen. Dazu verwenden wir einen OUTER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Wie bei der Gehaltsabrechnung beginnen wir mit Bestellungen und JOIN zu Verkäufern. Der Unterschied besteht darin, dass Sie mit einem OUTER JOIN Ergebnisse sowohl aus der LEFT- als auch aus der RIGHT-Tabelle erhalten, wobei NULL ausgefüllt ist, wenn es keine entsprechende Übereinstimmung gibt. Die Ergebnisse sehen so aus:
Denken Sie jetzt daran, dass wir gesagt haben, dass MariaDB und MySQL OUTER JOIN nicht unterstützen. Wir haben auch gesagt, dass Sie einen OUTER JOIN erhalten würden, wenn Sie einen LEFT JOIN zu einem RIGHT JOIN hinzufügen. Der Trick bei diesen beiden Systemen besteht darin, genau das zu tun. Dies erreichen wir mit der UNION-Klausel. Es fügt die Ergebnisse einer Abfrage zu einer anderen hinzu:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Die Ergebnisse würden wie folgt aussehen:
MEHRERE VERBINDUNGEN
Mit JOIN können Sie auch mehr als zwei Tabellen verbinden. Wenn wir einen vollständigen Verkaufsbericht mit Kunden- und Verkäuferinformationen wünschen, machen wir am Ende einfach einen weiteren JOIN.
SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;
In diesem Beispiel beginnen wir mit der Auftragstabelle und verbinden sie mit der Verkäufertabelle, ähnlich wie wir es zuvor getan haben. Der nächste Schritt besteht darin, den Tisch mit dem Kundentisch zu verknüpfen. Dadurch werden alle Informationen ausgefüllt, die mit der Auftragstabelle verknüpft werden können.
Dieser Artikel ist eine kurze Einführung und soll keine erschöpfende Diskussion darüber sein, wie JOIN in SQL verwendet werden kann.
Klicken Sie unten, um diesen praktischen Gutschein noch heute zu verwenden!
Liquid Web verfügt über einige der leistungsstärksten Datenbankserver der Branche. Diese Server können verwendet werden, um das kleinste Heimgeschäft bis hin zu den größten Multi-Datenbank-Clustern für Unternehmen im Unternehmensmaßstab zu betreiben.
Rufen Sie uns unter 800.580.4985 an oder eröffnen Sie einen Chat oder ein Ticket mit uns, um mit einem unserer erfahrenen Lösungs- oder Hosting-Berater zu sprechen und zu erfahren, wie Sie diese Techniken noch heute nutzen können!