Mon historique

 
Formation PUB200 : MySQL, 2018 Jointures

10.7 INNER JOIN vs WHERE


Certains développeurs utilisent la syntaxe suivante pour effectuer une jointure. On dira qu'on utilise la syntaxe WHERE :

Syntaxe MySQL

SELECT champ1, champ2, champ3

FROM table1, table2

WHERE champ1 = champ2

[AND condition];

alors que la façon habituelle d'effectuer une jointure est la suivante. On dira qu'on utilise la syntaxe JOIN :

Syntaxe MySQL

SELECT champ1, champ2, champ3

FROM table1

INNER JOIN table2

ON champ1 = champ2

[WHERE condition];

Notez que dans ces syntaxes, la condition permet de filtrer les données, c'est-à-dire déterminer quels enregistrements doivent être retournés. La partie « champ1 = champ2 », quant à elle, permet de préciser quels champs sont utilisés pour la jointure. 

L'utilisation de la condition a été mise entre crochets carrés pour indiquer que son utilisation est facultative. Les crochets carrés ne doivent pas être reproduits dans la requête.

Quelle est la meilleure syntaxe et pourquoi ? Vous devinez bien que c'est la syntaxe JOIN qui sera retenue puisque la syntaxe WHERE a été barrée. Voici tout de même les arguments qui ont mené à ce choix.

Temps d'exécution : pas concluant

Lorsqu'on travaille avec des tables contenant peu d'enregistrements, les tests de performance sont peu concluant. J'ai donc fait le test avec une table contenant 1811 enregistrements liée avec une table contenant 35 enregistrements.

À la ligne de commande MySQL, la requête utilisant la syntaxe JOIN a pris 0,11 seconde alors que celle avec le WHERE en a pris 0,41. Lors d'un autre test, j'ai obtenu le résultat de la requête avec JOIN en 0,01 seconde et celle utilisant le WHERE n'a pris que... 0,00 seconde.

Ces tests ne sont donc pas concluants puisque de nombreux facteurs peuvent influencer la rapidité de MySQL, autres que la syntaxe d'une requête (ex : processeur occupé à une autre tâche). C'est d'ailleurs ce qui ressort des groupes de discussion sur le sujet : les deux syntaxes étant équivalentes, le temps d'exécution devrait être équivalent.

Le temps d'exécution n'est donc pas un facteur permettant de choisir une syntaxe plutôt qu'une autre.

Facilité de compréhension (readability) : la plus grande justification pour l'utilisation d'un JOIN

Lorsqu'une requête utilise la syntaxe JOIN, elle est généralement plus facile à lire. On reconnait du premier coup d'oeil que la requête fait le lien entre deux tables. Les seules personnes qui ne sont pas d'accord avec cette affirmation sont celles habituées à utililiser la syntaxe WHERE.

Pour les débutants comme pour les experts, la facilité de compréhension est un facteur déterminant. La syntaxe JOIN est donc préférable.

Rôle de la clause WHERE

Si on demande spontanément à des développeurs à quoi sert une clause WHERE, la majorité d'entre eux répondra : « à sélectionner des enregistrement ».

On sait qu'en réalité, il est possible de l'utiliser pour effectuer une jointure mais le fait d'utiliser le WHERE dans deux contextes différents nuit à la facilité de compréhension.

De plus, la documentation officielle de MySQL sur la syntaxe JOIN dit clairement :

The conditional_expr used with ON is any conditional expression of the form that can be used in a WHERE clause. Generally, you should use the ON clause for conditions that specify how to join tables, and the WHERE clause to restrict which rows you want in the result set.

Ici encore, l'argumentaire est en faveur de la syntaxe JOIN.

Standard SQL

La clause JOIN a été introduite en 1992 par le standard SQL ANSI-92. Avant, la seule alternative pour joindre deux tables était l'utilisation de la syntaxe WHERE.

On peut donc croire que les gens qui continuent à effectuer des jointures à l'aide de la syntaxe WHERE sont de la vieille école. C'est peut-être l'habitude qui les amène à refuser d'utiliser le nouveau standard (pas si nouveau puisqu'il a été introduit alors que plusieurs d'entre vous n'étaient pas nés...).

Quand aux jeunes qui utilisent l'ancienne technique, ils le font peut-être parce qu'ils ont appris... des anciens. Ce n'est pas pour autant une bonne raison de s'éloigner du standard SQL.

Jointures externes

Certains SGBD mettent en garde les développeurs contre l'utilisation d'une syntaxe obsolète. C'est le cas, notamment, de MS-SQL qui ne supporte plus les jointures externes utilisant une clause WHERE (ex : WHERE champ1 *= champ2).

Ainsi, si vous êtes habitués à effectuer des jointures à l'aide de la syntaxe JOIN, il sera facile de transformer la requête en jointure externe puisque cette dernière nécessite désormais l'utilisation de la clause LEFT OUTER JOIN ou RIGHT OUTER JOIN.

La similitude de la syntaxe entre jointures internes et externes favorise l'utilisation de la syntaxe JOIN.

Jointures multiples

Lorsque vous devez joindre trois, quatre ou même cinq tables, la syntaxe WHERE peut rapidement devenir un fouillis, tel que démontré dans l'exemple suivant :

MySQL

SELECT factures.id, clients.prenom, clients.nomfamille FROM clients, voitures, factures
WHERE voitures.client_id = clients.id
AND factures.voiture_id = voitures.id
AND YEAR(factures.date) >= 2015

AND MONTH(factures.date) >= 4;

Voici la même requête utilisant la syntaxe JOIN. On voit clairement quelles clauses permettent de joindre les tables et quelles clauses permettent de sélectionner les enregistrements :

MySQL

SELECT factures.id, clients.prenom, clients.nomfamille FROM clients
INNER JOIN voitures ON voitures.client_id = clients.id
INNER JOIN factures ON factures.voiture_id = voitures.id

WHERE YEAR(factures.date) >= 2015 AND MONTH(factures.date) >= 4;

Pour toutes ces raisons, la jointure de deux ou de plusieurs tables doit absolument être réalisée à l'aide de la syntaxe JOIN. La jointure avec la syntaxe WHERE ne sera pas acceptée dans le cadre de ce cours ni des autres cours du programme.

Le lien entre les champs de deux tables sera toujours fait à l'aide de la clause ON.

La clause WHERE, quant à elle, sera utilisée pour filtrer les données c'est-à-dire spécifier quels enregistrements doivent être retournés.

Pour plus d'information

« JOIN Syntax ». MySQL. https://dev.mysql.com/doc/refman/5.7/en/join.html

« INNER JOIN ON vs WHERE clause ». Stack Overflow. http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause

« Avoid using deprecated syntax when you join tables or views ». Microsoft. https://msdn.microsoft.com/en-us/library/dd172122%28v=vs.100%29.aspx

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre