Retour à la liste des articles Articles
26 minutes de lecture

Jointures SQL : 12 questions pratiques avec des réponses détaillées

Dans cet article, nous avons approfondi notre cours sur les jointures SQL et nous vous avons donné 12 exercices de jointure à résoudre. Mais ne vous inquiétez pas - tous les exercices ont des solutions et des explications. Si vous êtes bloqué, l'aide est là ! Après tout, ce cours est fait pour pratiquer et apprendre.

Les jointures SQL peuvent être délicates. Il ne s'agit pas seulement de la syntaxe, mais aussi de savoir quelles jointures utiliser dans quels scénarios.

Les jointures sont utilisées pour combiner des données provenant de deux tables ou plus en SQL. Les tables peuvent être jointes de plusieurs façons et, selon les tables, chaque façon de les joindre peut donner un résultat complètement différent. Il n'y a pas d'autre moyen d'apprendre cela que la pratique. Oui, vous pouvez lire des explications et des utilisations typiques des jointures SQL. Cela aide, c'est certain ! Mais la pratique s'appuie sur la résolution de problèmes et la répétition, ce qui permet d'assimiler les connaissances. Plus vous pratiquez, plus vous avez de chances que les problèmes de données réels que vous aurez à résoudre soient similaires ou complètement identiques à ce que vous avez déjà fait !

Et c'est ce que nous allons faire dans cet article ! Nous vous montrerons des exercices pour des utilisations basiques et plus avancées des jointures SQL. Si vous les appréciez, vous apprécierez d'autant plus notre cours. Les jointures en SQL car tous les exercices sont tirés de ce cours. Au total, le cours vous propose 93 exercices sur les jointures SQL. Ils couvrent des sujets allant des types de jointures en SQL au filtrage des données, en passant par la jointure de plus de deux tables, l'auto-jointure d'une table et l'utilisation de jointures non égales.

OK, présentons les ensembles de données et commençons les exercices, d'accord ? N'hésitez pas à vous aider de l'aide-mémoire SQL JOIN au fur et à mesure que vous avancez.

Liste des exercices

Voici la liste de tous les exercices de l'article :

INNER JOIN

INNER JOIN est un type de jointure SQL qui renvoie uniquement les lignes correspondantes des tables jointes.

Pour vous montrer comment cela fonctionne, nous allons utiliser le jeu de données 1 du cours.

Jeu de données 1

L'ensemble de données se compose de quatre tables : author, book, adaptation, et book_review.

Le premier tableau présente les données relatives à l'auteur dans les colonnes suivantes :

  • id - L'identifiant unique de l'auteur dans la base de données.
  • name - Le nom de l'auteur.
  • birth_year - L'année de naissance de l'auteur.
  • death_year - L'année de décès de l'auteur (le champ est vide si l'auteur est encore en vie).

Voici les premières lignes de la table :

idnamebirth_yeardeath_year
1Marcella Cole1983NULL
2Lisa Mullins18911950
3Dennis Stokes19351994
4Randolph Vasquez19572004
5Daniel Branson19651990

La deuxième table, bookprésente des informations sur les livres. Les colonnes sont les suivantes

  • id - L'ID d'un livre donné.
  • author_id - L'ID de l'auteur qui a écrit ce livre.
  • title - Le titre du livre.
  • publish_year - L'année de publication du livre.
  • publishing_house - Le nom de la maison d'édition qui a imprimé le livre.
  • note - La note moyenne du livre.

Il s'agit des cinq premières lignes :

idauthor_idtitlepublish_yearpublishing_houserating
1NULLSoulless girl2008Golden Albatros4.3
2NULLWeak Heart1980Diarmud Inc.3.8
34Faith Of Light1995White Cloud Press4.3
4NULLMemory Of Hope2000Rutis Enterprises2.7
56Warrior Of Wind2005Maverick4.6

Le tableau adaptation comporte les colonnes suivantes :

  • book_id - L'ID du livre adapté.
  • type - Le type d'adaptation (par exemple, film, jeu, pièce de théâtre, comédie musicale).
  • title - Le nom de cette adaptation.
  • release_year - L'année de création de l'adaptation.
  • rating - La note moyenne de l'adaptation.

Voici un aperçu des données de ce tableau :

book_idtypetitlerelease_yearrating
1movieGone With The Wolves: The Beginning20083
3movieCompanions Of Tomorrow20014.2
5movieHomeless Warrior20084
2movieBlacksmith With Silver20144.3
4moviePatrons And Bearers20043.2

Le tableau final est le suivant book_review. Il se compose des colonnes suivantes :

  • book_id - L'ID d'un livre chroniqué.
  • review - Le résumé de la critique.
  • author - Le nom de l'auteur de la critique.

Voici les données :

book_idreviewauthor
1An incredible bookSylvia Jones
1Great, although it has some flawsJessica Parker
2Dennis Stokes takes the reader for a ride full of emotionsThomas Green
3Incredible craftsmanship of the authorMartin Freeman
4Not the best book by this authorJude Falth
5Claudia Johnson at her best!Joe Marqiz
6I cannot recall more captivating plotAlexander Durham

Exercice 1 : Liste de tous les livres et de leurs auteurs

Exercice : Affichez le nom de chaque auteur avec le titre du livre qu'il a écrit et l'année de publication de ce livre.

Solution :

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id;

Explication de la solution : La requête sélectionne le nom de l'auteur, le titre du livre et son année de publication. Il s'agit de données provenant des deux tableaux : author et book. Nous pouvons accéder aux deux tables en utilisant INNER JOIN. La requête renvoie uniquement les lignes dont les valeurs correspondent (valeurs qui satisfont à la condition de jointure) dans les deux tables.

Nous référençons d'abord la table author dans la clause FROM. Ensuite, nous ajoutons la clause JOIN (qui peut également s'écrire INNER JOIN en SQL) et référençons la table book.

