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?
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?
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
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
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:
Il existe de nombreuses raisons d'utiliser la syntaxe ANSI-92 JOIN sur ANSI-89:
La syntaxe ANSI-92 JOIN est un modèle, pas un anti-modèle:
À 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 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.
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
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.
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.