SQLShack (Deutsch)

Wenn Sie etwas Sinnvolles aus Daten herausholen möchten müssen Sie fast immer mehrere Tabellen verbinden. In diesem Artikel zeigen wir Ihnen, wie Sie dies mit verschiedenen Arten von Verknüpfungen tun. Um dies zu erreichen, kombinieren wir INNER JOINs und LEFT JOINs. Beginnen wir also.

Das Modell

In der Abbildung unten sehen Sie das vorhandene Modell. Es besteht aus 6 Tabellen und wir haben es bereits mehr oder weniger in den vorherigen Artikeln beschrieben.

Trotzdem Auch ohne Beschreibung sollten Sie in der Lage sein, Linien / Beziehungen im Schema nicht mehr als erforderlich zu überlappen, wenn die Datenbank auf gute Weise modelliert und dargestellt wird (Auswahl von Namen mit Bedacht unter Verwendung der Namenskonvention unter Befolgung der gleichen Regeln im gesamten Modell) um zu schließen, wo Sie die Daten finden, die Sie benötigen. Dies ist von entscheidender Bedeutung, da Sie diese Tabellen zuerst identifizieren müssen, bevor Sie mehrere Tabellen verbinden.

Wir werden später in diesem Abschnitt auf die Namenskonvention und die Ratschläge zum Denken beim Schreiben von SQL-Abfragen eingehen Serie. Lassen Sie uns bisher mit der Tatsache leben, dass dieses Modell ziemlich einfach ist und wir es ziemlich einfach machen können.

Was wissen wir bisher?

In dieser Serie haben wir behandelt:

  • Grundlagen zur SQL SELECT-Anweisung und
  • im Vergleich zu INNER JOIN und LEFT JOIN

Wir werden das Wissen verwenden aus diesen beiden Artikeln und kombinieren Sie diese, um komplexere SELECT-Anweisungen zu schreiben, die mehrere Tabellen verbinden.

Verbinden Sie mehrere Tabellen mit INNER JOIN

Das erste Beispiel, das wir analysieren, ist das Abrufen Daten aus mehreren Tabellen, die nur INNER JOINs verwenden. Für jedes Beispiel gehen wir mit der Definition des zu lösenden Problems und der Abfrage, die den Job erledigt, vor. Beginnen wir also mit dem ersten Problem.

# 1 Wir müssen alle Anrufe mit ihrer Start- und Endzeit auflisten. Bei jedem Anruf möchten wir das Ergebnis sowie den Vor- und Nachnamen des Mitarbeiters anzeigen, der diesen Anruf getätigt hat. Wir sortieren unsere Anrufe nach aufsteigender Startzeit.

Bevor wir die Abfrage schreiben, identifizieren wir die Tabellen, die wir verwenden müssen. Dazu müssen wir ermitteln, welche Tabellen die benötigten Daten enthalten, und diese einschließen. Außerdem sollten wir alle Tabellen auf dem Weg zwischen diesen Tabellen einschließen – Tabellen, die keine benötigten Daten enthalten, aber als Beziehung zwischen Tabellen dienen, die dies tun (dies ist hier nicht der Fall).

Die Abfrage, die den Job ausführt, ist unten angegeben:

Das Abfrageergebnis ist unten angegeben:

Es gibt einige Dinge, auf die ich hier hinweisen möchte:

  • Die Tabellen, denen wir beigetreten sind, sind hier, weil die Daten Wir müssen uns in diesen 3 Tabellen befinden.
  • Jedes Mal, wenn ich ein Attribut aus einer Tabelle erwähne, verwende ich das Format table_name.attribute_name (z. B. employee.first_name). Dies wird zwar nicht benötigt, ist jedoch eine gute Vorgehensweise, da manchmal zwei oder mehr Tabellen in derselben Abfrage dieselben Attributnamen verwenden können und dies zu einem Fehler führen würde.
  • Wir haben INNER JOIN zweimal hintereinander verwendet 3 Tabellen verbinden. Dies führt dazu, dass nur Zeilen mit Paaren in einer anderen Tabelle zurückgegeben werden.
  • Wenn Sie nur INNER JOINs verwenden, um mehrere Tabellen zu verbinden, ist die Reihenfolge dieser Tabellen in Verknüpfungen nicht wichtig. Das einzig Wichtige ist, dass Sie nach dem „EIN“ (Beitritt mit Fremdschlüsseln) die entsprechenden Beitrittsbedingungen verwenden.

Da alle Anrufe Mitarbeiter- und Anrufergebnisse hatten, würden wir das gleiche Ergebnis erhalten, wenn Wir haben LEFT JOIN anstelle von INNER JOIN verwendet.

Verbinden Sie mehrere Tabellen mit LEFT JOIN

