Heim >Backend-Entwicklung >PHP-Tutorial >3 Weitere Verbindungen, mit denen Sie vertraut sein sollten
Es gibt viele Möglichkeiten, Daten aus zwei Datenbanktabellen zu verbinden und die von Ihnen erforderlichen Informationen zu filtern. Craig Buckler schrieb ein beliebtes Stück über Verständnisanglieder; nämlich inner, links, rechts und voll äußerlich. Dieser Artikel ist eine Erweiterung dieses.
Lassen Sie uns diese sehr schnell zusammenfassen. Bild zwei Tabellen, einen für Kunden und eine für Bücher zur Einrichtung einer Buchdarlehensdatenbank.
Kunden Tabelle
Bücher Tabelle
Die Büchertabelle hat eine Zeile für jedes Buch.
Die Kundentabelle verfügt über eine Zeile für jeden Kunden, der nur ein Buch aus Kredit gleichzeitig haben kann. Wenn sie kein ausleihiges Buch haben, wäre das book_id 0 oder eine leere Zeichenfolge.
Dies ist ein sehr einfaches Beispiel, um die Verbindungen so klar wie möglich zu verstehen!
Eine linke Beitritts hier wäre in dem Fall, in dem Sie eine Frage stellen möchten, wie " zeige mir alle Kunden, einschließlich aller Bücher. "
Sie können im Bild sehen, dass alle Daten im linken Kreis oder in der Tabelle im Ergebnissatz enthalten sind. Nur Daten, die sich aus der Büchertabelle überschneiden, sind aus der rechten Tabelle enthalten. Dies bedeutet, dass bei einem linken Join einige Daten in der rechten Tabelle ausgeschlossen werden können.
Ein Rechtsverbände wäre wie die Frage: "
In diesem Bild sehen Sie, dass alle Daten in der rechten Tabelle im Ergebnissatz enthalten sind. Es sind nur Daten enthalten, die sich aus der Kundentabelle überschneiden. Dies bedeutet, dass bei einem Rechtsverbinden einige Daten in der linken Tabelle ausgeschlossen werden können.
Ein äußerer Join wäre wie zu fragen: " zeig mir alle Kredite und alle Bücher, unabhängig von Verbindungen zwischen ihnen. "
In diesem Bild können Sie feststellen, dass alle Daten aus beiden Tabellen enthalten sind, unabhängig davon, ob sich einige Daten überschneiden. Wenn eine solche Abfrage ausgeführt wird, haben Sie nicht überlappende Daten im Ergebnis, und diese Felder werden auf null gesetzt.
Ein innerer Join wäre wie die Frage: „ nur Kunden mit einem Darlehen zeigen. “
Hier sehen Sie, dass Daten sowohl aus den linken als auch von den rechten Tabellen ausgeschlossen werden können. Sie werden keine Kunden sehen, wenn sie kein Buch haben, und Sie werden keine Bücher sehen, wenn sie nicht ausgeliehen werden!
Dies ist die häufigste Art von Daten und das Standardverhalten bei der Verwendung des Schlüsselworts von selbst. Das hinzugefügte Wort „inner“ ist normalerweise nicht erforderlich.
Sie können sich „links“ und „rechts“ als nichts anderes als Quellreihenfolge vorstellen. Schauen Sie sich diese Abfrage an:
<span>SELECT * </span><span>FROM customers </span><span>LEFT JOIN books </span><span>ON customers.book_id = books.id </span>
Beachten Sie, dass ich die Tabellenkunden erwähnt habe, bevor ich das Schlüsselwort der Join verwendet habe. Dies bedeutet, dass Kunden mein „links“ -Tisch sind. Eine andere Möglichkeit, darüber nachzudenken, besteht darin, zu fragen, welche Tabelle vom Schlüsselwort der Join links ist und welches rechts davon ist.
Ein paar Einschränkungen:
nun, sie sind nicht „neu“, sie sind nur eine Möglichkeit, zusätzliche Fragen zu befragen. Wie würden Sie Antworten auf Fragen mit den Wörtern "nicht" oder "nicht" in der Abfrage finden?
Zeigen Sie mir alle Kunden, die keine Bücher ausleihen.
Zeigen Sie mir alle Bücher, die nicht ausgeliehen werden.
Schauen Sie sich diese Grafik an. Beachten Sie den Unterschied zu den oben genannten Verknüpfungen im schattierten Bereich.
Dies sieht aus wie ein linker Join, enthält jedoch nicht mehr die "Überlappungsdaten". Warum? Dies ist dasselbe wie die Frage „ zeig mir Kunden, die keine Bücher ausleihen. Wenn Sie klug sind, denken Sie vielleicht, dass Sie einfach die Kundentabelle nach einem Buch von 0 durchsuchen können, um dasselbe zu tun. Das würde in diesem Beispiel funktionieren, aber die meiste Zeit wird es nicht; Es hängt davon ab, wie Ihre Tabellen gestaltet sind.
Die Abfrage sieht so aus:
Wir haben jetzt eine Where -Klausel aufgenommen. Jedes Mal, wenn Sie eine Where -Klausel haben, sind Sie
<span>SELECT * </span><span>FROM customers </span><span>LEFT JOIN books </span><span>ON customers.book_id = books.id </span>
Daten aus, oder filtern Sie sie fast wie eine Suche. Warum suchen wir nach Büchern. Iid Null? Warum sollte das null sein? Lassen Sie uns den Standard -Links -Join ausführen und die Daten sehen, die sie zurückgeben. Wir haben die Antwort: linke Join Returndaten
id
Wenn wir "
Zeigen Sie mir alle Kunden, einschließlich der Bücher, die sie" zeigen, möchten Sie die oben genannten Daten, da Jeffrey ein Kunde ist, unabhängig davon, ob er ein Buch ausgeliehen hat oder nicht. Das wäre die Funktion eines linken Join in diesem Fall. Wenn wir die Frage "
zeig mir Kunden, die keine Bücher ausleihen" zeigen, macht es jetzt vollkommen sinnvoll, wonach ich suchen soll. Wir müssen nur Kunden auswählen, bei denen wir Null für die Books.id -Spalte sehen (wenn sie verbunden sind, wird mit ID1 bezeichnet, da es zwei Spalten mit dem Namen "ID" gibt). Wir machen dies mit einem Standard, bei dem wir hinzufügen, wo bucht ist. Iid ist null. Jetzt wird das Ergebnis genau so gefiltert:
idRechts mit Ausschluss
Ein normaler Rechtsverbinden würde jedes Buch zurückgeben, unabhängig davon, ob es ausgeliehen wird, würde das Ergebnis -Set wie folgt aussehen:
Das sieht ein bisschen anders aus. Erstens werden Sie vielleicht bemerken, dass der Jurassic Park zweimal gelistet ist. Dies liegt daran, dass zwei Personen das Buch ausleihen und die Datenbank für jedes Spiel eine Zeile zurückgeben.
Beachten Sie, dass alle entsprechenden Spalten aus der Kundentabelle für kleine Frauen und Tom Sawyer null sind, da niemand diese Titel entlehnt hat, sodass es keine überlappenden Daten gibt.
Wenn wir alle nicht ausgeliehenen Bücher auswählen möchten, verwenden wir nur die Where -Klausel, um „null“ in der Kunden zu finden.
<span>SELECT * </span><span>FROM customers </span><span>LEFT JOIN books </span><span>ON customers.book_id = books.id </span>Das Ergebnis sollte vorhersehbar sein. Wir erhalten nur Bücher, die nicht ausgeliehen werden.
id
Ein seltsamer Join wie dieser kann in Fällen nützlich sein, in denen Sie buchstäblich Daten ohne Verbindung zwischen Tabellen auswählen müssen. Vielleicht suchen Sie nach Orphan -Daten oder suchen nach Inkonsistenzen in einer alten Datenbank, die Sie konvertiert haben.
In der Tat ist diese Art von Join so seltsam, dass Sie es nicht einmal in MySQL tun können, dass sie nicht den äußeren Join unterstützt. Regular SQL tut und die Abfrage würde so aussehen (MSSQL nicht MySQL):
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>WHERE books.id IS NULL
Das Ergebnis dieser Abfrage würde Daten zurückgeben, die ungefähr so aussehen: id
Die Hauptsache, die im obigen Code zu bemerken ist, ist die Überprüfung von Null auf beiden Seiten des Join, da wir von beiden Tabellen ausschließen möchten. Ohne beide Seiten zu überprüfen, haben wir einfach eine der anderen Anschlüsse, über die nur gesprochen wurde.
Unabhängig davon, wie bizarr oder eine Abfrage wie diese unterstützt wurde, wollte ich sie einbeziehen, da es sich um eine gültige Art von Join handelt, wenn Sie sich einen Grund vorstellen können, es zu verwenden.
Sie sollten Ihre Where -Klausel immer gegen Felder verwenden, die nicht als tatsächlichen Wert null haben können! Wir haben immer an den ID -Feldern getestet, die Null als Wert nicht haben können. Stellen Sie sich vor, unsere Büchertisch hätte ein ISBN -Feld, das Null erlaubte. Wenn wir mit dieses -Fiele auf Null getestet würden, würde es Zeilen enthalten, die wir möglicherweise nicht wollen!
Es gibt einen weiteren Join, der als Cross -Join bezeichnet wird und auch seltsam und einzigartig ist. Stellen Sie sich vor, Sie hätten anstatt nur einen Benutzer mit einem Buch abzustimmen, jeder Benutzer wurde mit jedem Buch abgestimmt! Ja, das bedeutet, dass wenn Sie 20 Bücher und 30 Kunden haben, ein Cross -Beitritt zu 30*20 Datenzeilen! Für ein Beispiel dafür, wie dies nützlich sein könnte, lesen Sie diesen Artikel.
Beachten Sie, dass in MySQL der Join, der innere Join und der Cross -Join syntaktische Äquivalente sind und sich gegenseitig ersetzen können. Dies liegt daran, dass Join und Inner Join das Gleiche tun und das On -Keyword verwenden müssen, um Spalten zu entsprechen. Bei der Verwendung eines Cross -Join gibt es kein Keyword, da es in Tabelle A zu jeder Zeile in Tabelle B.
zu jeder Zeile übereinstimmtIch hoffe, diese zusätzlichen Zusammenschlüsse haben für Sie Sinn gemacht. Denken Sie darüber nach, sie jederzeit zu verwenden, wenn Sie nach Daten zwischen Tabellen fragen, in denen etwas "nicht" mit dem anderen übereinstimmt.
Zusammenfassend müssen Sie je nach Definition Ihrer Datenbank und Tabellen die WHERE -Klausel verwenden, um die Nullwerte zu überprüfen, um die Übereinstimmungen auszuschließen, anstatt integrieren sie als mit normalem Join -Verhalten.
Also ... haben Sie jemals eine Kreuzung gebraucht? Gibt es noch andere spezifische Anwendungsfälle, über die Sie uns informieren möchten oder die uns abdecken möchten? Lass es uns wissen!häufig gestellte Fragen (FAQs) zu SQL -Verbindungen
Das obige ist der detaillierte Inhalt von3 Weitere Verbindungen, mit denen Sie vertraut sein sollten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!