Quelle est la différence entre les jointures séparées par des virgules et les jointures sur la syntaxe dans MySQL? [dupliquer]

cette question a déjà une réponse ici:

  • interior JOIN ON vs WHERE clause 10 réponses
  • différence entre ces deux approches de la table de jonction? 3 réponses

Par exemple, si je devais avoir une table "Personne" avec une colonne "id" qui fait référence à une colonne "id" dans le tableau "Travailleur"

Quelle serait la différence entre ces deux requêtes? Ils donnent les mêmes résultats.

SELECT * 
FROM Person 
JOIN Worker 
  ON Person.id = Worker.id;

et

SELECT * 
FROM Person, 
     Worker 
WHERE Person.id = Worker.id;

Merci

68
demandé sur Hawk 2013-11-22 10:22:10

5 réponses

il n'y a aucune différence .

La deuxième représentation

rend la requête plus lisible et fait apparaître très clairement quelle jointure correspond à quelle condition.

34
répondu 5a7335h 2017-10-24 03:13:40

Les requêtes sont logiquement équivalentes. L'opérateur virgule est l'équivalent d'un opérateur [INNER] JOIN .

la virgule est l'opérateur de jointure de style plus ancien. Le mot-clé JOIN a été ajouté plus tard, et est favorisé parce qu'il permet également des opérations de jointure externes.

il permet également de séparer les prédicats de jointure (conditions) de la clause WHERE dans une clause ON . Cela améliore la lisibilité (humaine).

21
répondu spencer7593 2017-07-21 15:34:36

outre une meilleure lisibilité, il y a un autre cas où les tables explicitement jointes sont préférables aux tables séparées par des virgules.

voyons un exemple:

Create Table table1
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY ,
    Name varchar(50)
)

Create Table table2
(
    ID int NOT NULL Identity(1, 1) PRIMARY KEY ,
    ID_Table1 INT NOT NULL
)

la requête suivante me donnera toutes les colonnes et les lignes des deux tables

SELECT
    *
FROM table1, table2

la requête suivante me donnera les colonnes de la première table avec un alias de table appelé 'table2'

SELECT
    *
FROM table1 table2

si vous oubliez par erreur virgule dans la jointure séparée par une virgule, La deuxième table convertit automatiquement en alias table pour la première table. Pas dans tous les cas, mais il y a des chances pour quelque chose comme ça

12
répondu veljasije 2013-11-25 14:28:22

L'utilisation de jointures rend le code plus facile à lire, car il est auto-explicatif.

en vitesse il n'y a pas de différence (je l'ai testé) et le plan d'exécution est le même

si l'optimiseur de requêtes fait son travail correctement, il ne devrait pas y avoir de différence entre ces requêtes. Ils ne sont que deux façons de spécifier le même résultat souhaité.

3
répondu TeamDataViz. 2014-08-06 08:56:44

The SELECT * FROM table1, table2, etc. est bon pour quelques tables, mais il devient exponentiellement plus difficile que le nombre de tables augmente.

la syntaxe JOIN rend explicite quels critères affectent quelles tables (donnant une condition). En outre, la deuxième voie est l'ancienne norme.

bien que, à la base de données, ils finissent par être les mêmes

2
répondu Vinayak Pahalwan 2013-11-22 06:30:29