Zurück zur Artikelliste Artikel
6 Leseminuten

Was ist der Unterschied zwischen der Verwendung mehrerer Tabellen in FROM und JOIN?

Welchen Ansatz verfolgen Sie beim Verbinden von Tabellen in SQL? In diesem Artikel diskutieren wir zwei Ansätze und erklären, warum viele SQL-Entwickler JOIN eindeutig bevorzugen.

Ziehen Sie es vor, mehrere Tabellen in FROM aufzulisten und WHERE zu verwenden, um die Verknüpfungsbedingungen festzulegen? Oder verwenden Sie das JOIN-Schlüsselwort? SQL unterstützt beides, aber es gibt erhebliche Unterschiede zwischen beiden. Schauen wir uns beide im Detail an und diskutieren dann, warum JOIN im Allgemeinen bevorzugt wird.

Verknüpfung von Tabellen durch Auflistung in FROM

Nehmen wir an, wir betreiben ein Spielwarengeschäft und haben zwei Datenbanktabellen, die wir verknüpfen möchten: toys und sales.

Spielzeug

idnamebrandprice
1BumblebeeTransformers14.99
2Optimus PrimeTransformers19.99
3Lightning McQueenDisney Cars23.97
4RamoneDisney Cars20.99
5Wonder WomanBarbie39.99
6Princess LeiaBarbie99.99
7Wizard of Oz: GlindaBarbie43.95

Verkäufe

idtoy_idemployee_iddatequantity
1532020-07-011
2112020-07-011
3312020-07-021
4632020-07-031
5232020-07-031

Wir können einfach beide Tabellen in der FROM-Klausel auflisten und in der WHERE-Klausel angeben, dass die id aus der Tabelle toy Tabelle mit der toy_id aus der sales Tabelle übereinstimmen soll:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id;

Wir erhalten das folgende Ergebnis:

idnamebrandpricequantitydate
1BumblebeeTransformers14.9912020-07-01
2Optimus PrimeTransformers19.9912020-07-03
3Lightning McQueenDisney Cars23.9712020-07-02
5Wonder WomanBarbie39.9912020-07-01
6Princess LeiaBarbie99.9912020-07-03

Alles hat wie gewünscht funktioniert - wir haben zwei Tabellen verbunden und die erwarteten Ergebnisse erhalten.

Dies ist definitiv eine funktionierende Lösung für die Verknüpfung von Tabellen in SQL. Sie verwendet jedoch eine alte Syntax, die üblich war, bevor der SQL-92-Standard das Schlüsselwort JOIN einführte. Sehen wir uns nun an, wie wir dasselbe Ergebnis mit einem modernen Ansatz zum Verbinden von Tabellen erzielen können.

Verbinden von Tabellen mit dem JOIN-Schlüsselwort

Wir können die folgende Abfrage mit dem JOIN-Schlüsselwort verwenden, um das Gleiche zu tun:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id;

Diese Syntax wurde mit dem SQL-92-Standard eingeführt. Hier haben wir nur eine Tabelle in der FROM-Klausel; die Tabelle, die wir verbinden wollen, ist in der JOIN-Klausel aufgeführt. Mit dem Schlüsselwort ON werden die Spalten angegeben, die für die Verknüpfung dieser Tabellen verwendet werden sollen.

Das Ergebnis dieser Abfrage ist das gleiche wie oben. Dieser Ansatz hat jedoch eine Reihe von Vorteilen, die ihn unter SQL-Praktikern verbreiteter machen. Wenn Sie es vorziehen, die alte Syntax für die Verknüpfung von Tabellen zu verwenden, sollten Sie sich die folgenden Argumente ansehen. Sie könnten Ihre Meinung ändern.

Warum die neue Syntax für SQL-Joins verwenden?

Zunächst einmal muss klargestellt werden, dass es in Bezug auf die Leistung keinen Unterschied zwischen den beiden Syntaxen gibt. Die Verwendung des JOIN-Schlüsselworts ist heutzutage nicht nur ein formaler Standard, sondern auch eine gängige Praxis unter SQL-Anwendern. Was sind nun die Vorteile der JOIN-Klausel?

Join-Bedingungen sind von Filterbedingungen getrennt

Wenn Sie die alte Syntax verwenden, werden Ihre Join-Bedingungen und Filterbedingungen in der WHERE-Klausel physisch zusammengeführt. Dies kann zu Verwirrung führen.

Nehmen wir zum Beispiel an, dass wir nur die Verkäufe vom 3. Juli sehen wollen. Dann müssen wir der WHERE-Klausel eine weitere Bedingung hinzufügen:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id AND s.date = '2020-07-03';

Jetzt haben wir zwei Bedingungen in WHERE, aber nur eine davon ist eine echte Filterbedingung. Die andere dient nur dazu, die Spalten anzugeben, über die die Tabellen verknüpft werden sollen.

Mit dem Schlüsselwort JOIN werden die Verknüpfungsbedingungen von den Filterbedingungen getrennt:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id
WHERE s.date = '2020-07-03';

Hier geben wir die Verknüpfungsbedingung in ON an und verwenden WHERE, um die Ergebnisse zu filtern.

Beide Abfragen geben das gleiche Ergebnis aus, aber die neue Syntax macht deutlich, wo Sie die Tabellen verbinden und wo Sie die Ergebnisse filtern.

Es ist einfacher, mehrere Tabellen zu verbinden

Häufig müssen Sie mehrere Tabellen mit SQL verknüpfen. Nehmen wir zum Beispiel an, wir wollen die Tabelle employees Tabelle mit der toys und sales verbinden, damit wir wissen, wer welches Spielzeug verkauft hat.

