Quel est le comportement par défaut de MySQL JOIN, INNER ou OUTER?

91

J'ai donc cherché sur Internet la dernière heure, lisant et recherchant la réponse définitive à cette simple question.

Quelle est la jointure par défaut dans MySQL?

SELECT * FROM t1 JOIN t2

Est-ce la même chose que

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Également une question connexe, lorsque vous utilisez des clauses "WHERE", est-ce la même chose que JOIN ou INNER JOIN?

À l'heure actuelle, je pense qu'un JOIN autonome est identique à l'utilisation de virgules et de clauses WHERE.

Quang Van
la source

Réponses:

124

Dans MySQL, l'écriture JOINimplique non qualifié INNER JOIN. Autrement dit , l' INNERen INNER JOINest facultative. INNERet CROSSsont des synonymes dans MySQL. Pour plus de clarté, j'écris JOINou INNER JOINsi j'ai une condition de jointure et CROSS JOINsi je n'ai pas de condition.

La syntaxe autorisée pour les jointures est décrite dans la documentation .


À l'heure actuelle, je pense qu'un JOIN autonome n'est rien de plus que (identique à) l'utilisation de virgules et de clauses WHERE.


L'effet est le même, mais l'histoire derrière eux est différente. La syntaxe de la virgule provient de la norme ANSI-89. Cependant, il existe un certain nombre de problèmes avec cette syntaxe, donc dans la norme ANSI-92, le mot clé JOIN a été introduit.

Je vous recommande fortement d' utiliser toujours la syntaxe JOIN plutôt que la virgule.

  • T1 JOIN T2 ON ...est plus lisible que T1, T2 WHERE ....
  • Il est plus facile à gérer car les relations de table et les filtres sont clairement définis plutôt que mélangés.
  • La syntaxe JOIN est plus facile à convertir en OUTER JOIN que la syntaxe virgule.
  • Mélanger la virgule et la syntaxe JOIN dans la même instruction peut donner des erreurs curieuses en raison des règles de priorité.
  • Il est moins probable de créer accidentellement un produit cartésien lors de l'utilisation de la syntaxe JOIN en raison d'une clause de jointure oubliée, car les clauses de jointure sont écrites à côté des jointures et il est facile de voir s'il en manque une.
Mark Byers
la source
Doux, merci d'avoir clarifié cette question simple pour moi :) Dans le passé, j'ai toujours utilisé des virgules + des clauses where ... mais je serai converti à l'utilisation de JOINs selon vos conseils. Merci
Quang Van
Hey Mark, qu'entendez-vous par des mélanges de JOIN et de virgules. Mélangez des requêtes comme celle-ci, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Quang Van
2
@Quang: Cela échouera par exemple:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers
0

Ceux-ci sont tous équivalents, et également égaux à, CROSS JOIN .

Il existe certaines différences entre l'utilisation de la virgule et de la [INNER | CROSS] JOINsyntaxe, ce qui peut être important lors de la jonction de plusieurs tables. Tout ce que vous devez savoir est décrit ici dans la documentation MySQLJOIN .

Mchl
la source
1
^ --- la réponse à la question est JOIN (autonome) est fondamentalement la même chose pour les clauses INNER et virgule + where
Quang Van