Das Schreiben von Abfragen, die LEFT JOINs verwenden, unterscheidet sich nicht wesentlich vom Schreiben von Abfragen mit INNERE VERBINDUNGEN. Das Ergebnis wäre natürlich anders (zumindest in Fällen, in denen einige Datensätze kein Paar in anderen Tabellen haben).

Dies ist das Problem, das wir lösen möchten. P. >

# 2 Listet alle Landkreise und Kunden auf, die mit diesen Ländern in Verbindung stehen. Für jedes Land wird der Name des Stadtkunden sowie der Name dieses Kunden in englischer Sprache angezeigt. Geben Sie auch Länder ohne verwandte Städte und zurück Kunden.

Die Tabellen mit den Daten, die wir benötigen, sind in der folgenden Abbildung dargestellt:

Lassen Sie uns zunächst Überprüfen Sie schnell, was der Inhalt ist

Wir können zwei wichtige Dinge feststellen:

  • Während jede Stadt ein verwandtes Land hat, haben nicht alle Länder verwandte Städte (Spanien & Russland hat sie nicht)
  • Gleiches gilt für die Kunden.Für jeden Kunden ist der Wert city_id definiert, es werden jedoch nur 3 Städte verwendet (Berlin, Zagreb & New York)

Schreiben wir zunächst den Wert auf Abfrage mit INNER JOIN:

Das Abfrageergebnis ist in der folgenden Abbildung dargestellt:

Wir haben 7 Landkreise und 6 Städte in unserer Datenbank, aber unsere Abfrage gibt nur 4 Zeilen zurück. Dies ist das Ergebnis der Tatsache, dass wir nur 4 Kunden in unserer Datenbank haben. Jede dieser 4 ist mit ihrer Stadt verbunden und die Stadt ist mit dem Land verbunden. Also hat INNER JOIN all diese Länder und Städte ohne Kunden eliminiert. Aber wie können Sie diese auch in das Ergebnis einbeziehen?

Dazu verwenden wir LEFT JOIN. Wir werden einfach alle „INNER“ durch „LEFT“ ersetzen, sodass unsere Abfrage wie folgt lautet:

Das Ergebnis ist in der folgenden Abbildung dargestellt:

Sie können leicht feststellen, dass wir jetzt alle Länder haben, auch diejenigen ohne verwandte Stadt (Russland & Spanien) Städte, auch ohne Kunden (Warschau, Belgrad & Los Angeles). Die verbleibenden 4 Zeilen sind die gleichen wie in der Abfrage mit INNER JOIN.

LEFT JOIN – Tabellenreihenfolge ist wichtig

Die Reihenfolge der JOINs in INNER JOIN ist zwar nicht wichtig, aber dieselbe steht nicht für LEFT JOIN. Wenn Sie LEFT JOIN verwenden, um mehrere Tabellen zu verbinden, ist es wichtig zu beachten, dass dieser Join alle Zeilen aus der Tabelle auf der LINKEN Seite von JOIN enthält. Ordnen wir die vorherige Abfrage neu an:

Zunächst kann man leicht sagen, dass diese und die vorherige Abfrage identisch sind (dies gilt bei Verwendung von INNER JOIN). Wir haben dieselben Tabellen, LEFT JOINs und dieselben Join-Bedingungen verwendet. Schauen wir uns zuerst die Ausgabe an:

Also, was ist hier passiert? Warum haben wir 4 Zeilen (die gleichen 4, die wir hatten, als wir INNER JOIN verwendet haben)?

Die Antwort ist einfach und hängt damit zusammen, wie LEFT JOIN funktioniert. Es nimmt die erste Tabelle (Kunde) und verbindet alle seine Zeilen (4 davon) mit der nächsten Tabelle (Stadt). Das Ergebnis sind 4 Zeilen, da der Kunde nur einer Stadt angehören kann. Dann verbinden wir diese 4 Zeilen mit der nächsten Tabelle (Land), und wieder haben wir 4 Zeilen, weil die Stadt nur zu einem Land gehören könnte.

Der Grund, warum wir diese 3 Tabellen hier nicht verbinden würden Weg ist durch den Text des Beispiels # 2 gegeben. Die Abfrage ist so geschrieben, dass 4 Zeilen zurückgegeben werden. Dies ist die Antwort auf die folgenden Fragen: Geben Sie die Namen aller Kunden sowie die Städte und Länder zurück, in denen sie sich befinden. Geben Sie auch Kunden ohne verwandte Städte und Länder zurück.

  • Hinweis: Wenn Sie LEFT JOIN verwenden, ist die Reihenfolge der Tabellen in dieser Anweisung wichtig und die Abfrage gibt ein anderes Ergebnis zurück, wenn Sie diese Reihenfolge ändern. Die Reihenfolge hängt tatsächlich davon ab, was Sie als Ergebnis zurückgeben möchten.

