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:
Répertoriez les tables impliquées dans une liste séparée par des virgules dans la clause FROM
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.
"... 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.
@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?
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ù.
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
CROSSJOIN 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.
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.
Réponses:
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:
Ecrivez l'association entre les tables dans la clause WHERE
Voici la requête réécrite à l'aide de la syntaxe ANSI-92 JOIN:
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:
Du point de vue de la maintenance:
Il existe de nombreuses raisons d'utiliser la syntaxe ANSI-92 JOIN sur ANSI-89:
Du point de vue du design:
La syntaxe ANSI-92 JOIN est un modèle, pas un anti-modèle:
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.
la source
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.
la source
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?
la source
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ù.
la source
Vous ne pouvez pas utiliser WHERE pour combiner deux tables. Ce que vous pouvez faire, c'est écrire:
La virgule ici équivaut à écrire:
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.
la source
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.
la source