Par exemple, si je devais avoir une table "Personne" avec une colonne "id" qui fait référence à une colonne "id" dans la table "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
Il n'y a pas de différence du tout.
La deuxième représentation rend la requête plus lisible et donne l’impression que la jointure correspond à quelle condition.
Les requêtes sont logiquement équivalentes. L'opérateur comma est équivalent à un [INNER] JOIN
opérateur.
La virgule est l'opérateur de jointure de style ancien. Le mot-clé JOIN a été ajouté plus tard et est privilégié car il permet également les opérations de jointure OUTER.
Cela permet également de séparer les prédicats de jointure (conditions) de la clause WHERE
en une clause ON
. Cela améliore la lisibilité (humaine).
[~ # ~] suivi [~ # ~]
Cette réponse dit que les deux questions de la question sont équivalentes. Nous ne devrions pas mélanger la syntaxe de virgule old-school pour l'opération de jointure avec la syntaxe plus récente de JOIN
dans la même requête. Si nous les mélangons, nous devons être conscients d'une différence dans l'ordre de priorité.
extrait du manuel de référence MySQL
https://dev.mysql.com/doc/refman/5.6/en/join.html
INNER JOIN
et,
(virgules) sont sémantiquement équivalentes en l’absence de condition de jointure: elles produisent toutes les deux un produit cartésien entre les tables spécifiées (c’est-à-dire que chaque ligne de la première table est jointe à chacune des lignes de la seconde table).Cependant, la priorité de l'opérateur de virgule est inférieure à celle de
INNER JOIN
,CROSS JOIN
,LEFT JOIN
, etc. Si vous mélangez des jointures de virgule avec les autres types de jointure lorsqu'il existe une condition de jointure, une erreur de la formeUnknown column 'col_name' in 'on clause'
peut se produire. Des informations sur la résolution de ce problème sont données plus loin dans cette section.
Outre une meilleure lisibilité, il existe 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 appelé "table2"
SELECT
*
FROM table1 table2
Si vous oubliez par erreur une virgule dans une jointure séparée par une virgule, la seconde table est automatiquement convertie en alias de 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 JOINS facilite la lecture du code, car il est explicite.
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 fonctionne correctement, il ne devrait y avoir aucune différence entre ces requêtes. Ce 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 à mesure que le nombre de tables augmente.
La syntaxe JOIN
indique clairement quels critères affectent quelles tables (en donnant une condition). En outre, la deuxième manière est l'ancienne norme.
Bien que, pour la base de données, ils finissent par être les mêmes