Mitarbeiter

idname
1Rob Stevens
2Jane White
3Sofia Clark

Mit der alten Syntax hätten wir die folgende Abfrage:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t, sales s, employees e
WHERE t.id = s.toy_id AND e.id = s.employee_id;

Um die gleichen drei Tabellen mit der JOIN-Syntax zu verknüpfen, würden wir diese Abfrage verwenden:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t
JOIN sales s
ON t.id = s.toy_id
JOIN employees e
ON e.id = s.employee_id;

Das Ergebnis ist dasselbe:

idnamebrandpricequantitydateemployee
1BumblebeeTransformers14.9912020-07-01Rob Stevens
2Optimus PrimeTransformers19.9912020-07-03Sofia Clark
3Lightning McQueenDisney Cars23.9712020-07-02Rob Stevens
5Wonder WomanBarbie39.9912020-07-01Sofia Clark
6Princess LeiaBarbie99.9912020-07-03Sofia Clark

Die "Kette" von Tabellen, die wir verbinden wollen, ist in der neuen Syntax deutlicher zu erkennen, in der wir zuerst zwei Tabellen über bestimmte Spalten verbinden und dann die dritte Tabelle mit einer anderen Verknüpfungsbedingung verbinden. Bei der alten Syntax werden alle drei Tabellen zusammen in FROM aufgeführt und dann beide Join-Bedingungen (in beliebiger Reihenfolge) in WHERE angegeben. Welche Bedingung welcher Verknüpfung entspricht, wird bei dieser Syntax schnell unübersichtlich, insbesondere wenn mehr als drei Tabellen verknüpft werden müssen.

LEFT / RIGHT/ FULL JOINs sind einfacher

Die JOIN-Syntax macht alle Arten von äußeren Verknüpfungen sehr einfach. Sie können linke (äußere) Joins, rechte (äußere) Joins oder vollständige (äußere) Joins erstellen, indem Sie einfach die entsprechenden Schlüsselwörter (LEFT JOIN, RIGHT JOIN oder FULL JOIN) verwenden.

Sagen wir, wir wollen die Tabellen toys und sales so verknüpfen, dass alle Spielzeuge im Ergebnis angezeigt werden, auch wenn in dem betreffenden Zeitraum keine Verkäufe stattgefunden haben. Sie können diese Verknüpfung in jeder Datenbank einfach mit LEFT JOIN durchführen:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
LEFT JOIN sales s
ON t.id = s.toy_id;

Das Ergebnis enthält alle Spielzeuge und die entsprechenden Verkaufsinformationen, falls zutreffend:

idnamebrandpricequantitydate
5Wonder WomanBarbie39.9912020-07-01
1BumblebeeTransformers14.9912020-07-01
3Lightning McQueenDisney Cars23.9712020-07-02
6Princess LeiaBarbie99.9912020-07-03
2Optimus PrimeTransformers19.9912020-07-03
4RamoneDisney Cars20.99NULLNULL
7Wizard of Oz: GlindaBarbie43.95NULLNULL

Wenn Sie mit LEFT JOINs noch nicht vertraut sind, lesen Sie diesen umfassenden Leitfaden zum linken Joinen mehrerer Tabellen.

Und was ist mit der alten Syntax? Das ist kompliziert. Einige Datenbanken erlauben bestimmte Tricks, um Tabellen ohne Verwendung des JOIN-Schlüsselworts zu verknüpfen, aber es gibt keine einheitliche Lösung, die in allen Fällen funktioniert.

In Oracle können Sie zum Beispiel den (+)-Operator verwenden, um eine linke Verknüpfung herzustellen:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.day
FROM toys t, sales s
WHERE t.id = s.toy_id (+);

Diese Syntax funktioniert jedoch nicht in anderen Datenbanken.

Unbeabsichtigte CROSS JOINs werden vermieden

Ein weiteres häufiges Problem bei der Verknüpfung von Tabellen mit FROM ist der unbeabsichtigte CROSS JOIN. Wenn Sie eine Verknüpfungsbedingung in WHERE weglassen, erhalten Sie alle Zeilen der ersten Tabelle kombiniert mit allen Zeilen der zweiten Tabelle. Die Anzahl der Zeilen in der Ergebnismenge ergibt sich also aus der Multiplikation der Anzahl der Zeilen in jeder Tabelle. Ein solcher Fehler kann schwer zu erkennen und zu beheben sein.

Wenn Sie den SQL-92-Standard verwenden, um Tabellen zu verknüpfen, erhalten Sie einen Syntaxfehler, wenn Sie die Verknüpfungsbedingung auslassen. Natürlich können Sie Ihre Tabellen auch in der neuen Syntax über Kreuz verbinden, aber nur, wenn Sie ausdrücklich das entsprechende Schlüsselwort (CROSS JOIN) verwenden.

Zeit, die neue Syntax für SQL-JOINs zu lernen!

Die meisten SQL-Praktiker sind sich einig, dass die neue Syntax besser lesbar ist, wenn man sich an sie gewöhnt hat. Hoffentlich sind Sie auch davon überzeugt, dass der moderne Ansatz zum Verbinden von Tabellen in SQL Ihre Aufmerksamkeit wert ist.

LearnSQL bietet einen umfassenden Kurs auf SQL-JOINs an, der 93 interaktive Übungen enthält. Sie haben die Möglichkeit, Inner Joins, alle Arten von Outer Joins, Non-Equi Joins und Self Joins zu üben.

Zusätzlich zu den Übungen können Sie Ihr Wissen über SQL-JOINs mit unseren anfängerfreundlichen Anleitungen auffrischen:

Viel Spaß beim Lernen!