Les tables sont jointes sur la colonne commune. Dans ce cas, il s'agit de id de la table author et author_id de la table book. Nous voulons joindre les lignes où ces colonnes partagent la même valeur. Pour ce faire, nous utilisons la clause ON et spécifions les noms des colonnes. Nous indiquons également le nom de la table avant chaque colonne afin que la base de données sache où chercher. C'est principalement parce qu'il y a une colonne id dans les deux tables, mais nous voulons que la colonne id ne provienne que de la table author mais nous voulons que la colonne d'identification soit uniquement celle de la table En faisant référence au nom de la table, la base de données saura de quelle table nous avons besoin pour cette colonne.

Résultat de la solution :

Voici le résultat de la solution. Nous avons obtenu toutes ces données en joignant deux tables :

nametitlepublish_year
Marcella ColeGone With The Wolves2005
Lisa MullinsCompanions And Officers1930
Dennis StokesBlacksmith With Silver1984
Randolph VasquezFaith Of Light1995
Michael RostkovskyWarrior Of Wind2005

Exercice 2 : Liste des auteurs et des livres publiés après 2005

Exercice : Affichez le nom de chaque auteur avec le titre du livre qu'il a écrit et l'année de publication de ce livre. N'indiquez que les livres publiés après 2005.

Solution :

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id
WHERE publish_year > 2005;

Explication de la solution : Cet exercice et sa solution sont presque les mêmes que le précédent. En effet, la requête sélectionne les mêmes colonnes et joint les tables de la même manière que précédemment.

La différence est que l'exercice nous demande maintenant de n' afficher que les livres publiés après 2005. Cela nécessite de filtrer la sortie, ce que nous faisons à l'aide de la clause WHERE.

WHERE est une clause qui accepte les conditions utilisées pour filtrer les données. Elle est écrite après avoir joint les tables. Dans notre exemple, nous filtrons en référençant la colonne publish_year après WHERE et en utilisant l'opérateur de comparaison "supérieur à" (>) pour trouver les années postérieures à 2005.

Résultat de la solution :

Le résultat ne montre qu'un seul livre publié après 2005.

nametitlepublish_year
Darlene LyonsTemptations In Nature2007

Exercice 3 : afficher les livres adaptés dans les 4 ans et dont la cote est inférieure à celle de l'adaptation

Exercice : Pour chaque livre, indiquez son titre, le titre de l'adaptation, l'année d'adaptation et l'année de publication.

N'incluez que les livres dont la note est inférieure à celle de l'adaptation correspondante. En outre, n'indiquez que les livres pour lesquels une adaptation a été publiée dans les quatre ans suivant la publication du livre.

Renommez la colonne title du tableau book en book_title et la colonne title du tableau adaptation en adaptation_title.

Solution :

SELECT
  book.title AS book_title,
  adaptation.title AS adaptation_title,
  book.publish_year,
  adaptation.release_year
FROM book
JOIN adaptation
  ON book.id = adaptation.book_id
