Retour à la liste des articles Articles
7 minutes de lecture

Quelle est la différence entre avoir plusieurs tables dans FROM et utiliser JOIN ?

Quelle est votre approche de la jonction des tables en SQL ? Dans cet article, nous abordons deux approches et expliquons pourquoi de nombreux développeurs SQL ont une nette préférence pour JOIN.

Préférez-vous lister plusieurs tables dans FROM et utiliser WHERE pour définir les conditions de jointure ? Ou bien utilisez-vous le mot-clé JOIN ? SQL supporte les deux, mais il existe des différences significatives entre eux. Examinons chacune d'entre elles en détail, puis expliquons pourquoi JOIN est généralement préférable.

Joindre des tables en les énumérant dans FROM

Disons que nous gérons un magasin de jouets et que nous avons deux tables de base de données que nous voulons joindre : toys et sales.

Jouets

idnamebrandprice
1BumblebeeTransformers14.99
2Optimus PrimeTransformers19.99
3Lightning McQueenDisney Cars23.97
4RamoneDisney Cars20.99
5Wonder WomanBarbie39.99
6Princess LeiaBarbie99.99
7Wizard of Oz: GlindaBarbie43.95

Ventes

idtoy_idemployee_iddatequantity
1532020-07-011
2112020-07-011
3312020-07-021
4632020-07-031
5232020-07-031

Nous pouvons simplement lister les deux tables dans la clause FROM et indiquer dans la clause WHERE que le id de la table toy doit correspondre au site toy_id de la table sales de la table :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id;

Nous obtenons le résultat suivant :

idnamebrandpricequantitydate
1BumblebeeTransformers14.9912020-07-01
2Optimus PrimeTransformers19.9912020-07-03
3Lightning McQueenDisney Cars23.9712020-07-02
5Wonder WomanBarbie39.9912020-07-01
6Princess LeiaBarbie99.9912020-07-03

Tout a fonctionné comme prévu : nous avons joint deux tables et obtenu les résultats escomptés.

Il s'agit là d'une solution efficace pour joindre des tables en SQL. Cependant, elle utilise une ancienne syntaxe qui était courante avant que la norme SQL-92 n'introduise le mot-clé JOIN. Voyons maintenant comment nous pouvons obtenir le même résultat en utilisant une approche moderne de la jonction de tables.

Joindre des tables à l'aide du mot-clé JOIN

Nous pouvons utiliser la requête suivante avec le mot-clé JOIN pour obtenir le même résultat :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id;

Cette syntaxe a été introduite dans la norme SQL-92. Ici, nous n'avons qu'une seule table dans la clause FROM ; la table que nous voulons joindre est listée dans la clause JOIN. Ensuite, nous avons le mot-clé ON pour spécifier les colonnes à utiliser pour joindre ces tables.

Le résultat de cette requête est le même que ci-dessus. Toutefois, cette approche présente un certain nombre d'avantages qui la rendent plus répandue parmi les praticiens de SQL. Si vous préférez utiliser l'ancienne syntaxe pour joindre des tables, consultez les arguments suivants. Ils pourraient vous faire changer d'avis.

Pourquoi utiliser la nouvelle syntaxe pour les jointures SQL ?

Commençons par préciser qu'en termes de performances, il n'y a aucune différence entre les deux syntaxes. L'utilisation du mot-clé JOIN n'est pas seulement une norme formelle de nos jours, c'est aussi une pratique courante parmi les utilisateurs de SQL. Alors, quels sont les avantages de l'utilisation de la clause JOIN ?

Les conditions de jointure sont distinctes des conditions de filtrage

Lorsque vous utilisez l'ancienne syntaxe, vos conditions de jointure et vos conditions de filtrage sont physiquement regroupées dans la clause WHERE. Cela peut prêter à confusion.

Par exemple, disons que nous voulons voir uniquement les ventes du 3 juillet. Nous devons ajouter une condition supplémentaire à la clause WHERE :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id AND s.date = '2020-07-03';

Nous avons maintenant deux conditions dans WHERE, mais seule l'une d'entre elles est une véritable condition de filtrage. L'autre est juste utilisée pour spécifier les colonnes sur lesquelles joindre les tables.

Avec le mot-clé JOIN, les conditions de jointure sont séparées des conditions de filtrage :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id
WHERE s.date = '2020-07-03';

Ici, nous spécifions la condition de jointure dans ON et utilisons WHERE pour filtrer les résultats.

Les deux requêtes produiront le même résultat, mais la nouvelle syntaxe indique clairement où vous joignez les tables et où vous filtrez les résultats.

Il est plus facile de joindre plusieurs tables

Souvent, vous aurez besoin de joindre plusieurs tables avec SQL. Par exemple, disons que nous voulons joindre la table employees à la table toys et sales afin de savoir qui a vendu chaque jouet.

Employés

idname
1Rob Stevens
2Jane White
3Sofia Clark

