Retour à la liste des articles Articles
12 minutes de lecture

7 exemples de jointures SQL avec explications détaillées

Avez-vous besoin de joindre plusieurs tables pour obtenir l'ensemble des résultats nécessaires ? Le SQL JOIN est un outil basique mais important utilisé par les analystes de données travaillant avec des bases de données relationnelles. Et je comprends qu'il puisse être difficile de choisir parmi les zillions de guides d'introduction aux jointures. Dans cet article, je vais me concentrer sur des exemples concrets avec des explications détaillées.

Introduction à la jointure

Avec les bases de données relationnelles, les informations que vous recherchez sont souvent stockées dans plusieurs tables. Dans de tels scénarios, vous aurez besoin de joindre ces tables. C'est là que la clause SQL JOIN entre en jeu.

La clause JOIN en SQL est utilisée pour combiner les lignes de plusieurs tables sur la base d'une colonne liée entre ces tables. Vous pouvez obtenir un aperçu de l'outil SQL JOIN dans cet article d'introduction.

Dans ce guide, je veux couvrir les types de base de Les jointures en SQL en passant par plusieurs exemples. J'aborderai en détail la syntaxe de chaque requête, son fonctionnement, la construction d'une condition et l'interprétation des résultats.

Pour les exemples, nous allons utiliser des informations sur une maison d'édition qui publie des livres originaux et traduits. Notre base de données contient quatre tables : books, authors, editors, et translators.

books
idtitletypeauthor_ideditor_idtranslator_id
1Time to Grow Up!original1121
2Your Triptranslated152232
3Lovely Loveoriginal1424
4Dream Your Lifeoriginal1124
5Orangestranslated122531
6Your Happy Lifetranslated152233
7Applied AItranslated132334
8My Last Bookoriginal1128

authors
idfirst_namelast_name
11EllenWriter
12OlgaSavelieva
13JackSmart
14DonaldBrain
15YaoDou

editors
idfirst_namelast_name
21DanielBrown
22MarkJohnson
23MariaEvans
24CathrineRoberts
25SebastianWright
26BarbaraJones
27MatthewSmith

translators
idfirst_namelast_name
31IraDavies
32LingWeng
33KristianGreen
34RomanEdwards

Si vous voulez vous entraîner à joindre des tables en SQL avec de nombreux exemples, je vous recommande de suivre le Les jointures en SQL cours. Il comprend 93 défis de codage !

INNER JOIN

Nous allons commencer par une requête de base INNER JOIN, ou plus simplement, JOIN. Ce type de jointure est utilisé lorsque nous voulons afficher les enregistrements correspondants de deux tables.

Exemple 1

Supposons que nous voulions afficher les titres de livres avec leurs auteurs (c'est-à-dire le prénom et le nom de l'auteur). Les titres des livres sont stockés dans la table books et les noms des auteurs sont stockés dans la table authors table.

Dans notre requête SQL, nous allons joindre ces deux tables en faisant correspondre la colonne author_id de la table books et la colonne id de la table authors:

SELECT b.id, b.title, a.first_name, a.last_name
FROM books b
INNER JOIN authors a
ON b.author_id = a.id
ORDER BY b.id;

Dans la clause SELECT, nous énumérons les colonnes à afficher : identifiant du livre, titre du livre, prénom de l'auteur et nom de l'auteur. Dans la clause FROM, nous spécifions la première table à joindre (également appelée table de gauche). Dans la clause INNER JOIN, nous spécifions la deuxième table à joindre (également appelée table de droite).

