web-dev-qa-db-fra.com

Quelle est la différence entre les jointures séparées par des virgules et la syntaxe de jointure sur MySQL?

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

83
Big Money

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.

48
sateesh

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 forme Unknown 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.

31
spencer7593

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

12
veljasije

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é.

3
vhadalgi

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

2
Vinayak Pahalwan