WHERE adaptation.release_year - book.publish_year <= 4
  AND book.rating < adaptation.rating;

Explication de la solution : Commençons par expliquer la solution à partir des clauses FROM et JOIN. Les colonnes que nous devons montrer proviennent des tableaux book et adaptation. Nous faisons référence à la première table dans FROM et à la seconde dans JOIN.

Dans la clause ON, nous égalisons les deux colonnes d'ID de livre et spécifions la table de chaque colonne. Il s'agit de la même chose que précédemment, mais avec des noms de table et de colonne différents.

Nous devons maintenant sélectionner les colonnes requises. Le problème ici est qu'il y a une colonne title dans les deux tables. Pour éviter toute ambiguïté, la meilleure pratique consiste à faire référence au nom de la table avant chaque colonne dans SELECT.

Remarque : cette pratique n'est obligatoire que pour les colonnes ambiguës. Cependant, c'est une bonne idée de le faire pour toutes les colonnes ; cela améliore la lisibilité du code et l'approche reste cohérente.

Après avoir sélectionné les colonnes, nous devons renommer certaines d'entre elles. Pour ce faire, nous utilisons le mot-clé AS et écrivons ensuite un nouveau nom de colonne. Ainsi, une colonne title devient book_title, l'autre adaptation_title. Le fait de donner des alias aux noms de colonnes permet également de se débarrasser de toute ambiguïté.

Nous devons maintenant filtrer les résultats. La première condition est que l'adaptation doit être publiée quatre ans ou moins après le livre. Nous utilisons à nouveau WHERE et déduisons simplement l'année de publication du livre de l'année de sortie de l'adaptation. Nous disons ensuite que la différence doit être inférieure ou égale à (<=) 4.

Nous devons également ajouter la deuxième condition, à savoir que le livre soit moins bien noté que l'adaptation. C'est simple ! La question implique que la première et la deuxième condition doivent être remplies. L'indice se trouve dans AND, un opérateur logique que nous utilisons pour ajouter la deuxième condition. Ici, il utilise l'opérateur "moins de" (<) pour comparer les deux notes.

Résultat de la solution :

Le résultat montre trois paires livre-adaptation qui remplissent les conditions.

book_titleadaptation_titlepublish_yearrelease_year
Memory Of HopePatrons And Bearers20002004
Music At The LakeMusic At The Lake20042007
Companion Of TomorrowLighting Faith19491952

JOINT DE GAUCHE

Maintenant que vous avez compris l'essentiel de INNER JOIN, passons à LEFT JOIN. Il s'agit d'un type de jointure externe qui renvoie toutes les colonnes du tableau de gauche (le premier) et uniquement les lignes correspondantes du tableau de droite (le second). S'il y a des données non correspondantes, elles sont affichées à l'adresse NULL.

Pour en savoir plus, consultez notre article sur le LEFT JOIN.

Exercice 4 : Afficher tous les livres et leurs adaptations (le cas échéant)

Exercice : Affichez le titre de chaque livre ainsi que le titre de son adaptation et la date de sortie. Affichez tous les livres, qu'ils aient ou non fait l'objet d'une adaptation.

Solution :

SELECT
  book.title,
  adaptation.title,
  adaptation.release_year
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id;

Explication de la solution : Nous sélectionnons d'abord les colonnes nécessaires dans les deux tableaux. Ensuite, nous joignons book (la table de gauche) avec adaptation (la table de droite) à l'aide de LEFT JOIN. Vous voyez que la syntaxe de jointure SQL est la même pour INNER JOIN. La seule chose qui change est le mot-clé de jointure.

Remarque : SQL accepte à la fois LEFT JOIN et LEFT OUTER JOIN. Il s'agit de la même commande.

Résultat de la solution :

L'instantané de sortie montre les données requises, certaines d'entre elles étant affichées sous la forme NULL. Il s'agit des livres sans l'adaptation.

titletitle-2release_year
Soulless girlGone With The Wolves: The Beginning2008
Faith Of LightCompanions Of Tomorrow2001
Warrior Of WindHomeless Warrior2008
Guarding The EmperorNULLNULL
Blacksmith With SilverNULLNULL

Exercice 5 : Afficher tous les livres et leurs adaptations cinématographiques

Exercice : Affichez tous les livres avec leurs adaptations cinématographiques. Sélectionnez le titre de chaque livre, le nom de sa maison d'édition, le titre de son adaptation et le type d'adaptation. Conservez les livres sans adaptation dans le résultat.

