Quelle est la différence entre "using" et "on" dans la table joint dans MySQL?
Est-ce
... T1 join T2 using(ID) where T2.VALUE=42 ...
le même que
... T1 join T2 on(T1.ID=T2.ID) where T2.VALUE=42 ...
pour tous les types de jointures?
Ma compréhension de using(ID)
est que c'est juste un raccourci pour on(T1.ID=T2.ID)
. Est-ce vrai?
Maintenant une autre question:
Est le même que
... T1 join T2 on(T1.ID=T2.ID and T2.VALUE=42) ...
Cela, je ne pense pas que les est vrai, mais pourquoi? Comment les conditions de la clause d'interagir avec la jointure vs si son dans la clause where?
source d'informationauteur Pyrolistical
Vous devez vous connecter pour publier un commentaire.
Je n'utilise pas le à l'AIDE de la syntaxe, depuis
ie en supposant que 3 tables avec 'id' et 'id_2' colonnes, ne
devenir
ou
ou quelque chose d'autre encore?
Trouver cela pour un particulier de la version de base de données est assez simple, mais je n'ai pas une grande quantité de confiance qu'il est uniforme dans toutes les bases de données, et je ne suis pas la seule personne qui a à maintenir mon code (pour les autres personnes devront également être conscients de ce que c'est équivalent).
Une différence flagrante avec la OÙ vs est si la jointure externe:
En supposant un T1 avec un seul nom de domaine, une ligne contenant la valeur 1, et un T2 avec un ID et un champ de VALEUR (une ligne, ID=1, VALEUR=6), alors nous obtenons:
donne pas de lignes, depuis le OÙ il est requis de match, alors que
donnera une ligne avec les valeurs
depuis le SUR est nécessaire uniquement pour la correspondance de la jointure, qui est facultatif, à cause extérieure.
La
USING
clause est une abréviation pour une équi-jointure de colonnes, en supposant que les colonnes existent dans les deux tables du même nom:Vous pouvez également le nom de plusieurs colonnes, ce qui rend les jointures sur les clés composées assez simple. La suite se joint doit être équivalent:
Noter que
USING (<columnlist>)
est nécessaire d'avoir entre parenthèses, alors queON <expr>
n'est pas nécessaire d'avoir des parenthèses (bien que les parenthèses peuvent être utilisées autour de<expr>
seulement ils peuvent être inclus autour d'une expression dans tout autre contexte).Aussi, pas d'autres tableaux joints à la requête peut comporter une colonne de ce nom, sinon la requête est ambigu et vous devriez obtenir une erreur.
Vous concernant la question sur d'autres conditions, en supposant que vous utilisez un
INNER JOIN
elle devrait logiquement donner le même résultat à partir de la requête, mais le plan d'optimisation peuvent être affectés, selon le SGBD mise en œuvre. AussiOUTER JOIN
donne un résultat différent si vous d'inclure des conditions dans la jointure par rapport à laWHERE
clause.Je crois que vous avez raison - à l'AIDE de(xx) est à court de main pour le rejoindre sur deux colonnes avec des noms identiques.
Quant à la seconde question, les deux requêtes pourrait être la même ou peut être différente en fonction du planificateur de requête de mise en œuvre de la base de données. Trouver par vous-même (au moins dans postgres) faire un EXPLIQUER SÉLECTIONNER ... pour voir comment les plans de requête sera exécutée.
Si il n'y a qu'une seule jointure puis il n'y a pas de différence.
Inconvénient à l'utilisation de la clause est les deux tables doivent avoir le même nom de colonne.
Votre interprétation semble correcte. Cet article peut aider.
Quant à la seconde question, je ne vois pas pourquoi le résultat de votre troisième exemple devrait être différente de celle des deux premiers. Toute condition dans un " ON " clause a la même signification que si elle était dans une clause 'where'.
Vous avez obtenu les réponses ici, je n'ai pas besoin d'ajouter. Une fois j'ai fait un test de performance sur ce, et en UTILISANT de façon constante et toujours couru plus vite que SUR. Oui je parle de 10 à 20 ms 🙂 MySQL je parle
Il y a une différence dans le résultat que je ne vois pas mentionné dans les autres réponses. Si vous faites cela:
alors le résultat aura deux colonnes nommées
common
spécifiquementt1.common
ett2.common
et le nom non qualifié ne fonctionnera pas dans la requête parce qu'il est ambigu.Si, d'autre part, pour ce faire:
alors le résultat aura une seule colonne nommée
common
et il sera un grand nom - nit1.common
nit2.common
seront présents.