Was ist der Zweck des Parameters USING in SQL?


7

Bei der Arbeit mit Code in einer Standard-MySQL-Datenbank bin ich auf folgende Aussage gestoßen:

SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1

Was mich wirft ist: Wofür ist es USING, was macht es?

Meine erste Annahme war, dass es sich um die Arbeit mit Fremdschlüsseln oder möglicherweise Indizes handelte, aber das DB-Schema enthält keine Hinweise auf Fremdschlüssel oder Indizes.
Mein GoogleFU hat mich im Stich gelassen, wahrscheinlich weil USINGes in den meisten Texten auf Websites so häufig vorkommt. Ich frage mich also, ob die DB-Gurus etwas Licht ins Dunkel bringen könnten, bevor ich diese und mehrere andere Abfragen in diesem Code ändern möchte.

Antworten:


8

USINGHilft im Kontext Ihrer Abfrage, eine zu erfüllen JOIN, solange die beiden beteiligten Tabellen JOINdieselben Spaltennamen haben, mit denen verbunden werden soll. Es ist wie ein NATURAL JOIN.

Ihre Anfrage

SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1

funktioniert genauso wie

SELECT * FROM foo LEFT JOIN bar ON foo.bar_id = bar.bar_id WHERE foo_id = 1

Gemäß der MySQL-Dokumentation zur JOIN-Syntax

Die USING-Klausel (column_list) benennt eine Liste von Spalten, die in beiden Tabellen vorhanden sein müssen. Wenn die Tabellen a und b beide die Spalten c1, c2 und c3 enthalten, vergleicht der folgende Join die entsprechenden Spalten aus den beiden Tabellen:

a LEFT JOIN b USING (c1,c2,c3)

Der NATURAL [LEFT] JOIN von zwei Tabellen ist so definiert, dass er semantisch einem INNER JOIN oder einem LEFT JOIN mit einer USING-Klausel entspricht, die alle Spalten benennt, die in beiden Tabellen vorhanden sind.


Hmm interessant. Ich bin mit der letzteren Syntax besser vertraut, aber neugierig, was der Vorteil der Verwendung von USING anstelle von ON wäre, da sie anscheinend dieselbe Funktion ausführen. Nur weniger mit USING tippen?
Canadiancreed

Ich denke, USING dient als Erinnerung an die allgemeinen Spalten, die eine Tabelle mit einer anderen in Beziehung setzen. Das macht NATURAL JOIN zu einer Option.
RolandoMySQLDBA

Ich denke, Sie können SELECT bar_id ausführen, wenn Sie "USING" verwenden, aber Sie müssen SELECT foo.bar_id ausführen, wenn Sie "ON" verwenden.
Rick James

6

Es ist auch erwähnenswert, dass Sie bei Verwendung USINGmöglicherweise eine andere Ergebnismenge erhalten als bei a JOIN. Lesen Sie den unten zitierten Abschnitt in der JOIN-Dokumentation :

Join Processing Changes in MySQL 5.0.12

Hinweis:

Natürliche Verknüpfungen und Verknüpfungen mit USING, einschließlich äußerer Verknüpfungsvarianten, werden gemäß dem SQL: 2003-Standard verarbeitet. Ziel war es, die Syntax und Semantik von MySQL in Bezug auf NATURAL JOIN und JOIN ... USING gemäß SQL: 2003 anzupassen. Diese Änderungen in der Join-Verarbeitung können jedoch bei einigen Joins zu unterschiedlichen Ausgabespalten führen. Außerdem müssen einige Abfragen, die in älteren Versionen (vor 5.0.12) anscheinend ordnungsgemäß funktionierten, neu geschrieben werden, um dem Standard zu entsprechen.

Diese Änderungen haben fünf Hauptaspekte:

  • Die Art und Weise, wie MySQL die Ergebnisspalten von NATURAL- oder USING-Verknüpfungsoperationen bestimmt (und damit das Ergebnis der gesamten FROM-Klausel).

  • Erweiterung von SELECT * und SELECT tbl_name. * In eine Liste ausgewählter Spalten.

  • Auflösung von Spaltennamen in NATURAL- oder USING-Joins.

  • Die Transformation von NATURAL oder USING wird zu JOIN ... ON.

  • Auflösung von Spaltennamen im ON-Zustand eines JOIN ... ON.

Die interessanteste Änderung ist vielleicht die (jetzt zitiert aus der Dokumentation)

LEFT JOIN b USING (c1,c2,c3)

LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

sind nicht mehr ganz gleich, was die Bestimmung betrifft, welche Spalten zur SELECT *Erweiterung angezeigt werden sollen . Der USINGJoin wählt den zusammengeführten Wert der entsprechenden Spalten aus, während der ONJoin alle Spalten aus allen Tabellen auswählt. Wählt für den vorhergehenden USINGJoin SELECT *die folgenden Werte aus:

COALESCE(a.c1,b.c1), COALESCE(a.c2,b.c2), COALESCE(a.c3,b.c3)

Wählt für den ONJoin SELECT *die folgenden Werte aus:

a.c1, a.c2, a.c3, b.c1, b.c2, b.c3

Bei einem inneren Join COALESCE(a.c1,b.c1)ist dies dasselbe wie entweder a.c1oder b.c1weil beide Spalten denselben Wert haben. Bei einer äußeren Verknüpfung (z. B. LEFT JOIN) kann eine der beiden Spalten sein NULL. Diese Spalte wird im Ergebnis weggelassen.


Schöne Perspektive und +1 !!!
RolandoMySQLDBA

1
Ein weiterer Grund für die SELECT *
Nichtverwendung
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.