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
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
- 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