Solution :

SELECT
  book.title,
  publishing_house,
  adaptation.title,
  adaptation.type
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id
WHERE type = 'movie'
  OR type IS NULL;

Explication de la solution :

La question demande d'afficher toutes les lignes, même celles qui ne comportent pas d'adaptations. Il est possible qu'il y ait des livres sans adaptations, nous utilisons donc LEFT JOIN.

Nous sélectionnons d'abord le titre du livre, sa maison d'édition, le titre de l'adaptation et son type.

Ensuite, nous joignons book (la table de gauche) avec adaptation (la table de droite) en utilisant LEFT JOIN. Nous joignons les tables sur l'ID du livre. Tous les livres qui ne remplissent pas les conditions auront NULLs comme titre et type d'adaptation.

Nous filtrons les données à l'aide de WHERE. La première condition est que le type d'adaptation doit être un film, nous égalisons donc la colonne type avec un film en utilisant le signe égal (=). Remarque : lorsque des données textuelles sont utilisées dans la condition WHERE, elles doivent être placées entre guillemets simples ('').

La deuxième condition de filtrage est ajoutée à l'aide de l'opérateur logique OR. Elle indique que le type peut également être NULL s'il ne s'agit pas d'un film. L'exercice nous demande de conserver dans les résultats les livres qui n'ont pas été adaptés.

Résultat de la solution :

Voici l'instantané du résultat. Vous pouvez voir qu'il ne montre que les livres adaptés en films ou non adaptés du tout.

titlepublishing_housetitle-2type
Soulless girlGolden AlbatrosGone With The Wolves: The Beginningmovie
Faith Of LightWhite Cloud PressCompanions Of Tomorrowmovie
Warrior Of WindMaverickHomeless Warriormovie
Guarding The EmperorFlying Pen MediaNULLNULL
Blacksmith With SilverDiarmud Inc.NULLNULL

JONCTION À DROITE

Là où il y a LEFT JOIN, il y a aussi RIGHT JOIN, n'est-ce pas ? Bien qu'il s'agisse de l'image inversée du LEFT JOIN, il fait toujours partie de la pratique des jointures SQL.

Il s'agit d'un type de jointure qui renvoie toutes les colonnes de la table de droite (la deuxième) et uniquement les lignes correspondantes de la table de gauche (la première). S'il y a des données non correspondantes, elles sont affichées à l'adresse NULL.

Exercice 6 : Afficher tous les livres avec leurs critiques (le cas échéant)

Exercice : Joindre les tableaux book_review et book à l'aide d'un RIGHT JOIN. Affichez le titre du livre, la critique correspondante et le nom de l'auteur de la critique. Considérez tous les livres, même ceux qui n'ont pas fait l'objet d'une critique.

Solution :

SELECT
  book.title,
  book_review.review,
  book_review.author
FROM book_review
RIGHT JOIN book
  ON book.id = book_review.book_id;

Explication de la solution :

Nous sélectionnons d'abord les colonnes nécessaires. Ensuite, nous faisons ce qui nous est demandé : nous joignons les tables à l'aide de RIGHT JOIN. Nous joignons les tables sur l'ID du livre. La table book est la bonne table ; nous voulons toutes les données qu'elle contient, quelles que soient les critiques.

Comme vous pouvez le constater, la syntaxe reste la même que pour INNER JOIN et LEFT JOIN.

Remarque : SQL accepte à la fois RIGHT JOIN et RIGHT OUTER JOIN.

Résultat de la solution :

La requête renvoie tous les titres de livres, leurs critiques et leurs auteurs. Lorsqu'il n'y a pas de critique ou d'information sur l'auteur, une adresse NULL est affichée.

titlereviewauthor
Soulless girlAn incredible bookSylvia Jones
Soulless girlGreat, although it has some flawsJessica Parker
Guarding The EmperorNULLNULL
Companions And OfficersNULLNULL
Blacksmith With SilverNULLNULL

JOINTURE COMPLÈTE

Voici un autre type de jointure utile dans certains scénarios : la jointure FULL JOIN. Il s'agit d'une combinaison de LEFT JOIN et RIGHT JOIN. Elle montre les lignes correspondantes des deux tables, les lignes qui n'ont pas de correspondance dans la table de gauche et les lignes qui n'ont pas de correspondance dans la table de droite. En bref, il affiche toutes les données des deux tables.

Vous pouvez en savoir plus sur la manière et le moment d'utiliser le FULL JOIN.

