2009-02-23 6 views
4

Je me demande simplement si toutes les jointures suivantes sont logiquement équivalentes, et si non, pourquoi pas?Toutes ces jointures SQL sont-elles logiquement équivalentes?

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a where t1.b=t2.b and t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b where t1.c = t2.c; 

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

je pense est ma vraie question: ne Combining « où » avec « sur » faire quelque chose de différent de simplement avoir plusieurs conditions avec associés avec AND « sur »?

Je travaille avec MySQL, au cas où cela ferait une différence.

Répondre

5

Ils sont logiquement équivalents et devraient produire le même résultat. Cependant, le dernier doit être préféré car il indique plus correctement la sémantique de la requête - c'est-à-dire "joindre les tables t1 et t2".

La clause WHERE doit être utilisée pour "filtrer" les résultats de la jointure, par ex.

... WHERE t2.some_col > 10 

En outre, comme Constantin a dit dans une autre réponse, les 4 requêtes seraient différentes si la jointure est une jointure externe.

+0

La première requête exécuterait-elle complètement la jointure croisée, ou le SGBD est-il suffisamment intelligent pour appliquer la clause where en premier? –

+0

SQL Server éditions 2000 partiront inférer l'exemple le plus haut comme INNER JOINs. Testez-le et affichez le plan d'exécution –

+0

La réponse à cette question dépend du SGBD. Je sais que dans Oracle, l'optimiseur est assez intelligent pour choisir le même plan d'exécution dans les 4 cas, mais je ne connais pas d'autres SGBD comme mySQL. –

2

Oui, comme d'autres l'ont indiqué, le résultat est le même pour toutes ces requêtes.

FWIW, vous pouvez également utiliser cette syntaxe abrégée lorsque vous faites une équi-jointure sur les noms de colonnes qui sont les mêmes dans les deux tableaux:

SELECT t1.x, t2.y from t1 join t2 using (a, b, c); 

En ce qui concerne l'optimisation, il devrait être optimisé la même chose. Autrement dit, le SGBDR doit être suffisamment intelligent pour analyser la syntaxe WHERE de la même manière, et effectuer des jointures au lieu de générer un résultat de jointure croisée énorme intermédiaire et de lui appliquer des conditions de filtrage. C'est un type de requête si courant qu'il est également courant qu'une implémentation de SGBDR donnée le reconnaisse et l'optimise.

Dans le cas de MySQL, join et où (évalué) ensemble. Essayez d'utiliser EXPLAIN pour analyser votre requête. Si la colonne "type" indique "eq_ref", cela signifie qu'il utilise une jointure indexée. C'est le meilleur type de jointure en matière d'optimisation. Si "type" est "ref" c'est bien aussi.

Vous pouvez obtenir ces types d'optimisation de jointure si vous avez placé la condition dans la clause JOIN...ON ou la clause WHERE.

+0

Utilise-t-on l'utilisation de SQL standard ou est-ce spécifique à l'implémentation SQL de certains fournisseurs? – Thorsten

+0

Oui, la syntaxe USING est SQL standard. Je n'ai rencontré aucune marque de base de données prenant en charge JOIN ... ON, mais ne prenant pas en charge JOIN ... USING. Notez que les parenthèses sont obligatoires après l'utilisation, mais facultatives après ON. –

1

Ils sont logiquement équivalents. Toutefois, lorsque vous définissez les conditions de jointure fait une différence sur le nombre d'enregistrements utilisés dans la table temporaire sur laquelle la clause where est appliquée. C'est,

Si la table t1, t2 et t3 avaient 10 dossiers chacun, la déclaration,

SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

résultats en 1000 enregistrements d'une permutation des trois tables enregistrements, puis la clause where est appliquée.

Pour

SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c; 

seulement dix documents sont en table temporaire avant toute clause where (aucune dans ce cas) est appliquée. La deuxième méthode est beaucoup plus rapide lorsque vous travaillez avec de grandes tables.

Questions connexes