JOIN
Was ist in einem MySQL der Unterschied zwischen ON
und USING()
? Soweit ich das beurteilen kann, USING()
ist die Syntax nur bequemer, während sie ON
etwas flexibler ist, wenn die Spaltennamen nicht identisch sind. Dieser Unterschied ist jedoch so gering, dass man meinen würde, sie würden ihn einfach beseitigen USING()
.
Gibt es mehr, als man denkt? Wenn ja, welche sollte ich in einer bestimmten Situation verwenden?
using
es neben Joins noch eine andere Verwendung gibt. Siehe stackoverflow.com/a/13750399/632951Antworten:
Es ist meistens syntaktischer Zucker, aber ein paar Unterschiede sind bemerkenswert:
ON ist das allgemeinere der beiden. Man kann Tabellen auf einer Spalte, einer Reihe von Spalten und sogar einer Bedingung verbinden. Beispielsweise:
USING ist nützlich, wenn beide Tabellen eine Spalte mit genau demselben Namen verwenden, der sie beitreten. In diesem Fall kann man sagen:
Ein weiterer Vorteil ist, dass die Verbindungsspalten nicht vollständig qualifiziert werden müssen:
Um dies zu veranschaulichen und mit ON zu tun , müssten wir schreiben:
Beachten Sie die
film.film_id
Qualifikation in derSELECT
Klausel. Es wäre ungültig, nur zu sagen,film_id
da dies zu einer Mehrdeutigkeit führen würde:Was
select *
erscheint der Fügespalt in der Ergebnismenge zweimal mit ,ON
während es nur einmal erscheint mitUSING
:quelle
USING
dolmetschen vorON
.USING(
Kategorie,
field_id ausführen,)
was nützlich ist, wenn Sie zusammengesetzte Primärschlüssel verwenden. Außerdem habe ich gehört, dass der OptimiererUSING
in einigen Fällen die Leistung verbessertUSING
eine MySQL-Definition oder Standard?Ich dachte, ich würde hier einspringen, wenn ich festgestellt habe
ON
, dass es nützlicher ist alsUSING
. Dies ist derOUTER
Fall, wenn Verknüpfungen in Abfragen eingeführt werden.ON
profitiert davon, dass die Ergebnismenge der Tabelle, zu der eine AbfrageOUTER
beitritt, eingeschränkt werden kann, während dieOUTER
Verknüpfung beibehalten wird . Wenn Sie versuchen, die Ergebnismenge durch Angabe einerWHERE
Klausel einzuschränken , wird derOUTER
Join effektiv in einenINNER
Join umgewandelt.Zugegeben, dies kann ein relativer Eckfall sein. Es lohnt sich jedoch, es herauszubringen .....
Beispielsweise:
quelle
using
kann es nicht mit anderen Prädikaten kombiniert werden:select*from t join t2 using(i) and on 1
würde nicht funktionieren.where hasAirport ;
- was bedeutet das ? Es gibt keinen Wert zum Vergleichen.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
listet alle Länder auf, außer nur die Städte, die mit C oder D beginnen (falls vorhanden). (Plus Städte namens 'E')Wikipedia hat folgende Informationen über
USING
:Tabellen, über die gesprochen wurde:
Die Postgres- Dokumentation definiert sie auch ziemlich gut:
quelle
Für diejenigen, die in phpMyAdmin damit experimentieren, nur ein Wort:
phpMyAdmin scheint einige Probleme mit zu haben
USING
. Für den Datensatz ist dies phpMyAdmin, ausgeführt unter Linux Mint, Version: "4.5.4.1deb2ubuntu2", Datenbankserver: "10.2.14-MariaDB-10.2.14 + maria ~ xenial - mariadb.org Binärdistribution".Ich habe
SELECT
Befehle mitJOIN
undUSING
sowohl in phpMyAdmin als auch in Terminal (Befehlszeile) ausgeführt, und diejenigen in phpMyAdmin erzeugen einige verwirrende Antworten:1) Eine
LIMIT
Klausel am Ende scheint ignoriert zu werden.2) Die angenommene Anzahl von Zeilen, wie oben auf der Seite mit den Ergebnissen angegeben, ist manchmal falsch: Zum Beispiel werden 4 zurückgegeben, aber oben steht "Zeilen 0 - 24 anzeigen (2503 insgesamt, Abfrage dauerte 0,0018 Sekunden.) ""
Wenn Sie sich normal bei MySQL anmelden und dieselben Abfragen ausführen, treten diese Fehler nicht auf. Diese Fehler treten auch nicht auf, wenn dieselbe Abfrage in phpMyAdmin mit ausgeführt wird
JOIN ... ON ...
. Vermutlich ein phpMyAdmin-Fehler.quelle