Exercice 7 : Lister tous les livres et tous les auteurs

Exercice : Affichez le titre de chaque livre ainsi que le nom de son auteur. Afficher tous les livres, même ceux qui n'ont pas d'auteur. Afficher tous les auteurs, même ceux qui n'ont pas encore publié de livre. Utilisez une adresse FULL JOIN.

Solution :

SELECT
  title,
  name
FROM book
FULL JOIN author
  ON book.author_id = author.id;

Explication de la solution : La question demande d'afficher tous les livres, mais aussi tous les auteurs - FULL JOIN est parfait pour faire cela de manière élégante.

Nous sélectionnons le titre du livre et le nom de l'auteur. Ensuite, nous FULL JOIN le tableau book avec le tableau author. La condition de jonction est que l'identifiant de l'auteur doit être le même dans les deux tables. Là encore, la syntaxe est la même que pour tous les types de jointure précédents.

Remarque : SQL accepte à la fois FULL JOIN et FULL OUTER JOIN.

Résultat de la solution :

La sortie indique tous les livres et tous les auteurs, que les auteurs ou les livres existent ou non dans les deux tables.

titlename
Gone With The WolvesMarcella Cole
Companions And OfficersLisa Mullins
NULLDaniel Branson
Weep Of The WestNULL

Jointure de 3 tables ou plus

Oui, les jointures SQL permettent de joindre plus de deux tables. Nous verrons comment le faire dans cette partie de la pratique des jointures SQL. Vous trouverez une explication plus détaillée des jointures multiples ici.

Nous avons également besoin d'un nouvel ensemble de données, alors présentons-le.

Jeu de données 2

La première table de l'ensemble de données est department. Ses colonnes sont les suivantes :

  • id - L'identifiant unique du département.
  • name - Le nom du département, c'est-à-dire l'endroit où un type de produit particulier est vendu.

Voici les données de la table.

idname
1fruits
2vegetables
3seafood
4deli
5bakery
6meat
7dairy

La deuxième table est productet se compose des colonnes suivantes :

  • id - L'ID d'un produit donné.
  • name - Le nom du produit.
  • department_id - L'ID du rayon où se trouve le produit.
  • shelf_id - L'ID de l'étagère du département où se trouve le produit.
  • producer_id - L'identifiant de l'entreprise qui fabrique ce produit.
  • price - Le prix du produit.

Voici l'aperçu des données :

idnamedepartment_idshelf_idproducer_idprice
1Apple11NULL0.5
2Avocado1171
3Banana1170.5
4GrapefruitNULL110.5
5Grapes1142

Le tableau suivant est nutrition_data. Ses colonnes et ses données sont indiquées ci-dessous :

  • product_id - L'ID d'un produit.
  • calories - La valeur calorifique de ce produit.
  • fat - La quantité de matières grasses dans ce produit.
  • carbohydrate - La quantité d'hydrates de carbone dans ce produit.
  • protein - La quantité de protéines dans ce produit.
product_idcaloriesfatcarbohydrateprotein
1130051
2504.531
31100301
4600151
NULL900230

Le quatrième tableau s'appelle producer. Il comporte les colonnes suivantes

  • id - L'identifiant d'un producteur alimentaire donné.
  • name - Le nom du producteur.

Les données de ce tableau sont présentées ci-dessous :

idname
1BeHealthy
2HealthyFood Inc.
3SupremeFoods
4Foodie
5Gusto
6Baker n Sons
7GoodFoods
8Tasty n Healthy

Le dernier tableau de l'ensemble de données est sales_history. Elle comporte les colonnes suivantes :

  • date - La date de la vente.
  • product_id - L'identifiant du produit vendu.
  • amount - La quantité de ce produit vendue un jour donné.

Voici également les données :

dateproduct_idamount
2015-01-14114
2015-01-14113
2015-01-1522
2015-01-1626
2015-01-1738

Exercice 8 : Afficher les produits de moins de 150 calories et leur rayon

Exercice : Dressez la liste de tous les produits qui contiennent moins de 150 calories. Pour chaque produit, indiquez son nom (renommez la colonne product) et le nom du rayon où il se trouve (nommez la colonne department).

Solution :

SELECT
  p.name AS product,
  d.name AS department
FROM department d
JOIN product p
  ON d.id = p.department_id
JOIN nutrition_data nd
  ON nd.product_id = p.id
WHERE nd.calories < 150;

