En un MySQL JOIN
, ¿cuál es la diferencia entre ON
y USING()
? Por lo que puedo decir, USING()
es una sintaxis más conveniente, mientras que ON
permite un poco más de flexibilidad cuando los nombres de columna no son idénticos. Sin embargo, esa diferencia es tan pequeña que pensarías que simplemente la eliminarían USING()
.
¿Hay más en esto de lo que parece? En caso afirmativo, ¿qué debo usar en una situación dada?
using
tiene otro uso además de las uniones. Ver stackoverflow.com/a/13750399/632951Respuestas:
Es principalmente azúcar sintáctico, pero hay un par de diferencias notables:
ON es el más general de los dos. Uno puede unir tablas EN una columna, un conjunto de columnas e incluso una condición. Por ejemplo:
USING es útil cuando ambas tablas comparten una columna del mismo nombre exacto en el que se unen. En este caso, uno puede decir:
Un buen regalo adicional es que uno no necesita calificar completamente las columnas de unión:
Para ilustrar, para hacer lo anterior con ON , tendríamos que escribir:
Observe la
film.film_id
calificación en laSELECT
cláusula. Sería inválido decirlofilm_id
ya que eso crearía una ambigüedad:En cuanto a
select *
, la columna de unión aparece en el conjunto de resultados dos veces con,ON
mientras que solo aparece una vez conUSING
:fuente
USING
interpretaON
.USING(
categoría,
field_id,)
que es útil cuando se une mediante claves primarias compuestas, también escuché que el optimizador sí usaUSING
para mejorar el rendimiento en algunos casosUSING
una definición MySQL o es estándar?Pensé que me pondría aquí cuando me haya parecido
ON
más útil queUSING
. Es cuandoOUTER
uniones se introducen en las consultas.ON
se beneficia de permitir que el conjunto de resultados de la tabla a la que seOUTER
une una consulta se restrinja mientras se mantiene laOUTER
unión. Intentar restringir los resultados establecidos mediante la especificación de unaWHERE
cláusula, efectivamente, cambiará laOUTER
unión en unINNER
unión.De acuerdo, esto puede ser un caso relativo de esquina. Vale la pena poner por ahí aunque .....
Por ejemplo:
fuente
using
ofrece, no se puede combinar con otros predicados:select*from t join t2 using(i) and on 1
no funcionaría.where hasAirport ;
- Qué significa esto ? no hay valor para comparar.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
enumerará todos los países, pero solo las ciudades que comienzan con C o D (si corresponde). (Más ciudades llamadas 'E')Wikipedia tiene la siguiente información sobre
USING
:Tablas de las que estaba hablando:
La documentación de Postgres también los define bastante bien:
fuente
Para aquellos que experimentan con esto en phpMyAdmin, solo una palabra:
phpMyAdmin parece tener algunos problemas con
USING
. Para el registro, esto es phpMyAdmin ejecutado en Linux Mint, versión: "4.5.4.1deb2ubuntu2", Servidor de base de datos: "10.2.14-MariaDB-10.2.14 + maria ~ xenial - distribución binaria mariadb.org".He ejecutado
SELECT
comandos usandoJOIN
yUSING
en phpMyAdmin y en Terminal (línea de comando), y los de phpMyAdmin producen algunas respuestas desconcertantes:1) una
LIMIT
cláusula al final parece ser ignorada.2) el supuesto número de filas según se informa en la parte superior de la página con los resultados a veces es incorrecto: por ejemplo, se devuelven 4, pero en la parte superior dice "Mostrando filas 0 - 24 (2503 en total, la consulta tomó 0.0018 segundos). "
Iniciar sesión en mysql normalmente y ejecutar las mismas consultas no produce estos errores. Tampoco se producen estos errores al ejecutar la misma consulta en phpMyAdmin usando
JOIN ... ON ...
. Presumiblemente un error phpMyAdmin.fuente