SQLite unterstützt verschiedene Arten von SQL-Joins, z. B. INNER JOIN, LEFT OUTER JOIN und CROSS JOIN. Jeder JOIN-Typ wird für eine andere Situation verwendet, wie wir in diesem Tutorial sehen werden.
In diesem Tutorial lernen Sie:
- Einführung in die SQLite JOIN-Klausel
- INNER JOIN
- BEITRETEN… VERWENDEN
- NATÜRLICHE VERBINDUNG
- LINKE ÄUSSERE VERBINDUNG
- CROSS JOIN
Einführung in die SQLite JOIN-Klausel
Wenn Sie an einer Datenbank mit mehreren Tabellen arbeiten, müssen Sie häufig Daten aus diesen mehreren Tabellen abrufen.
Mit der JOIN-Klausel können Sie zwei oder mehr Tabellen oder Unterabfragen verknüpfen, indem Sie sie verbinden. Sie können auch festlegen, nach welcher Spalte Sie die Tabellen verknüpfen müssen und unter welchen Bedingungen.
Jede JOIN-Klausel muss die folgende Syntax haben:
Jede Join-Klausel enthält:
- Eine Tabelle oder eine Unterabfrage, die die linke Tabelle ist; die Tabelle oder die Unterabfrage vor der Join-Klausel (links davon).
- JOIN-Operator - Geben Sie den Join-Typ an (entweder INNER JOIN, LEFT OUTER JOIN oder CROSS JOIN).
- JOIN-Einschränkung - Nachdem Sie die zu verbindenden Tabellen oder Unterabfragen angegeben haben, müssen Sie eine Verknüpfungsbeschränkung angeben. Dies ist eine Bedingung, unter der die übereinstimmenden Zeilen, die dieser Bedingung entsprechen, abhängig vom Verknüpfungstyp ausgewählt werden.
Beachten Sie, dass Sie für alle folgenden Beispiele die Datei sqlite3.exe ausführen und eine Verbindung zur Beispieldatenbank als fließend öffnen müssen:
Schritt 1) In diesem Schritt
- Öffnen Sie den Arbeitsplatz und navigieren Sie zum folgenden Verzeichnis " C: \ sqlite " und
- Dann öffnen Sie " sqlite3.exe ":
Schritt 2) Öffnen Sie die Datenbank " TutorialsSampleDB.db " mit dem folgenden Befehl:
Jetzt können Sie jede Art von Abfrage in der Datenbank ausführen.
SQLite INNER JOIN
Der INNER JOIN gibt nur die Zeilen zurück, die der Verknüpfungsbedingung entsprechen, und entfernt alle anderen Zeilen, die nicht der Verknüpfungsbedingung entsprechen.
Beispiel
Im folgenden Beispiel verbinden wir die beiden Tabellen " Studenten " und " Abteilungen " mit DepartmentId, um den Abteilungsnamen für jeden Studenten wie folgt abzurufen:
WÄHLENStudents.StudentName,Departments.DepartmentNameVON StudentenINNER JOIN Abteilungen ON Students.DepartmentId = Departments.DepartmentId;
Erklärung des Codes:
Der INNER JOIN funktioniert wie folgt:
- In der Select-Klausel können Sie aus den beiden referenzierten Tabellen auswählen, welche Spalten Sie auswählen möchten.
- Die INNER JOIN-Klausel wird nach der ersten Tabelle geschrieben, auf die mit der "From" -Klausel verwiesen wird.
- Dann wird die Join-Bedingung mit ON angegeben.
- Für referenzierte Tabellen können Aliase angegeben werden.
- Das INNERE Wort ist optional, Sie können einfach JOIN schreiben.
Ausgabe:
- Der INNER JOIN erstellt die Aufzeichnungen sowohl von den Studenten als auch von den Tabellen der Abteilung, die der Bedingung " S tudents.DepartmentId = Departments.DepartmentId " entsprechen. Die nicht übereinstimmenden Zeilen werden ignoriert und nicht im Ergebnis enthalten.
- Aus diesem Grund wurden nur 8 Studenten von 10 Studenten von dieser Abfrage mit IT-, Mathematik- und Physikabteilungen zurückgesandt. Die Schüler "Jena" und "George" wurden nicht berücksichtigt, da sie eine Null-Abteilungs-ID haben, die nicht mit der Spalte "Abteilungs-ID" aus der Abteilungs-Tabelle übereinstimmt. Wie folgt:
SQLite JOIN… USING
Der INNER JOIN kann mit der "USING" -Klausel geschrieben werden, um Redundanz zu vermeiden. Anstatt also "ON Students.DepartmentId = Departments.DepartmentId" zu schreiben, können Sie einfach "USING (DepartmentID)" schreiben.
Sie können "JOIN… USING" verwenden, wenn die Spalten, die Sie in der Join-Bedingung vergleichen, denselben Namen haben. In solchen Fällen ist es nicht erforderlich, sie unter der Bedingung on zu wiederholen und nur die Spaltennamen anzugeben, und SQLite erkennt dies.
Der Unterschied zwischen INNER JOIN und JOIN… USING:
Mit "JOIN
… USING "Sie schreiben keine Join-Bedingung, Sie schreiben nur die Join-Spalte, die zwischen den beiden verbundenen Tabellen gemeinsam ist, anstatt table1 zu schreiben." INNER JOIN table2 ON table1.cola = table2.cola "wir schreiben es wie" table1 JOIN table2 USING (Cola) ".Beispiel
Im folgenden Beispiel verbinden wir die beiden Tabellen " Studenten " und " Abteilungen " mit DepartmentId, um den Abteilungsnamen für jeden Studenten wie folgt abzurufen:
WÄHLENStudents.StudentName,Departments.DepartmentNameVON StudentenINNER JOIN Abteilungen USING (DepartmentId);
Erläuterung
- Im Gegensatz zum vorherigen Beispiel haben wir nicht " ON Students.DepartmentId = Departments.DepartmentId " geschrieben. Wir haben gerade " USING (DepartmentId) " geschrieben.
- SQLite leitet die Join-Bedingung automatisch ab und vergleicht die DepartmentId aus beiden Tabellen - Studenten und Abteilungen.
- Sie können diese Syntax immer dann verwenden, wenn die beiden zu vergleichenden Spalten denselben Namen haben.
Ausgabe
- Dadurch erhalten Sie genau das gleiche Ergebnis wie im vorherigen Beispiel:
SQLite NATURAL JOIN
Ein NATURAL JOIN ähnelt einem JOIN… USING. Der Unterschied besteht darin, dass automatisch geprüft wird, ob die Werte jeder Spalte in beiden Tabellen gleich sind.
Der Unterschied zwischen INNER JOIN und NATURAL JOIN:
- In INNER JOIN müssen Sie eine Verknüpfungsbedingung angeben, mit der die innere Verknüpfung die beiden Tabellen verbindet. Während in der natürlichen Verknüpfung keine Verknüpfungsbedingung geschrieben wird. Sie schreiben einfach die Namen der beiden Tabellen ohne Bedingung. Dann prüft der natürliche Join automatisch die Gleichheit zwischen den Werten für jede Spalte, die in beiden Tabellen vorhanden ist. Die natürliche Verknüpfung leitet die Verknüpfungsbedingung automatisch ab.
- In NATURAL JOIN werden alle Spalten aus beiden Tabellen mit demselben Namen miteinander abgeglichen. Wenn wir beispielsweise zwei Tabellen mit zwei gemeinsamen Spaltennamen haben (die beiden Spalten sind in den beiden Tabellen mit demselben Namen vorhanden), verbindet der natürliche Join die beiden Tabellen, indem die Werte beider Spalten und nicht nur einer verglichen werden Säule.
Beispiel
WÄHLENStudents.StudentName,Departments.DepartmentNameVON StudentenNatural JOIN Abteilungen;
Erläuterung
- Wir müssen keine Join-Bedingung mit Spaltennamen schreiben (wie in INNER JOIN). Wir mussten den Spaltennamen nicht einmal schreiben (wie in JOIN USING).
- Der natürliche Join scannt beide Spalten aus den beiden Tabellen. Es wird erkannt, dass die Bedingung aus dem Vergleich der Abteilungs-ID aus den beiden Tabellen Studenten und Abteilungen bestehen sollte.
Ausgabe
- Mit Natural JOIN erhalten Sie genau die gleiche Ausgabe wie mit den Beispielen INNER JOIN und JOIN USING. Denn in unserem Beispiel sind alle drei Abfragen gleichwertig. In einigen Fällen unterscheidet sich die Ausgabe jedoch von der inneren Verknüpfung als bei einer natürlichen Verknüpfung. Wenn beispielsweise mehr Tabellen mit demselben Namen vorhanden sind, werden bei der natürlichen Verknüpfung alle Spalten miteinander abgeglichen. Die innere Verknüpfung stimmt jedoch nur mit den Spalten in der Verknüpfungsbedingung überein (weitere Details im nächsten Abschnitt; der Unterschied zwischen der inneren Verknüpfung und der natürlichen Verknüpfung).
SQLite LEFT OUTER JOIN
Der SQL-Standard definiert drei Arten von OUTER JOINs: LEFT, RIGHT und FULL. SQLite unterstützt jedoch nur LEFT OUTER JOIN.
In LEFT OUTER JOIN werden alle Werte der Spalten, die Sie aus der linken Tabelle auswählen, in das Ergebnis der Abfrage aufgenommen. Unabhängig davon, ob der Wert mit der Verknüpfungsbedingung übereinstimmt oder nicht, werden sie in das Ergebnis aufgenommen.
Wenn die linke Tabelle also 'n' Zeilen enthält, haben die Ergebnisse der Abfrage 'n' Zeilen. Wenn jedoch für die Werte der Spalten, die aus der rechten Tabelle stammen, ein Wert vorliegt, der nicht mit der Verknüpfungsbedingung übereinstimmt, enthält er einen Wert "null".
Sie erhalten also eine Anzahl von Zeilen, die der Anzahl der Zeilen im linken Join entspricht. Damit erhalten Sie die übereinstimmenden Zeilen aus beiden Tabellen (wie die Ergebnisse von INNER JOIN) sowie die nicht übereinstimmenden Zeilen aus der linken Tabelle.
Beispiel
Im folgenden Beispiel versuchen wir, mit "LEFT JOIN" die beiden Tabellen "Students" und "Departments" zu verbinden:
WÄHLENStudents.StudentName,Departments.DepartmentNameFROM Students - Dies ist die linke TabelleLEFT JOIN Abteilungen ON Students.DepartmentId = Departments.DepartmentId;
Erläuterung
- Die Syntax von LEFT JOIN entspricht der von INNER JOIN. Sie schreiben den LEFT JOIN zwischen die beiden Tabellen, und dann kommt die Join-Bedingung nach der ON-Klausel.
- Die erste Tabelle nach der from-Klausel ist die linke Tabelle. Während die zweite Tabelle, die nach dem linken Join angegeben wird, die rechte Tabelle ist.
- Die OUTER-Klausel ist optional. LEFT OUTER JOIN ist dasselbe wie LEFT JOIN.
Ausgabe
- Wie Sie sehen können, sind alle Zeilen aus der Schülertabelle enthalten, die insgesamt 10 Schüler umfassen. Auch wenn der vierte und der letzte Schüler, Jena und George, nicht in der Abteilungstabelle vorhanden sind, sind sie ebenfalls enthalten.
- In diesen Fällen ist der Wert für abteilungsname für Jena und George "null", da die Abteilungstabelle keinen Abteilungsnamen enthält, der mit dem Wert für die Abteilungs-ID übereinstimmt.
Lassen Sie uns die vorherige Abfrage mit dem linken Join anhand von Van-Diagrammen näher erläutern:
Der LEFT JOIN gibt allen Schülernamen aus der Schülertabelle, auch wenn der Schüler eine Abteilungs-ID hat, die in der Abteilungstabelle nicht vorhanden ist. Die Abfrage gibt Ihnen also nicht nur die übereinstimmenden Zeilen als INNER JOIN, sondern auch den zusätzlichen Teil, der die nicht übereinstimmenden Zeilen aus der linken Tabelle enthält, bei der es sich um die Schülertabelle handelt.
Beachten Sie, dass jeder Schülername, der keine übereinstimmende Abteilung hat, einen "Null" -Wert für den Abteilungsnamen hat, da es keinen übereinstimmenden Wert dafür gibt und diese Werte die Werte in den nicht übereinstimmenden Zeilen sind.
SQLite CROSS JOIN
Ein CROSS JOIN gibt das kartesische Produkt für die ausgewählten Spalten der beiden verbundenen Tabellen an, indem alle Werte aus der ersten Tabelle mit allen Werten aus der zweiten Tabelle abgeglichen werden.
Für jeden Wert in der ersten Tabelle erhalten Sie also 'n' Übereinstimmungen aus der zweiten Tabelle, wobei n die Anzahl der zweiten Tabellenzeilen ist.
Im Gegensatz zu INNER JOIN und LEFT OUTER JOIN müssen Sie bei CROSS JOIN keine Join-Bedingung angeben, da SQLite diese für CROSS JOIN nicht benötigt.
Die SQLite führt zu einer logischen Ergebnismenge, indem alle Werte aus der ersten Tabelle mit allen Werten aus der zweiten Tabelle kombiniert werden.
Wenn Sie beispielsweise eine Spalte aus der ersten Tabelle (colA) und eine andere Spalte aus der zweiten Tabelle (colB) ausgewählt haben. Das colA enthält zwei Werte (1,2) und das colB enthält auch zwei Werte (3,4).
Das Ergebnis des CROSS JOIN sind dann vier Zeilen:
- Zwei Zeilen durch Kombinieren des ersten Werts aus colA, der 1 ist, mit den beiden Werten von colB (3,4), die (1,3), (1,4) sind.
- Ebenso zwei Zeilen durch Kombinieren des zweiten Wertes aus colA, der 2 ist, mit den zwei Werten von colB (3,4), die (2,3), (2,4) sind.
Beispiel
In der folgenden Abfrage versuchen wir CROSS JOIN zwischen den Tabellen "Studenten" und "Abteilungen":
WÄHLENStudents.StudentName,Departments.DepartmentNameVON StudentenCROSS JOIN Abteilungen;
Erläuterung
- In der select-Klausel haben wir gerade zwei Spalten "studentname" aus der Schülertabelle und "abteilungsname" aus der Abteilungstabelle ausgewählt.
- Für den Cross-Join haben wir keine Join-Bedingung angegeben, nur die beiden Tabellen in Kombination mit CROSS JOIN in der Mitte.
Ausgabe:
Wie Sie sehen können, beträgt das Ergebnis 40 Zeilen. 10 Werte aus der Schülertabelle stimmten mit den 4 Abteilungen aus der Abteilungstabelle überein. Wie folgt:
- Vier Werte für die vier Abteilungen aus der Abteilungstabelle stimmten mit dem ersten Studenten Michel überein.
- Vier Werte für die vier Abteilungen aus der Abteilungstabelle stimmten mit dem zweiten Schüler John überein.
- Vier Werte für die vier Abteilungen aus der Abteilungstabelle stimmten mit dem dritten Schüler Jack überein.
… und so weiter.
Zusammenfassung
Mit SQLite JOINs können Sie eine oder mehrere Tabellen oder Unterabfragen miteinander verknüpfen, um Spalten aus beiden Tabellen oder Unterabfragen auszuwählen.