Explication de la solution : Le principe général de la jonction d'un troisième (quatrième, cinquième...) tableau est qu'il suffit d'ajouter un autre JOIN. Vous pouvez voir comment procéder dans cet article expliquant les jointures multiples. Nous allons procéder de la même manière ici.

Nous joignons d'abord la table department avec la table product sur l'ID du département en utilisant JOIN. Mais nous avons également besoin de la troisième table. Pour obtenir les données, il suffit d'ajouter un autre JOIN, qui joindra la table sur l'ID du département à la table sur l'ID du département. product avec la table nutrition_data table. La syntaxe est la même que pour la première jointure. Dans ce cas, la requête joint les tables sur l'ID du produit.

Nous utilisons ensuite WHERE pour trouver les produits contenant moins de 150 calories. Enfin, nous sélectionnons les noms des produits et des départements et renommons les colonnes conformément aux instructions de l'exercice.

Remarque : vous avez probablement remarqué que les deux colonnes sélectionnées ont le même nom d'origine. Vous avez également remarqué que nous avons résolu cette ambiguïté en plaçant d'étranges noms de tables abrégés devant toutes les colonnes de la requête. Ces noms abrégés sont des alias de table, que vous donnez en les écrivant simplement après le nom de la table dans FROM ou JOIN. En donnant des alias aux tables, vous pouvez abréger leurs noms. Par conséquent, vous ne devez pas écrire leur nom complet (qui peut parfois être très long !), mais les alias courts à la place. Cela permet de gagner du temps et de l'espace.

Résultat de la solution :

Le résultat présente une liste des produits et du département auquel ils appartiennent. Elle ne comprend que les produits contenant moins de 150 calories.

productdepartment
Applefruits
Avocadofruits
Bananafruits
Kiwifruits
Lemonfruits

Exercice 9 : Liste de tous les produits avec leurs producteurs, leurs départements et leurs glucides

Exercice : Pour chaque produit, affichez

  • Le nom de l'entreprise qui l'a produit (nommez la colonne producer_name).
  • Le nom du département où se trouve le produit (nommez la colonne department_name).
  • Le nom du produit (nommez-le product_name).
  • Nombre total de glucides dans le produit.

Votre requête doit toujours prendre en compte les produits ne contenant pas d'informations sur producer_id ou department_id.

Solution :


SELECT
  prod.name AS producer_name,
  d.name AS department_name,
  p.name AS product_name,
  nd.carbohydrate
FROM product p
LEFT JOIN producer prod
  ON prod.id = p.producer_id
LEFT JOIN department d
  ON d.id = p.department_id
LEFT JOIN nutrition_data nd
  ON nd.product_id = p.id;

Explication de la solution : La requête sélectionne les colonnes requises. Elle joint ensuite la table product avec la table producer sur l'ID du producteur à l'aide de LEFT JOIN. Nous choisissons ce type de jointure parce que nous devons inclure des produits sans données sur le producteur.

Nous ajoutons ensuite un autre LEFT JOIN. Celui-ci ajoute la table department et la jointure avec la table product table. Là encore, nous choisissons LEFT JOIN parce que nous devons afficher les produits qui n'ont pas de département.

Il existe également une troisième jointure ! Nous l'ajoutons simplement à la chaîne des jointures précédentes. Il s'agit à nouveau de LEFT JOIN, car nous ajoutons la table nutrition_data et nous la joignons à la table product table.

Il s'agit d'un sujet intéressant à explorer. Voici donc un article qui explique les jointures multiples à gauche pour vous aider.

Résultat de la solution :

Le résultat montre tous les produits avec le nom de leur producteur et de leur service, ainsi que les quantités d'hydrates de carbone :

producer_namedepartment_nameproduct_namecarbohydrate
BeHealthyfruitsKiwi20
BeHealthyvegetablesBroccoli8
BeHealthymeatChickenNULL
BeHealthyNULLGrapefruit15
HealthyFood Inc.vegetablesCelery4

Si vous avez besoin de plus de détails, veuillez lire comment joindre à gauche plusieurs tables en SQL.

Exercice 10 : Afficher tous les produits, les prix, les producteurs et les départements

Exercice : Pour chaque produit, affichez son nom, son prix, le nom du producteur et le nom du département.

Alias des colonnes : product_name, product_price, producer_name, et department_name, respectivement. Incluez tous les produits, même ceux qui n'ont pas de producteur ou de département. Incluez également les producteurs et les départements sans produit.

Solution :