Ensuite, nous utilisons le mot-clé ON pour indiquer à la base de données quelles colonnes doivent être utilisées pour faire correspondre les enregistrements (c'est-à-dire la colonne author_id de la table books et la colonne id de la table authors ).

Notez également que nous utilisons des alias pour les noms de table (c.-à-d, b pour books et a pour authors). Nous attribuons les alias dans les clauses FROM et INNER JOIN et les utilisons tout au long de la requête. Les alias de table réduisent la saisie et rendent la requête plus lisible.

Voici le jeu résultant :

idtitlefirst_namelast_name
1Time to Grow Up!EllenWriter
2Your TripYaoDou
3Lovely LoveDonaldBrain
4Dream Your LifeEllenWriter
5OrangesOlgaSavelieva
6Your Happy LifeYaoDou
7Applied AIJackSmart
8My Last BookEllenWriter

Pour chaque enregistrement de la table de gauche (c'est-à-dire, books), la requête vérifie l'adresse author_id, puis recherche la même adresse id dans la première colonne de la table authors table. Elle extrait ensuite le prénom et le nom de famille correspondants.

Notez que l'ordre des tables n'a pas d'importance avec INNER JOIN, ou JOIN simple. L'ensemble de résultats serait exactement le même si nous avions placé la table authors dans la clause FROM et la table books dans la clause INNER JOIN.

INNER JOIN n'affiche que les enregistrements qui sont disponibles dans les deux tables. Dans notre exemple, tous les livres ont un auteur correspondant et tous les auteurs ont au moins un livre correspondant. Voyons donc ce qui se passe si certains enregistrements ne sont pas mis en correspondance.

Exemple n° 2

Dans notre deuxième exemple, nous allons afficher les livres avec leurs traducteurs (c'est-à-dire le nom de famille du traducteur). Seule la moitié de nos livres ont été traduits et ont donc un traducteur correspondant. Quel serait donc le résultat de l'association des éléments books et translators en utilisant INNER JOIN?

SELECT b.id, b.title, b.type, t.last_name AS translator
FROM books b
JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitletypetranslator
2Your TriptranslatedWeng
5OrangestranslatedDavies
6Your Happy LifetranslatedGreen
7Applied AItranslatedEdwards

La requête ne donne que les livres qui ont été traduits. J'ai ajouté la colonne type pour que ce soit plus clair. Le reste des livres n'a pas pu être mis en correspondance avec la table translators et ne sont donc pas affichés. C'est ainsi que fonctionne le site INNER JOIN.

Notez également que dans le deuxième exemple, nous avons utilisé le mot clé JOIN au lieu de INNER JOIN. Cela n'a aucun impact sur le résultat car INNER JOIN est le type de jointure par défaut en SQL. Vous pouvez découvrir d'autres types de jointures SQL dans ce guide détaillé.

Bien. Nous savons maintenant comment joindre des tables lorsque nous avons besoin que seuls les enregistrements correspondants soient affichés. Mais, que faire si nous voulons garder tous les livres dans le jeu résultant sans couper la table aux seuls livres traduits ? Il est temps d'apprendre les jointures externes !

JOINT GAUCHE

Nous commencerons notre présentation des jointures externes par le site LEFT JOIN. Vous devez utiliser ce type de jointure SQL lorsque vous souhaitez conserver tous les enregistrements de la table de gauche et uniquement les enregistrements correspondants de la table de droite.

Exemple n°3

Supposons que nous voulions afficher des informations sur l'auteur et le traducteur de chaque livre (c'est-à-dire leurs noms de famille). Nous voulons également conserver les informations de base sur chaque livre (c'est-à-dire id, title et type).

Pour obtenir toutes ces données, nous devons joindre trois tables : books pour les informations de base sur les livres, authors pour les noms de famille des auteurs, et translators pour les noms de famille des traducteurs.

Comme nous l'avons vu dans l'exemple précédent, l'utilisation de INNER JOIN (ou de JOIN) pour joindre la table translators entraîne la perte de tous les enregistrements des livres originaux (non traduits). Ce n'est pas ce que nous voulons maintenant. Donc, pour conserver tous les livres dans l'ensemble de résultats, nous joindrons les fichiers books, authors, et translators à l'aide de LEFT JOIN.

SELECT b.id, b.title, b.type, a.last_name AS author, 
 t.last_name AS translator
FROM books b
LEFT JOIN authors a
ON b.author_id = a.id
LEFT JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;

Vous voyez que nous commençons par la table books dans la clause FROM, ce qui en fait la table de gauche. C'est parce que nous voulons conserver tous les enregistrements de cette table. L'ordre des autres tables n'a pas d'importance.

Dans notre requête, nous commençons par LEFT JOIN la table authors en nous basant sur la colonne author_id de la table books et de la colonne id de la table authors de la table . Ensuite, nous rejoignons la table translators table sur la base de la colonne translator_id de la table books et la colonne id de la table translators table.

Voici le tableau obtenu :

idtitletypeauthortranslator
1Time to Grow Up!originalWriterNULL
2Your TriptranslatedDouWeng
3Lovely LoveoriginalBrainNULL
4Dream Your LifeoriginalWriterNULL
5OrangestranslatedSavelievaDavies
6Your Happy LifetranslatedDouGreen
7Applied AItranslatedSmartEdwards
8My Last BookoriginalWriterNULL

Super ! Nous avons conservé tous les livres !

Notez les valeurs NULL dans la colonne translator. Ces valeurs NULL correspondent aux enregistrements qui n'ont pas été mis en correspondance dans la table. translators tableau. Ces enregistrements concernent des livres originaux sans traducteur.

Avec un peu de chance, vous avez compris l'intuition qui se cache derrière les LEFT JOINs. Vous pouvez en apprendre davantage sur ce type de jointure SQL dans ce guide d'introduction.

Bon, passons à un autre exemple LEFT JOIN pour consolider les connaissances sur le sujet.

Exemple n° 4

Cette fois, nous voulons afficher les informations de base sur les livres (c'est-à-dire l'ID et le titre) ainsi que les noms de famille des éditeurs correspondants. Encore une fois, nous voulons garder tous les livres dans le jeu de résultats. Alors, quelle serait la requête ?

SELECT b.id, b.title, e.last_name AS editor
FROM books b
LEFT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL

Plutôt simple, non ? Nous avons à nouveau conservé tous les livres de l'ensemble de résultats, y compris le dernier, qui n'a pas d'éditeur correspondant dans notre base de données (notez la valeur NULL dans la dernière ligne).

Nous pouvons imaginer que l'éditeur n'est pas présent dans la table de nos éditeurs actuels simplement parce qu'il a quitté la maison d'édition après avoir édité le livre.

Attendez ! Et si nous avons des éditeurs dans l'équipe qui n'ont pas encore publié de livres ? Vérifions avec le type de jointure externe suivant.

JOINT DROIT

RIGHT JOIN est très similaire à LEFT JOIN. Je parie que vous avez deviné que la seule différence est que RIGHT JOIN conserve tous les enregistrements de la table de droite, même s'ils ne peuvent pas être mis en correspondance avec la table de gauche. Si vous l'avez fait, vous avez raison !

Exemple n° 5

Reprenons notre exemple précédent, mais cette fois-ci, notre tâche consistera à conserver tous les enregistrements de la table editors de la table. Nous aurons donc la même requête que dans l'exemple n° 4, sauf que nous remplacerons LEFT JOIN par RIGHT JOIN:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
RIGHT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
NULLNULLJones
NULLNULLSmith

Avec un seul mot modifié dans la requête, le résultat est très différent. Nous pouvons voir que nous avons effectivement deux éditeurs(Jones et Smith) qui n'ont pas de livres correspondants dans notre base de données. On dirait de nouvelles embauches !

Et ce n'est pas le seul changement. Nous n'avons pas non plus Mon dernier livre dans le jeu de résultats. Cet enregistrement de la table de gauche (c'est-à-dire , books) n'a pas été trouvé dans la table de droite (c'est-à-dire, editors) et n'a pas été inclus dans le résultat final.

Les RIGHT JOINs sont rarement utilisés dans la pratique car ils peuvent être remplacés par des LEFT JOINs qui sont beaucoup plus courants.

Par exemple, dans notre cas, nous pourrions reprendre notre requête de l'exemple n°4 et simplement échanger books et editors en mettant editors dans la clause FROM, ce qui en fait la table de gauche, et en mettant books dans la clause LEFT JOIN, ce qui en fait la table de droite. Le résultat aurait été le même que celui du tableau ci-dessus.

FULL JOIN

Nous sommes arrivés au dernier type de jointure externe, qui est FULL JOIN. Nous utilisons FULL JOIN lorsque nous voulons conserver tous les enregistrements de toutes les tables, même ceux qui ne sont pas appariés. Donc, c'est comme LEFT JOIN et RIGHT JOIN combinés. Passons directement aux exemples pour voir comment cela fonctionne en pratique.

Exemple n° 6

Pour commencer, joignons à nouveau les tables books et editors mais cette fois, nous conserverons tous les enregistrements des deux tables. Nous utilisons simplement FULL JOIN comme mot-clé de jointure, laissant le reste de la requête sans aucune modification :

SELECT b.id, b.title, e.last_name AS editor
FROM books b
FULL JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL
NULLNULLJones
NULLNULLSmith

Ça a l'air super ! Comme prévu, nous avons gardé tous les livres, même ceux qui n'ont pas d'éditeur correspondant. De même, nous avons gardé tous les éditeurs, même ceux qui n'ont pas encore de livres correspondants.

Notez que l'ordre des tables n'a pas d'importance avec la fonction FULL JOIN. Le résultat serait le même si nous intervertissions les tables en plaçant la table editors dans la clause FROM et la table books dans la clause FULL JOIN.

Exemple n° 7

Dans notre dernier exemple, nous voulons joindre les quatre tables pour obtenir des informations sur tous les livres, auteurs, éditeurs et traducteurs dans une seule table. Nous utiliserons donc FULL JOIN tout au long de notre requête SQL :

SELECT b.id, b.title, a.last_name AS author, e.last_name AS editor,
    t.last_name AS translator
FROM books b
FULL JOIN authors a
ON b.author_id = a.id
FULL JOIN editors e
ON b.editor_id = e.id
FULL JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitleauthoreditortranslator
1Time to Grow Up!WriterBrownNULL
2Your TripDouJohnsonWeng
3Lovely LoveBrainRobertsNULL
4Dream Your LifeWriterRobertsNULL
5OrangesSavelievaWrightDavies
6Your Happy LifeDouJohnsonGreen
7Applied AISmartEvansEdwards
8My Last BookWriterNULLNULL
NULLNULLNULLJonesNULL
NULLNULLNULLSmithNULL

Comme demandé, la table affiche tous les livres, auteurs, éditeurs et traducteurs. Les enregistrements qui n'ont pas été appariés ont pour valeur NULL. Voilà un excellent aperçu des données stockées dans notre base de données.

Il est temps de pratiquer Les jointures en SQL!

La maîtrise de Les jointures en SQL est l'une des principales exigences pour quiconque travaille avec des bases de données relationnelles. Pour vous aider à vous y retrouver dans les différents types de jointures SQL, LearnSQL.com a développé une fiche d'aide à l'utilisation des jointures SQL de deux pages. Elle fournit la syntaxe des différents JOIN ainsi que des exemples.

Cependant, pour maîtriser les JOIN, il faut beaucoup de pratique. Je vous recommande de commencer par le cours interactif Les jointures en SQL qui couvre les principaux types de jointures à l'aide de dizaines d'exemples et d'exercices. Pour en savoir plus sur ce cours, consultez cet article de présentation.

BONUS : Voici les 10 principales questions d'entretien sur les JOIN SQL et comment y répondre.

Bon apprentissage !