Avec l'ancienne syntaxe, nous aurions la requête suivante :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t, sales s, employees e
WHERE t.id = s.toy_id AND e.id = s.employee_id;

Pour joindre les trois mêmes tables avec la syntaxe JOIN, nous utiliserions cette requête :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t
JOIN sales s
ON t.id = s.toy_id
JOIN employees e
ON e.id = s.employee_id;

Le résultat est le même :

idnamebrandpricequantitydateemployee
1BumblebeeTransformers14.9912020-07-01Rob Stevens
2Optimus PrimeTransformers19.9912020-07-03Sofia Clark
3Lightning McQueenDisney Cars23.9712020-07-02Rob Stevens
5Wonder WomanBarbie39.9912020-07-01Sofia Clark
6Princess LeiaBarbie99.9912020-07-03Sofia Clark

La "chaîne" de tables que nous voulons joindre est plus visible dans la nouvelle syntaxe, où nous joignons d'abord deux tables sur des colonnes spécifiques, puis nous joignons la troisième table en utilisant une autre condition de jointure. Avec l'ancienne syntaxe, les trois tables sont listées ensemble dans FROM, puis les deux conditions de jointure sont spécifiées (dans n'importe quel ordre) dans WHERE. Dans cette syntaxe, il est vite difficile de savoir quelle condition correspond à quelle jointure, surtout si l'on doit joindre plus de trois tables.

Les LEFT / RIGHT / FULL JOIN sont plus simples

La syntaxe JOIN rend tous les types de jointures externes très simples. Vous pouvez effectuer des jointures (externes) de gauche, des jointures (externes) de droite ou des jointures (externes) complètes en utilisant simplement les mots-clés respectifs (LEFT JOIN, RIGHT JOIN ou FULL JOIN).

Disons que nous voulons joindre les tables toys et sales afin que tous les jouets soient affichés dans le résultat, même s'il n'y a pas eu de ventes pour un jouet pendant la période donnée. Vous pouvez effectuer cette jointure facilement dans n'importe quelle base de données en utilisant simplement LEFT JOIN:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
LEFT JOIN sales s
ON t.id = s.toy_id;

Le résultat comprendra tous les jouets et les informations de vente correspondantes, le cas échéant :

idnamebrandpricequantitydate
5Wonder WomanBarbie39.9912020-07-01
1BumblebeeTransformers14.9912020-07-01
3Lightning McQueenDisney Cars23.9712020-07-02
6Princess LeiaBarbie99.9912020-07-03
2Optimus PrimeTransformers19.9912020-07-03
4RamoneDisney Cars20.99NULLNULL
7Wizard of Oz: GlindaBarbie43.95NULLNULL

Si vous ne connaissez pas les LEFT JOIN, lisez ce guide complet sur la jointure à gauche de plusieurs tables.

Et qu'en est-il de l'ancienne syntaxe ? C'est compliqué. Certaines bases de données autorisent certaines astuces pour joindre des tables à gauche sans utiliser le mot-clé JOIN, mais il n'existe pas de solution cohérente qui fonctionne dans tous les cas.

Par exemple, dans Oracle, vous pouvez utiliser l'opérateur (+) pour effectuer une jointure à gauche :

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.day
FROM toys t, sales s
WHERE t.id = s.toy_id (+);

Cependant, cette syntaxe ne fonctionne pas dans d'autres bases de données.

Éviter les CROSS JOIN accidentels

Un autre problème courant lié à la jointure de tables avec FROM est la CROSS JOIN accidentelle. Si vous omettez une condition de jointure dans WHERE, vous obtiendrez toutes les lignes de la première table combinées à toutes les lignes de la deuxième table. Ainsi, le nombre de lignes dans le jeu de résultats sera la multiplication du nombre de lignes dans chaque table. Une telle erreur peut être délicate à détecter et à déboguer.

En même temps, lorsque vous utilisez la norme SQL-92 pour joindre des tables, vous obtenez une erreur de syntaxe si vous omettez la condition de jonction. Bien entendu, vous pouvez effectuer une jointure croisée de vos tables dans la nouvelle syntaxe, mais uniquement si vous utilisez explicitement le mot clé correspondant (CROSS JOIN).

Il est temps d'apprendre la nouvelle syntaxe pour Les jointures en SQL!

La plupart des praticiens SQL s'accordent à dire que la nouvelle syntaxe est plus lisible une fois qu'on s'y est habitué. Nous espérons que vous êtes également convaincu que l'approche moderne de la jointure des tables en SQL mérite votre attention.

LearnSQL propose un cours complet sur Les jointures en SQL qui comprend 93 exercices interactifs. Vous aurez l'occasion de pratiquer les jointures internes, tous les types de jointures externes, les jointures non équitables et les auto-joints.

Outre les exercices, vous trouverez peut-être utile de rafraîchir vos connaissances sur Les jointures en SQL grâce à nos guides destinés aux débutants :

Bon apprentissage !