SELECT
  p.name AS product_name,
  p.price AS product_price,
  prod.name AS producer_name,
  d.name AS department_name
FROM product p
FULL JOIN producer prod
  ON p.producer_id = prod.id
FULL JOIN department d
  ON d.id = p.department_id;

Explication de la solution : Cet exercice nécessite l'utilisation de FULL JOIN, car nous avons besoin de toutes les données des tables que nous utiliserons : product, producer, et department.

La syntaxe est la même que dans les exemples précédents. Nous joignons simplement les différentes tables (product et producer) sur l'ID du producteur et utilisons un type de jointure différent : FULL JOIN.

Le second FULL JOIN joint la table product avec la table department table.

Après avoir sélectionné les colonnes nécessaires et les avoir renommées, nous obtenons le résultat suivant.

Résultat de la solution :

La solution affiche toutes les données des tables et des colonnes sélectionnées :

product_nameproduct_priceproducer_namedepartment_name
Chicken5.5BeHealthymeat
Broccoli2.5BeHealthyvegetables
Kiwi0.3BeHealthyfruits
Grapefruit0.5BeHealthyNULL
Cucumber0.7HealthyFood Inc.vegetables

Auto-jonction

Une jointure automatique n'est pas un type distinct de SQL JOIN - n'importe quelle jointure peut être utilisée pour la jointure automatique d'une table. Il s'agit simplement d'une jointure utilisée pour joindre la table à elle-même. En donnant des alias différents à la même table, celle-ci est traitée comme deux tables différentes lorsqu'elle est jointe.

Pour plus de détails, consultez notre guide illustré de l'auto-jointure SQL.

Ensemble de données 3

L'ensemble de données de cet exemple se compose d'une seule table : workshop_workers. Elle contient les colonnes suivantes.

  • id - L'ID du travailleur.
  • name - Le nom et le prénom du travailleur.
  • specialization - La spécialisation du travailleur.
  • master_id - L'ID du superviseur du travailleur.
  • experience - Les années d'expérience du travailleur.
  • project_id - L'ID du projet auquel le travailleur est actuellement affecté.

Voici les données :

idnamespecializationmaster_idexperienceproject_id
1Mathew ConnwoodworkingNULL201
2Kate Brownwoodworking141
3John Doeincrusting531
4John Kowalskywatchmaking723
5Suzan GregowitchincrustingNULL154

Exercice 11 : Liste de tous les travailleurs et de leurs superviseurs directs

