Dans les requêtes MySQL, pourquoi utiliser join au lieu de where?

109

Il semble que combiner deux tables ou plus, nous pouvons utiliser join ou where. Quels sont les avantages de l'un par rapport à l'autre?

extraeee
la source
2
En fonction de votre utilisation, il peut avoir les mêmes résultats, mais avec un JOIN, vous pouvez faire d'autres types d'associations.
zneak
Est-ce que cela répond à votre question? Clause INNER JOIN ON vs WHERE
philipxy

Réponses:

161

Toute requête impliquant plusieurs tables nécessite une forme d'association pour lier les résultats de la table "A" à la table "B". Le moyen traditionnel (ANSI-89) de le faire est de:

  1. Répertoriez les tables impliquées dans une liste séparée par des virgules dans la clause FROM
  2. Ecrivez l'association entre les tables dans la clause WHERE

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

Voici la requête réécrite à l'aide de la syntaxe ANSI-92 JOIN:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

Du point de vue de la performance:


Lorsqu'elles sont prises en charge (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), il n'y a aucun avantage en termes de performances à utiliser l'une ou l'autre syntaxe par rapport à l'autre. L'optimiseur les considère comme la même requête. Mais les requêtes plus complexes peuvent bénéficier de l'utilisation de la syntaxe ANSI-92:

  • Possibilité de contrôler l'ordre JOIN - l'ordre dans lequel les tables sont analysées
  • Possibilité d'appliquer des critères de filtre sur une table avant de rejoindre

Du point de vue de la maintenance:


Il existe de nombreuses raisons d'utiliser la syntaxe ANSI-92 JOIN sur ANSI-89:

  • Plus lisible, car le critère JOIN est distinct de la clause WHERE
  • Moins susceptible de manquer les critères JOIN
  • Prise en charge cohérente de la syntaxe pour les types JOIN autres que INNER, rendant les requêtes faciles à utiliser sur d'autres bases de données
  • La clause WHERE sert uniquement de filtrage du produit cartésien des tables jointes

Du point de vue du design:


La syntaxe ANSI-92 JOIN est un modèle, pas un anti-modèle:

  • Le but de la requête est plus évident; les colonnes utilisées par l'application sont claires
  • Il suit la règle de modularité sur l'utilisation du typage strict chaque fois que possible. Explicite est presque universellement meilleur.

Conclusion


À défaut de familiarité et / ou de confort, je ne vois aucun avantage à continuer à utiliser la clause ANSI-89 WHERE au lieu de la syntaxe ANSI-92 JOIN. Certains pourraient se plaindre que la syntaxe ANSI-92 est plus verbeuse, mais c'est ce qui la rend explicite. Plus il est explicite, plus il est facile à comprendre et à maintenir.

Poneys OMG
la source
14
"... Toute requête impliquant plus d'une table nécessite une forme d'association pour lier les résultats de la table 'A' à la table 'B' ... Sinon, vous obtiendrez un produit cartésien, et vous ne voudrez probablement pas cela (Ces cartésiens font des produits LOUSY).
Scott Smith
8

La plupart des gens ont tendance à trouver la syntaxe JOIN un peu plus claire quant à ce qui est joint à quoi. De plus, il a l'avantage d'être une norme.

Personnellement, j'ai "grandi" sur WHEREs, mais plus j'utilise la syntaxe JOIN, plus je commence à voir à quel point c'est plus clair.

James Cronen
la source
1
@nawfal Je comprends - j'ai été élevé sur la syntaxe de l'ancien style mais une fois que je me suis habitué à la nouvelle, les avantages sont devenus clairs, par exemple plus difficile de faire une jointure croisée par erreur, plus explicite, plus facile de voir ce qu'est une jointure et ce qui un filtre, etc ... je suis devenu accro.
Basic
8

Voici les problèmes liés à l'utilisation de la syntaxe where (autrement connue sous le nom de jointure implicite):

Premièrement, il est trop facile d'obtenir des jointures croisées accidentelles car les conditions de jointure ne sont pas juste à côté des noms de table. Si vous avez 6 tables jointes, il est facile d'en manquer une dans la clause where. Vous verrez cela corrigé trop souvent en utilisant le mot-clé distinct. C'est un énorme succès pour la base de données. Vous ne pouvez pas obtenir une jointure croisée accidentelle à l'aide de la syntaxe de jointure explicite car elle échouera à la vérification de la syntaxe.

Les jointures droite et gauche sont problématiques (dans le serveur SQl, vous n'êtes pas assuré d'obtenir les résultats corrects) dans l'ancienne syntaxe de certaines bases de données. De plus, ils sont obsolètes dans SQL Server que je connais.

Si vous envisagez d'utiliser une jointure croisée, cela n'est pas clair dans l'ancienne syntaxe. Il est clair en utilisant la norme ANSII actuelle.

Il est beaucoup plus difficile pour le mainteneur de voir exactement quels champs font partie de la jointure ou même quelles tables se rejoignent dans quel ordre en utilisant la syntaxe implicite. Cela signifie que la révision des requêtes peut prendre plus de temps. J'ai connu très peu de gens qui, une fois qu'ils ont pris le temps de se sentir à l'aise avec la syntaxe de jointure explicite, sont revenus à l'ancienne méthode.

J'ai également remarqué que certaines personnes qui utilisent ces jointures implicites ne comprennent pas réellement le fonctionnement des jointures et obtiennent donc des résultats incorrects dans leurs requêtes.

Honnêtement, utiliseriez-vous un autre type de code qui a été remplacé par une meilleure méthode il y a 18 ans?

HLGEM
la source
6

Les jointures explicites transmettent une intention, laissant la clause where pour effectuer le filtrage. C'est plus propre et c'est standard, et vous pouvez faire des choses telles que l'extérieur gauche ou l'extérieur droit, ce qui est plus difficile à faire uniquement avec où.

Otávio Décio
la source
3

Vous ne pouvez pas utiliser WHERE pour combiner deux tables. Ce que vous pouvez faire, c'est écrire:

SELECT * FROM A, B
WHERE ...

La virgule ici équivaut à écrire:

SELECT *
FROM A
CROSS JOIN B
WHERE ...

Voulez-vous écrire cela? Non - parce que ce n'est pas du tout ce que vous voulez dire. Vous ne voulez pas de jointure croisée, vous voulez une jointure interne. Mais quand vous écrivez une virgule, vous dites CROSS JOIN et c'est déroutant.

Mark Byers
la source
0

En fait, vous avez souvent besoin de "WHERE" et "JOIN".

"JOIN" est utilisé pour récupérer les données de deux tables - basé sur les valeurs d'une colonne commune. Si vous souhaitez ensuite filtrer davantage ce résultat, utilisez la clause WHERE.

Par exemple, "LEFT JOIN" récupère TOUTES les lignes de la table de gauche, plus les lignes correspondantes de la table de droite. Mais cela ne filtre pas les enregistrements sur une valeur spécifique ou sur d'autres colonnes qui ne font pas partie de JOIN. Ainsi, si vous souhaitez filtrer davantage ce résultat, spécifiez les filtres supplémentaires dans la clause WHERE.

Gerhard Liebenberg
la source