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

Was ist der Unterschied zwischen der Verwendung von und on in Tabellenverknüpfungen in MySQL?

Ich verwende die USING-Syntax nicht, da

  1. die meisten meiner Joins sind dafür nicht geeignet (nicht derselbe Feldname, der abgeglichen wird, und/oder mehrere Übereinstimmungen im Join) und
  2. es ist nicht sofort ersichtlich, worauf es bei mehr als zwei Tabellen hinausläuft

dh angenommen 3 Tabellen mit 'id' und 'id_2' Spalten, tut es

T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

werden

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

oder

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

oder wieder was anderes?

Dies für eine bestimmte Datenbankversion herauszufinden, ist eine ziemlich triviale Übung, aber ich habe kein großes Vertrauen darin, dass es über alle Datenbanken hinweg konsistent ist, und ich bin nicht die einzige Person, die meinen Code pflegen muss (also die andere Leute müssen auch wissen, womit es äquivalent ist).

Ein offensichtlicher Unterschied zwischen WHERE und ON besteht darin, ob die Verknüpfung außen ist:

Unter der Annahme eines T1 mit einem einzelnen ID-Feld, einer Zeile mit dem Wert 1 und einem T2 mit einem ID- und VALUE-Feld (eine Zeile, ID=1, VALUE=6), dann erhalten wir:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

gibt keine Zeilen, da das WHERE übereinstimmen muss, wohingegen

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

ergibt eine Zeile mit den Werten

1, NULL, NULL

da das ON nur für den Abgleich des Joins erforderlich ist, was optional ist, da es sich um ein äußeres Element handelt.