MySQL: Schnelle Aufschlüsselung der Join-Typen


157

Ich möchte eine kurze Aufschlüsselung der Arten von MySQL-Joins. Ich weiß davon, der Rest ist mir nicht sicher, was sie bedeuten.

  • Komma getrennt (wofür genau ist diese Abkürzung?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • Informationen von a anzeigen, auch wenn in b keine Übereinstimmungen vorhanden sind: SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

Ich habe gesehen , andere schließt sich, aber wollen wissen , was sie von anderen unterscheidet, was ist INNER/ OUTER, wirkt sich das Hinzufügen LEFTDinge ändern.

Ich weiß bereits, wie Verknüpfungen funktionieren. Ich möchte nur wissen, ob es andere Arten von Verknüpfungen gibt oder ob es sich nur um unterschiedliche Methoden handelt, um das gleiche Ergebnis zu erzielen.


Antworten:


463

3
+1, aber beide fehlen cross join, was ein kartesisches Produkt ergibt.
Denis de Bernardy

11
@denis: Werfen Sie einen genaueren Blick auf den Codinghorror.com-Link:There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Rufinus

1
Ich bin erstaunt, diese Diagramme auszudrucken und an meine Bürowand zu hängen. du hast mein Leben verändert!
Yossico

41
Die Frage bezieht sich speziell auf MySQL. MySQL unterstützt keine FULL OUTER-Joins.
Mike Baranczak

4
und natürlich sollte dies ein Grund sein, diese Grafik nicht zu posten. Seufzer
Rufinus

27

Basierend auf Ihrem Kommentar finden Sie bei W3Schools am besten einfache Definitionen. Die erste Zeile jedes Typs enthält eine kurze Erläuterung des Join-Typs

  • JOIN: Gibt Zeilen zurück, wenn in beiden Tabellen mindestens eine Übereinstimmung vorhanden ist
  • LEFT JOIN: Gibt alle Zeilen aus der linken Tabelle zurück, auch wenn die rechte Tabelle keine Übereinstimmungen enthält
  • RIGHT JOIN: Gibt alle Zeilen aus der rechten Tabelle zurück, auch wenn die linke Tabelle keine Übereinstimmungen enthält
  • FULL JOIN: Gibt Zeilen zurück, wenn in einer der Tabellen eine Übereinstimmung vorliegt

END EDIT

Kurz gesagt, das durch Kommas getrennte Beispiel, von dem Sie gegeben haben

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

Wenn jeder Datensatz aus den Tabellen a und b mit den Kommas zwischen den Tabellen ausgewählt wird, kann dies auch in Spalten wie verwendet werden

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

Anschließend werden die angewiesenen Informationen in der Zeile abgerufen, in der die Spalte b.id und die Spalte a.beeId in Ihrem Beispiel übereinstimmen. In Ihrem Beispiel werden also alle Informationen aus den Tabellen a und b abgerufen, wobei die b.id gleich a.beeId ist. In meinem Beispiel werden alle Informationen aus der Tabelle b und nur Informationen aus der Spalte a.beeName abgerufen, wenn die b.id der a.beeId entspricht. Beachten Sie, dass es auch eine AND-Klausel gibt, mit deren Hilfe Sie Ihre Ergebnisse verfeinern können.

Einige einfache Tutorials und Erklärungen zu mySQL-Joins und Links-Joins finden Sie in den mySQL-Tutorials von Tizag. Sie können auch die Website von Keith J. Brown besuchen, um weitere Informationen zu Joins zu erhalten, die ebenfalls recht gut sind.

ich hoffe das hilft dir


Es kommt vor, dass ich das alles schon weiß. Ich habe tatsächlich nach den Arten von Verknüpfungen gesucht, die es gibt. Tut mir leid, ich war mir nicht sicher, was ich weiß. Aber ich suchte nicht nach langer Dokumentation, nur um die kurze Zusammenfassung zu erhalten.
Bryan Field

Ein weiterer Hinweis in der Antwort ... könnte mehr von dem sein, was Sie wollen, Kumpel.
Ryan

+1 für diese Bearbeitung. Ich bin nicht voreingenommen gegen W3Schools, wie es manche Leute zu sein scheinen. Vielleicht habe ich die schlechten Seiten nicht viel gesehen oder vielleicht ist es nur ein "heiliger Krieg". Außerdem habe ich den Inhalt von W3Schools bearbeitet. Ich hoffe, es macht Ihnen nichts aus, aber Sie können jederzeit Änderungen vornehmen, die Sie möchten. Alle diese Bilder in der akzeptierten Antwort sind nett, aber einige sind tatsächlich Variationen derselben Verknüpfung. Dies ist eine gute Alternative.
Bryan Field

Danke George, es macht mir überhaupt nichts aus, vorausgesetzt, die Bearbeitung ist korrekt! Ich bin der Überzeugung, dass die Menschen die für sie richtigen Quellen finden müssen, mehr oder weniger Informationen, viele Beispiele oder keine. W3Schools haben genaue und prägnante, sie haben auch gute Beispiele, Tizag ist ähnlich. Nehmen Sie es einfach Kumpel
Ryan

1
Es gibt kein FULL JOIN in MySQL, daher sind diese Links nicht sehr nützlich.
Ether

13

Ich habe 2 Tabellen wie diese:

> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

INNER JOIN kümmert sich um beide Tische

INNER JOIN kümmert sich um beide Tabellen, sodass Sie nur dann eine Zeile erhalten, wenn beide Tabellen eine haben. Wenn es mehr als ein übereinstimmendes Paar gibt, erhalten Sie mehrere Zeilen.

> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

Für INNER JOIN macht es keinen Unterschied, ob Sie die Reihenfolge umkehren, da beide Tabellen betroffen sind:

> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

Sie erhalten die gleichen Zeilen, aber die Spalten sind in einer anderen Reihenfolge, da wir die Tabellen in einer anderen Reihenfolge erwähnt haben.

LEFT JOIN kümmert sich nur um den ersten Tisch

LEFT JOIN kümmert sich um die erste Tabelle, die Sie geben, und kümmert sich nicht viel um die zweite, sodass Sie immer die Zeilen aus der ersten Tabelle erhalten, auch wenn in der zweiten keine entsprechende Zeile vorhanden ist:

> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

Oben sehen Sie alle Zeilen von table_a, obwohl einige von ihnen mit nichts in Tabelle b übereinstimmen, aber nicht alle Zeilen von table_b - nur diejenigen, die mit etwas in table_a übereinstimmen.

Wenn wir die Reihenfolge der Tabellen umkehren, verhält sich LEFT JOIN anders:

> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

Jetzt erhalten wir alle Zeilen von table_b, aber nur übereinstimmende Zeilen von table_a.

RIGHT JOIN kümmert sich nur um den zweiten Tisch

a RIGHT JOIN bSie erhalten genau die gleichen Zeilen wie b LEFT JOIN a. Der einzige Unterschied ist die Standardreihenfolge der Spalten.

> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

Dies sind die gleichen Zeilen wie table_b LEFT JOIN table_aim Abschnitt LEFT JOIN.

Ähnlich:

> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

Ist die gleichen Zeilen wie table_a LEFT JOIN table_b.

Kein Join gibt Ihnen Kopien von allem

Keine Join-Klausel: Wenn Sie Ihre Tabellen ohne JOIN-Klausel schreiben, nur durch Kommas getrennt, erhalten Sie jede Zeile der ersten Tabelle neben jeder Zeile der zweiten Tabelle in jeder möglichen Kombination:

> SELECT * FROM table_b, table_a;        
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(Dies ist aus meinem Blog-Beitrag Beispiele für SQL-Join-Typen )


@Anu Bitte nehmen Sie keine so trivialen Änderungen vor, wenn Ihre schlechte Reputation bedeutet, dass Ihre Änderungen von anderen überprüft werden müssen. Sie verschwenden nur ihre Zeit. Diese Änderung sollte als kein Unterschied abgelehnt worden sein. Der Code, den Sie geändert haben, war nicht wirklich falsch und Sie hätten kommentieren können.
philipxy

@ Philipxy Okay. Damit bemerkt. Während ich versuchte, die Erklärung zu verstehen, sah ich einen solchen Tippfehler und deshalb wurde er bearbeitet, um ihn klarer zu machen. In der Tat ist dies eine gute Antwort und meine Absicht war es, sie besser zu halten.
Anu

@Anu Diese Antwort enthält dieselben fragmentierten unvollständigen Beschreibungen wie die meisten Antworten. Es sagt eigentlich nicht aus, was die Ausgabe als Funktion der Eingaben ist. Siehe auch fast jede Antwort im vorgeschlagenen Duplikat und meine Kommentare auf beiden Seiten. Siehe auch meine Antwort dort. PS Ich habe dies zufällig von gestern gesehen und die Bearbeitungsgröße überprüft (Natürlich gibt es noch viele weitere verwandte Beiträge bei Meta Stack Overflow & Meta Stack Exchange .)
philipxy

11

Vollständige äußere Verknüpfung ist in MySQL nicht vorhanden. Möglicherweise müssen Sie eine Kombination aus linker und rechter Verknüpfung verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.