Exercice : Affichez les noms de tous les travailleurs ainsi que les noms de leurs superviseurs directs. Renommez les colonnes apprentice_name et master_name, respectivement. Ne considérez que les travailleurs qui ont un superviseur (c'est-à-dire un maître).

Solution :

SELECT
  apprentice.name AS apprentice_name,
  master.name AS master_name
FROM workshop_workers apprentice
JOIN workshop_workers master
  ON apprentice.master_id = master.id;

Explication de la solution : Commençons par expliquer l'auto-jonction. Le principe général est le même que pour les jointures ordinaires. Nous référençons la table dans FROM et lui donnons un alias, apprentice. Ensuite, nous utilisons JOIN et y référençons la même table. Cette fois, nous donnons à la table l'alias master. Nous prétendons en fait qu'une table contient les données relatives aux apprentis et l'autre les données relatives aux maîtres d'apprentissage.

Les tables sont jointes sur l'ID du maître d'apprentissage de la table apprentice et l'ID de la table master table.

Cet exemple est une utilisation typique d'une jointure automatique : la table possède une colonne (master_id) qui fait référence à une autre colonne de la même table (id). Les deux colonnes indiquent l'identifiant du travailleur. Lorsqu'il y a NULL dans master_id, cela signifie que le travailleur n'a pas de maître. En d'autres termes, il est le maître.

Après l'auto-jonction, il suffit de sélectionner les colonnes requises et de les renommer.

Résultat de la solution :

Le résultat montre tous les apprentis et leurs superviseurs directs.

apprentice_namemaster_name
Kate BrownMathew Conn
John DoeSuzan Gregowitch
John KowalskyJoe Darrington
Peter ParkerJoe Darrington
Mary SmithMathew Conn
Carlos BellSuzan Gregowitch
Dennis WrightJoe Darrington

Jointures non équitables

Le dernier sujet que nous aborderons dans cette pratique sur les jointures SQL est celui des jointures non égales. Les jointures que nous avons utilisées jusqu'à présent sont appelées jointures équi car elles utilisent le signe d'égalité (=) dans la condition de jointure. Les jointures non équi sont toutes les autres jointures qui utilisent d'autres opérateurs - opérateurs de comparaison (<, >, <=, >=, !=, <>), l'opérateur BETWEEN, ou toute autre condition logique - pour joindre les tables.

Ensemble de données 4

Nous utiliserons l'ensemble de données composé de deux tableaux. La première table est car. Voici ses colonnes :

  • id - L'identifiant de la voiture dans la base de données.
  • model - Le modèle de la voiture.
  • brand - La marque de la voiture.
  • original_price - Le prix d'origine de la voiture à l'état neuf.
  • mileage - Le kilométrage total de la voiture.
  • prod_year - l'année de production de la voiture.

Les données ressemblent à ceci :

idmodelbrandoriginal_pricemileageprod_year
1SpeedsterTeiko80,000150,0001999
2RoadmasterTeiko110,00030,0001980
3SundryTeiko40,00025,0001991
4FuruDomus50,00010,0002002
5EmperorDomus65,000140,0002005
6KingDomus200,0006,0001981
7EmpressDomus60,0007,6001997
8FuryTatsu150,00013,0001993

Le deuxième tableau est charity_auction avec les colonnes suivantes :

  • car_id - L'identifiant de la voiture.
  • initial_price - Le prix initial de la voiture (c'est-à-dire le prix de départ).
  • final_price - Le prix réel lorsque la voiture a été vendue.
  • buyer_id - L'identifiant de la personne qui a acheté la voiture.

Voici les données :

car_idinitial_pricefinal_pricebuyer_id
165,000NULLNULL
335,00050,0001
550,000120,0003
6350,000410,0004
765,000NULLNULL

Exercice 12 : afficher les voitures ayant un kilométrage supérieur à celui d'une voiture spécifique

Exercice : Indiquez le modèle, la marque et le prix final de chaque voiture vendue aux enchères. Ne considérez que les voitures vendues qui ont un kilométrage supérieur à celui de la voiture dont le nom est id = 4.

Solution :

SELECT
  car.model,
  car.brand,
  car.final_price
FROM car
JOIN charity_auction ca
  ON car.id = ca.car_id
JOIN car car2
  ON car.mileage > car2.mileage
WHERE car2.id = 4
  AND final_price IS NOT NULL;

Explication de la solution : Nous sélectionnons le modèle de voiture, la marque et le prix final.

Dans le premier site JOIN, nous joignons le tableau car avec la table charity_auction table. Les tables sont jointes lorsque les identifiants des voitures sont identiques. Il s'agit de notre équi ordinaire JOIN.

Nous ajoutons le deuxième JOIN, qui est une jointure automatique. Il ajoute la table car afin de pouvoir filtrer les données à l'aide de la condition de jointure non équivoque. La condition renverra toutes les voitures de la table car et toutes les voitures de la table car2 avec le kilométrage le plus bas. Il s'agit d'une condition non équivoque car elle utilise l'opérateur "supérieur à" ( > ). La syntaxe est la même, mais il y a > au lieu de = cette fois.

Enfin, nous devons filtrer les données à l'aide de WHERE. Nous ne souhaitons pas comparer le kilométrage de toutes les voitures. Nous voulons afficher les voitures dont le kilométrage est supérieur à celui de la voiture dont l'adresse est id = 4. C'est ce que fait la première condition de filtrage.

Nous ajoutons une autre condition de filtrage qui stipule que le prix final ne doit pas être NULL, c'est-à-dire que la voiture doit avoir été vendue aux enchères.

Résultat de la solution :

Le résultat indique deux voitures :

modelbrandfinal_price
SundryTeiko50,000
EmperorDomus120,000

Les jointures en SQL C'est en forgeant qu'on devient forgeron. Plus d'entraînement ? Encore plus parfait !

Douze exercices de jointure SQL représentent une bonne quantité de pratique. Grâce à ces exercices, vous avez pu apprendre et pratiquer tous les sujets de jointure les plus courants qui posent problème aux utilisateurs débutants et intermédiaires.

Il ne vous reste plus qu'à continuer ! C'est en pratiquant encore plus que l'on devient encore plus parfait. Si vous avez aimé nos exercices, vous pouvez en trouver d'autres dans notre cours sur les jointures SQL ou dans l'article sur les questions d'entretien sur les jointures SQL.

J'espère que vous réussirez tous les exercices qui vous y attendent !