Verbinden Sie mehrere Tabellen mit beiden – INNER JOIN & LEFT JOIN

Dies ist auch möglich. Lassen Sie uns noch einmal mit einem Beispiel fortfahren.

# 3 Gibt die Liste aller Länder und Städte mit Paaren zurück (ausgenommen Länder, auf die von keiner Stadt verwiesen wird). Für solche Paare geben alle Kunden zurück. Geben Sie auch Paare zurück, die keinen einzigen Kunden haben.

Die Abfrage, die den Job ausführt, lautet:

Das Ergebnis der Abfrage ist in der folgenden Abbildung dargestellt:

Sie können leicht feststellen, dass wir keine Länder ohne verwandte Stadt haben (dies waren Spanien & Russland). Der INNER JOIN hat diese Zeilen entfernt. Wir haben jedoch Zitate ohne Kunden (Belgrad, Los Angeles & Warschau). Dies ist das Ergebnis der Tatsache, dass wir LEFT JOIN zwischen den Tabellen city und customer verwendet haben.

Fazit

Wenn Sie mehrere Tabellen verbinden müssen, haben Sie INNER LEFT JOIN steht Ihnen zur Verfügung (RIGHT JOIN wird selten verwendet und kann leicht durch LEFT JOIN ersetzt werden). Welchen Join Sie verwenden, hängt direkt von der Aufgabe ab, die Sie lösen müssen, und Sie werden das Gefühl auf dem Weg bekommen. In den kommenden Artikeln werden wir diskutieren, wie Sie denken und sich organisieren können, wenn Sie komplexere Abfragen schreiben müssen.

Inhaltsverzeichnis

SQL lernen: CREATE DATABASE & CREATE TABLE-Operationen

SQL lernen: IN TABELLE EINFÜGEN

SQL lernen: Primärschlüssel

SQL lernen: Fremdschlüssel

SQL lernen: SELECT Anweisung

SQL lernen: INNER JOIN vs LEFT JOIN

SQL lernen: SQL-Skripte

SQL lernen: Arten von Beziehungen

SQL lernen: Mehrere Tabellen verbinden

SQL lernen: Aggregatfunktionen

SQL lernen: So schreiben Sie ein komplexes SELECT Abfrage

SQL lernen: Die INFORMATION_SCHEMA-Datenbank

SQL lernen: SQL-Datentypen

SQL lernen: Theorie festlegen

SQL lernen: Benutzerdefinierte Funktionen

SQL lernen: Benutzerdefinierte gespeicherte Prozeduren

SQL lernen: SQL-Ansichten

SQL lernen: SQL-Trigger

SQL lernen: SQL-Abfragen üben

SQL lernen: SQL Abfragebeispiele

SQL lernen: Erstellen Sie einen Bericht manuell mithilfe von SQL-Abfragen

SQL lernen: SQL Server-Datums- und Uhrzeitfunktionen

SQL lernen: SQL Server-Berichte mit Datums- und Uhrzeitfunktionen erstellen

SQL lernen: SQL Server-Pivot-Tabellen

SQL lernen: SQL Server-Export nach Excel

SQL lernen: Einführung in SQL Server-Schleifen

SQL lernen: SQL Server-Cursor

SQL lernen: SQL Best Practices zum Löschen und Aktualisieren von Daten

SQL lernen: Namenskonventionen

SQL lernen: SQL-bezogene Jobs

SQL lernen: Nicht-Equi-Joins in SQL Server

SQL lernen: SQL-Injection

  • Autor
  • Letzte Beiträge
Emil ist ein Datenbankprofi mit mehr als 10 Jahren Erfahrung in allen Datenbanken . Im Laufe der Jahre arbeitete er in der IT- und Finanzbranche und arbeitet jetzt als Freiberufler.
Seine bisherigen und gegenwärtigen Engagements reichen von Datenbankdesign und -codierung bis hin zu Lehren, Beraten und Schreiben über Datenbanken. Nicht zu vergessen, BI, Algorithmen erstellen, Schach, Philatelie, 2 Hunde, 2 Katzen, 1 Frau, 1 Baby …
Sie finden ihn auf LinkedIn
Alle Beiträge von Emil Drkusic anzeigen

Neueste Beiträge von Emil Drkusic (alle anzeigen)
  • SQL lernen: SQL Injection – 2. November 2020
  • SQL lernen: Non-Equi Joins in SQL Server – 29. September 2020
  • SQL lernen: SQL-bezogene Jobs – 1. September 2020

Schreibe einen Kommentar

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