Dans un MySQL JOIN
, quelle est la différence entre ON
et USING()
? Pour autant que je sache, la USING()
syntaxe est juste plus pratique, alors qu'elle ON
permet un peu plus de flexibilité lorsque les noms de colonne ne sont pas identiques. Cependant, cette différence est si minime qu'on pourrait penser qu'ils s'en débarrasseraient USING()
.
Y a-t-il plus que cela à l'œil nu? Si oui, que dois-je utiliser dans une situation donnée?
using
a une autre utilisation que les jointures Voir stackoverflow.com/a/13750399/632951Réponses:
Il s'agit principalement de sucre syntaxique, mais quelques différences sont à noter:
ON est le plus général des deux. On peut joindre des tables sur une colonne, un ensemble de colonnes et même une condition. Par exemple:
L'UTILISATION est utile lorsque les deux tables partagent une colonne du même nom exact auquel elles se joignent. Dans ce cas, on peut dire:
Un autre plaisir supplémentaire est qu'il n'est pas nécessaire de qualifier pleinement les colonnes de jointure:
Pour illustrer, pour faire ce qui précède avec ON , il faudrait écrire:
Notez la
film.film_id
qualification dans laSELECT
clause. Il serait invalide de dire simplementfilm_id
car cela créerait une ambiguïté:Quant à
select *
, la colonne de jointure apparaît deux fois dans l'ensemble de résultats avecON
alors qu'elle n'apparaît qu'une seule fois avecUSING
:la source
USING
interprèteON
.USING(
catégorie,
field_id)
qui est utile lors de la jonction par des clés primaires composites, j'ai également entendu que l'optimiseur utiliseUSING
pour améliorer les performances dans certains casUSING
une définition MySQL ou standard?Je pensais pouvoir participer ici quand j'aurais trouvé
ON
plus utile queUSING
. C'est lorsque lesOUTER
jointures sont introduites dans les requêtes.ON
bénéficie de la possibilité deOUTER
restreindre l'ensemble de résultats de la table sur laquelle se joint une requête tout en conservant laOUTER
jointure. Tenter de restreindre l'ensemble de résultats en spécifiant uneWHERE
clause va effectivement transformer laOUTER
jointure enINNER
jointure.Certes, cela peut être un cas d'angle relatif. Cela vaut la peine de le faire cependant .....
Par exemple:
la source
using
fournis, il ne peut pas être combiné avec d'autres prédicats:select*from t join t2 using(i) and on 1
ne fonctionnerait pas.where hasAirport ;
- Qu'est-ce que ça veut dire ? aucune valeur n'est comparable.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
listera tous les pays, mais seulement les villes commençant par C ou D (le cas échéant). (Plus les villes appelées «E»)Wikipedia contient les informations suivantes sur
USING
:Tableaux dont il parlait:
La documentation Postgres les définit également assez bien:
la source
Pour ceux qui expérimentent cela dans phpMyAdmin, juste un mot:
phpMyAdmin semble avoir quelques problèmes avec
USING
. Pour mémoire, il s'agit de phpMyAdmin exécuté sur Linux Mint, version: "4.5.4.1deb2ubuntu2", serveur de base de données: "10.2.14-MariaDB-10.2.14 + maria ~ xenial - distribution binaire mariadb.org".J'ai exécuté des
SELECT
commandes en utilisantJOIN
etUSING
dans phpMyAdmin et dans Terminal (ligne de commande), et celles de phpMyAdmin produisent des réponses déroutantes:1) une
LIMIT
clause à la fin semble être ignorée.2) le nombre supposé de lignes tel que rapporté en haut de la page avec les résultats est parfois faux: par exemple 4 sont retournés, mais en haut il indique "Affichage des lignes 0 - 24 (2503 au total, la requête a pris 0,0018 secondes.) "
La connexion normale à mysql et l'exécution des mêmes requêtes ne produisent pas ces erreurs. Ces erreurs ne se produisent pas non plus lors de l'exécution de la même requête dans phpMyAdmin à l'aide de
JOIN ... ON ...
. Vraisemblablement un bogue phpMyAdmin.la source