¿Cuál es la diferencia entre "usar" y "activar" en la tabla se une a MysQL?

Es esto

... T1 join T2 using(ID) where T2.VALUE=42 ... 

lo mismo que

 ... T1 join T2 on(T1.ID=T2.ID) where T2.VALUE=42 ... 

para todos los types de uniones?

Mi comprensión sobre el using(ID) es que es solo una abreviatura de on(T1.ID=T2.ID) . ¿Es esto cierto?

Ahora para otra pregunta:

Es lo anterior lo mismo que

 ... T1 join T2 on(T1.ID=T2.ID and T2.VALUE=42) ... 

Esto no creo que sea cierto, pero ¿por qué? ¿Cómo interactúan las condiciones en la cláusula on con la unión vs si está en la cláusula where?

No uso la syntax USING, ya que

  1. la mayoría de mis combinaciones no son adecuadas (no es el mismo nombre de campo que se está combinando, y / o múltiples coincidencias en la combinación) y
  2. no es inmediatamente obvio a qué se traduce en el caso con más de dos tablas

es decir, asumiendo 3 tablas con columnas 'id' e 'id_2', no

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

volverse

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

o

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

o algo más otra vez?

Descubrir esto para una versión de database en particular es un ejercicio bastante trivial, pero no tengo una gran cantidad de confianza de que sea consistente en todas las bases de datos, y no soy la única persona que tiene que mantener mi código (entonces el otras personas también tendrán que ser conscientes de lo que es equivalente).

Una diferencia obvia con WHERE vs ON es si la unión es externa:

Suponiendo un T1 con un solo campo de ID, una fila que contenga el valor 1 y una T2 con un campo ID y VALOR (una fila, ID = 1, VALOR = 6), entonces obtenemos:

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

no da filas, ya que se requiere que DONDE coincida, mientras que

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

dará una fila con los valores

 1, NULL, NULL 

ya que el ON solo es necesario para hacer coincidir la unión, que es opcional por ser externa.

La cláusula USING es una abreviatura de una combinación equitativa de columnas, suponiendo que las columnas existen en ambas tablas con el mismo nombre:

 A JOIN B USING (column1) A JOIN B ON A.column1=B.column1 

También puede nombrar varias columnas, lo que hace que las uniones en las teclas compuestas sean bastante sencillas. Las siguientes uniones deben ser equivalentes:

 A JOIN B USING (column1, column2) A JOIN B ON A.column1=B.column1 AND A.column2=B.column2 

Tenga en count que se necesita USING (<columnlist>) para tener paréntesis, mientras que ON <expr> no es necesario para tener paréntesis (aunque las parens se pueden utilizar alnetworkingedor de <expr> solo se pueden include alnetworkingedor de una expresión en cualquier otro context).

Además, ninguna otra tabla unida a la consulta puede tener una columna con ese nombre, de lo contrario, la consulta es ambigua y debería get un error.

En cuanto a su pregunta sobre condiciones adicionales, suponiendo que utilice una INNER JOIN , lógicamente debería dar el mismo resultado de la consulta, pero el plan de optimization puede verse afectado, dependiendo de la implementación de RDBMS. También OUTER JOIN da un resultado diferente si incluye condiciones en la cláusula join versus WHERE .

Creo que está en lo correcto: USAR (xx) es una mano corta para unir dos columnas con nombres idénticos.

En cuanto a la segunda pregunta, ambas consultas podrían ser iguales o diferentes dependiendo de la implementación del planificador de consultas específico de la database. Para averiguarlo por sí mismo (al less en postgres) haga una EXPLICACIÓN SELECCIONADA … para ver cómo se ejecutarán los planes de consulta.

Si solo hay una unión, entonces no hay diferencia.

La desventaja de la cláusula de uso es que ambas tablas deben tener el mismo nombre de columna.

Tu interpretación parece correcta. Este artículo puede ayudar.

En cuanto a la segunda pregunta, no veo por qué el resultado de su tercer ejemplo debería ser diferente del de los primeros dos. Cualquier condición en una cláusula 'ON' tiene el mismo significado que si estuviera en una cláusula 'WHERE'.

Aquí tienes las respuestas, no necesito añadir nada. Una vez que hice una testing de performance en esto, y el uso consistentemente y siempre corrí más rápido que ON. Sí, estoy hablando de 10 a 20 ms 🙂 MySQL, estoy hablando

Hay una diferencia en el resultado que no veo mencionado en las otras respuestas. Si haces esto:

  JOIN ... ON t1.common = t2.common 

luego, el set de resultados tendrá dos columnas llamadas common , específicamente t1.common y t2.common , y el nombre no calificado no funcionará en la consulta porque es ambiguo.

Si, por otro lado, haces esto:

  JOIN ... USING (common) 

entonces el set de resultados tendrá solo una columna llamada common , y será un nombre no calificado, ni t1.common ni t2.common estarán presentes.