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
5 réponses
il n'y a aucune différence .
La deuxième représentationrend la requête plus lisible et fait apparaître très clairement quelle jointure correspond à quelle condition.
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).
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
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é.
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