Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist in SQL der Unterschied zwischen JOIN und CROSS JOIN?

SQL kennt die folgenden Join-Typen, die alle direkt aus der Mengenlehre stammen:

  • Innere Verbindung.
    From A inner join B ist das Äquivalent von A ∩ B und liefert die Menge der Elemente, die beiden Mengen gemeinsam sind.

  • Linker äußerer Join.
    From A left outer join B ist das Äquivalent von (A − B) ∪ (A ∩ B). Jedes A kommt mindestens einmal vor; wenn es mehrere übereinstimmende Bs gibt, wird das A einmal pro übereinstimmendem B wiederholt.

  • Right Outer Join.
    From A right outer join B ist das Äquivalent von (A ∩ B) ∪ (B − A). Es ist identisch mit einem Linksjoin bei den Tischen Handelsplätze. Jedes B kommt mindestens einmal vor; wenn es mehrere übereinstimmende As gibt, wird jedes B einmal pro übereinstimmendem B wiederholt.

  • Vollständiger äußerer Join.
    From A full outer join B ist das Äquivalent von (A − B) ∪ (A ∩ B) ∪ (B − A). Jedes A und jedes B kommt mindestens einmal vor. Wenn ein A mit mehreren Bs übereinstimmt, wird es einmal pro Match wiederholt; Wenn ein B mehrfach übereinstimmt, wird es einmal pro Übereinstimmung wiederholt.

  • Cross Join.
    From A cross join B Dies erzeugt das kartesische Produkt A × B. Jedes A wird einmal für jedes B wiederholt. Wenn A 100 Zeilen und B 100 Zeilen hat, besteht die Ergebnismenge aus 10.000 Zeilen.

Zu beachten ist, dass die theoretische Ausführung eines select Die Abfrage besteht aus den folgenden Schritten, die in dieser Reihenfolge ausgeführt werden:

  1. Berechnen Sie das vollständige kartesische Produkt der Quellmenge(n) in from -Klausel, um die Kandidatenergebnismenge zu präparieren.

  2. Wenden Sie die Join-Kriterien im from an -Klausel und reduzieren Sie die Kandidatenergebnismenge.

  3. Wenden Sie die Kriterien in der where clause an um die Ergebnismenge der Kandidaten weiter zu reduzieren.

  4. Unterteilen Sie die Kandidatenergebnismenge basierend auf den Kriterien in group by in Gruppen Klausel.

  5. Entfernen Sie aus der Kandidatenergebnismenge alle anderen Spalten als die, die in group by enthalten sind -Klausel oder an der Auswertung einer Aggregatfunktion beteiligt.

  6. Berechnen Sie den Wert solcher Aggregatfunktionen für jede Gruppe in der Kandidatenergebnismenge.

  7. Reduzieren Sie jede Gruppe im Kandidatenergebnissatz in eine einzelne Zeile, die aus den Gruppierungsspalten und den berechneten Werten für jede Aggregatfunktion besteht. Die Kandidatenergebnismenge besteht jetzt aus einer Zeile für jede Gruppe mit allen Spalten außer group by Spalten oder die Berechnungswerte von Aggregatfunktionen für die Gruppe werden eliminiert.

  8. Wenden Sie die Kriterien im having an -Klausel, um die Kandidatenergebnismenge zu reduzieren und die endgültige Ergebnismenge zu erzeugen.

  9. Ordnen Sie den endgültigen Ergebnissatz nach den Kriterien in order by -Klausel und geben sie aus.

Es gibt noch weitere Schritte, die mit Dingen wie compute zu tun haben und compute by Klauseln, aber das reicht aus, um eine theoretische Vorstellung davon zu bekommen, wie es funktioniert.

Es sollte auch beachtet werden, dass nur die naivste Implementierung tatsächlich einen select auswerten würde Anweisung auf diese Weise, aber die erzielten Ergebnisse müssen die gleichen sein, als ob die obigen Schritte vollständig ausgeführt würden.