113 votes

Dans les requêtes MySQL, pourquoi utiliser join au lieu où ?

Il semble que de combiner deux ou plusieurs tables, nous pouvons soit utiliser join ou où. Quels sont les avantages de l’un sur l’autre ?

168voto

OMG Ponies Points 144785

Toute requête portant sur plus d'une table nécessite une certaine forme d'association de lier les résultats du tableau "A" à la table "B". Le traditionnel (ANSI-89) les moyens de le faire, c'est:

  1. Liste des les tables impliquées dans une liste séparée par des virgules dans la clause from
  2. Écrire 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 norme ANSI-92 syntaxe de JOINTURE:

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

À partir d'un point de vue des Performances:


Où la prise en charge (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), il n'y a pas d'avantage en termes de performances à l'aide de la syntaxe sur l'autre. L'optimiseur voit que la même requête. Mais des requêtes plus complexes peuvent bénéficier de l'utilisation ANSI-92 syntaxe:

  • La capacité de contrôle de REJOINDRE l'ordre - l'ordre les tables sont numérisés
  • Capacité à appliquer des critères de filtre sur une table avant de se joindre à

À partir d'un point de vue de l'Entretien:


Il existe de nombreuses raisons pour utiliser ANSI-92 syntaxe de JOINTURE sur la norme ANSI-89:

  • Plus lisible, que les critères de JOINTURE est distincte de la clause where
  • Moins susceptibles de manquer les critères de JOINTURE
  • Cohérente en charge de la syntaxe pour REJOINDRE les types autres que l'INTÉRIEUR, faire des demandes facile à utiliser sur d'autres bases de données
  • Clause where ne sert de filtration du produit cartésien des tables jointes

À partir d'une Conception de point de vue:


ANSI-92 syntaxe de JOINTURE est le patron, pas anti-modèle:

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

Conclusion


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

10voto

HLGEM Points 54641

Ce sont ces problèmes avec l'aide de la où la syntaxe (autrement connu comme la jointure implicite):

Tout d'abord, il est trop facile d'obtenir croisée accidentelle rejoint parce que les conditions de jointure ne sont pas juste à côté de la table des noms. Si vous avez des 6 tables jointes ensemble, il est facile de manquer un dans la clause where. Vous verrez que cela fixe, trop souvent, en utilisant le mot clé distinct. C'est unimmense performances de la base de données. Vous ne pouvez pas obtenir à un accident de la croix-jointure à l'aide de l'explicite de la syntaxe de jointure que ce sera un échec de la vérification de la syntaxe.

À droite et à gauche les jointures sont problématiques (Dans SQl server, vous ne sont pas la garantie d'obtenir des résultats corrects) dans l'ancienne syntaxe dans certaines bases de données. En outre, ils sont déconseillés dans SQL Server je sais.

Si vous avez l'intention d'utiliser une jointure croisée, qui n'est pas clair à partir de l'ancienne syntaxe. Il est clair en utilisant le courant ANSII standard.

Il est beaucoup plus difficile pour le responsable de voir exactement quels sont les champs de la partie de la jointure ou même le tables se regrouper dans quel ordre à l'aide de la syntaxe implicite. Cela signifie qu'il peut prendre plus de temps pour réviser les requêtes. J'ai connu très peu de gens qui, une fois qu'ils ont pris le temps de se sentir à l'aise avec l'explicite de la syntaxe de jointure, n'était jamais revenu à l'ancienne.

J'ai aussi remarqué que certaines personnes qui utilisent ces jointures implicites ne pas vraiment comprendre comment les jointures de travail et sont donc d'obtenir des résultats incorrects dans leurs requêtes.

Honnêtement, auriez-vous l'utilisation de tout autre type de code qui a été remplacé par une meilleure méthode de 18 ans?

9voto

Tenner Points 3412

La plupart des gens ont tendance à trouver un peu plus clair quant à ce qui est jointe à ce que la syntaxe de jointure. En outre, il a l’avantage d’être une norme.

Personnellement, j’ai « grandi » sur WHEREs, mais plus j’utilise la syntaxe de jointure plus je commence à voir comment il est plus clair.

7voto

Otávio Décio Points 44200

Jointures explicites transmettent intention, laissant l’où les clause permettant d’effectuer le filtrage. C’est plus propre et c’est standard, et vous pouvez faire des choses telles que gauche externe ou externe droite qui est plus difficile à faire seulement avec where.

3voto

Mark Byers Points 318575

Vous ne pouvez pas utiliser où se combinent les deux tables. Ce que vous pouvez faire est bien d’écrire :

Ici, la virgule est équivalente à l’écriture :

Serait-ce que vous écrivez que ? Non - parce que ce n'est pas ce que tu veux dire du tout. Vous ne voulez pas une jointure croisée, vous voulez une jointure interne. Mais lorsque vous écrivez des virgules, vous dites que CROSS JOIN et qui est source de confusion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X