Bienvenue

Dans cette section, vous trouverez des ressources sur les cours que j'enseigne à savoir de la documentation, du code, des vidéos etc. Dès que je trouve quelque chose d'intéressant à partager, je le mettrai à disposition ici pour mes étudiants.


Série d'exercices sur les requêtes sélection multitables avec jointure

Travaux dirigés 9

			##Auteur : Enseignant
			##École : Collège Marie Victorin 
			##Session : Hiver 2026
			##Titre du cours : Introduction aux bases de données
			##Titre du programme : Travaux dirigés 9
			##Version : 1.0
			##Date : 00/00/2026
			##Langage et version : SQL 
			##Moteur : SQL Server Express
		
			-- Les requêtes sélection dans le langage SQL

			-- Objectif : 
			-- Ce travail dirigé portera sur la création de requêtes sélection multitables avec des jointures
			-- ==============================================================================================

			-- ***************************************************************************
			-- Vérifications à faire systématiquement AVANT d'écrire les requêtes
			-- Vérifier la structure de la table à utiliser, c'est à dire :
			--		Le nom de la table
			--		Le nom des colonnes
			--		Le type des colonnes
			--		Les données contenues dans la table

			-- Base de données : Xtremefr

			-- En utilisant la base de données Xtreme créer les requêtes qui correspondent aux énoncés suivants.
			-- Cette série d'exercices couvre toutes les notions vues dans les cours précédents à savoir :
			-- les clauses : DISTINCT, TOP n, WHERE, GROUP BY, HAVING, ORDER BY, INNER JOIN

			-- Requete 1
			/* ===================================================================================================
			Manipulation des noms de clients
			********************************
			Demande du client : 
			Pour des étiquettes, j'ai besoin des 3 premières lettres du nom du client en majuscule, suivies de '...'.

			*/
			-- Votre code ici
			SELECT 
				[Nom du client],
				CONCAT(UPPER(LEFT([Nom du client], 3)), '...') AS Etiquette
			FROM [Clients];
		
			-- ---------
			-- Requete 2
			/* ===================================================================================================
			Formatage des prix pour affichage
			*********************************
			Demande du client : Liste de produits
			Je veux afficher les prix des produits sous la forme : 'Produit : [Nom] coûte [Prix] $'. Assurez-vous que le prix n'a pas trop de décimales."
			*/
			-- Votre code ici
			SELECT 
				CONCAT('Produit : ', [Nom du produit], ' coûte ', CAST(ROUND([Prix conseillé], 2) AS VARCHAR), ' $') AS AffichagePrix
			FROM [Produits];
		
			-- ---------
			/* ===================================================================================================
			Requete 3

			Annuaire des employés
			*********************
			Demande du client : 
			Pour l'annuaire interne, j'ai besoin de la liste de tous les employés. 
			Affichez leur nom complet en majuscules (PRÉNOM NOM) et leur date d'embauche.
			*/
			-- Votre code ici
			SELECT 
				UPPER(CONCAT(e.[Prénom], ' ', e.[Nom])) AS NomComplet,
				e.[Date d'embauche]
			FROM [Employés] e;

		
			-- ---------
			/* ===================================================================================================
			Requete 4

			Employés sans responsable
			*************************
			Demande du client : 
			Qui sont les employés qui n'ont pas de supérieur hiérarchique indiqué dans le système ?
			*/
			-- Votre code ici
			SELECT 
				[Nom], 
				[Prénom]
			FROM [Employés]
			WHERE 
				[ID supérieur] IS NULL OR [ID supérieur] = '';

		
			-- ----------
			/* ===================================================================================================
			Requete 5

			Commandes récentes (6 derniers mois)
			************************************
			Demande du client : 
			Montrez-moi toutes les commandes passées au cours des 6 derniers mois à partir d'aujourd'hui.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[ID commande], 
				[Date de commande]
			FROM [Commandes]
			WHERE 
				[Date de commande] >= DATEADD(MONTH, -6, GETDATE());

		
			-- ----------
			/* ===================================================================================================
			Requete 6

			Extraction du domaine email des clients
			***************************************
			Demande du client : 
			Je veux faire une campagne par fournisseur de mail. 
			Extrayez la partie après le '@' dans l'adresse électronique des clients.
			Quels sont les colonnes pertinents pour mon opération de marketing ?
			Indice : 3

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[Nom du client],
				[Adresse électronique],
				SUBSTRING([Adresse électronique], CHARINDEX('@', [Adresse électronique]) + 1, LEN([Adresse électronique])) AS DomaineV1,
				RIGHT([Adresse électronique], LEN([Adresse électronique]) - CHARINDEX('@', [Adresse électronique])) DomaineV2
			FROM [Clients]
			WHERE 
				[Adresse électronique] IS NOT NULL;
		
			-- ---------
			/* ===================================================================================================
			Requete 7

			Les employés nés en été
			***********************
			Demande du client : 
			Nous voulons envoyer un cadeau aux employés nés en été (juin, juillet, août). 
			Donnez-moi leur nom et leur date de naissance.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[Nom], 
				[Prénom], 
				[Date de naissance]
			FROM [Employés]
			WHERE 
				MONTH([Date de naissance]) IN (6, 7, 8);

		
			-- ---------
			/* ===================================================================================================
			Requete 8

			Retards de livraison importants
			*******************************
			Demande du client : 
			Listez-moi les commandes qui ont mis plus de 10 jours entre la passation et l'expédition. 
			e veux voir l'ID de la commande et le nombre de jours écoulés.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[ID commande],
				DATEDIFF(DAY, [Date de commande], [Date d'expédition]) AS JoursEcoulés
			FROM [Commandes]
			WHERE 
				[Date d'expédition] IS NOT NULL   -- Sécurité pour éviter les erreurs
				AND DATEDIFF(DAY, [Date de commande], [Date d'expédition]) > 10;
		
			-- ---------
			/* ===================================================================================================
			Requete 9

			Les employés seniors bien payés
			*******************************
			Demande du client : "Je cherche à identifier les employés expérimentés pour un projet spécial. 
			Je veux la liste des employés nés avant 1970, qui ont été embauchés avant l'an 2000, et dont le salaire actuel dépasse 4000$.

			====================================================================================================*/
			--- Votre code ici
			SELECT 
				[Nom], 
				[Prénom], 
				[Date de naissance], 
				[Salaire]
			FROM [Employés]
			WHERE [Date de naissance] < '1970-01-01'
			AND [Date d'embauche] < '2000-01-01'
			AND [Salaire] > 4000;

		
			-- ---------
			/* ===================================================================================================
			Requete 10

			Clients VIP internationaux
			**************************
			Demande du client : "Je veux contacter nos meilleurs clients à l'étranger pour une offre exclusive. 
			Donnez-moi la liste des clients qui ne sont pas au 'USA', qui ont réalisé plus de 50000$ de ventes l'année dernière, et dont nous avons l'adresse électronique."
			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[Nom du client], 
				[Pays], 
				[Ventes de l'année dernière], 
				[Adresse électronique]
			FROM [Clients]
			WHERE [Pays] <> 'Etats-unis d''amérique'
			AND [Ventes de l'année dernière] > 50000
			AND [Adresse électronique] IS NOT NULL;

		
			-- ---------
			/* ===================================================================================================
			Requete 11

			Nombre de fournisseurs par pays
			*******************************
			Demande du client : 
			Dans combien de pays différents travaillons-nous ? 
			Et combien de fournisseurs avons-nous dans chaque pays ?

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[Pays], 
				COUNT(*) AS NombreFournisseurs
			FROM [Fournisseurs]
			GROUP BY 
				[Pays]
			ORDER BY 
				COUNT(*) /*NombreFournisseurs*/ DESC;
		
			-- ---------
			/* ===================================================================================================
			Requete 12

			Villes les plus actives
			***********************
			Demande du client : 
			Quelles sont les 10 villes où nous avons le plus de clients ? 
			Comptez le nombre de clients par ville.

			====================================================================================================*/
			-- Votre code ici
			SELECT TOP 10
				[Ville], 
				COUNT([ID client]) AS NbClients
			FROM [Clients]
			GROUP 
				BY [Ville]
			ORDER BY 
				COUNT([ID client]) DESC;
		
			-- ---------
			/* ===================================================================================================
			Requete 13

			Les meilleures ventes de l'année dernière
			********************************************
			Demande du client : 
			Je veux une liste des 5 clients qui ont généré le plus de ventes l'année dernière. 
			Affichez leur nom et le montant, du plus grand au plus petit.

			====================================================================================================*/
			-- Votre code ici
			SELECT TOP 5 
				c.[Nom du client], 
				SUM(c.[Ventes de l'année dernière]) AS TotalVentes
			FROM 
				[Clients] c
			GROUP BY 
				c.[Nom du client]
			ORDER BY 
				TotalVentes DESC;
		
			-- ---------
			/* ===================================================================================================
			Requete 14

			Les 5 meilleurs clients (Chiffre d'affaires)
			********************************************
			ATTENTION : Demande différente de la précédente
			Demande du client : 
			Je veux connaître les 5 clients qui ont passé les commandes les plus coûteuses au total. 
			Affichez leur nom et la somme des montants de leurs commandes, du plus grand au plus petit.

			====================================================================================================*/
			-- Votre code ici
			SELECT TOP 5 
				c.[Nom du client], 
				SUM(co.[Montant commande]) AS TotalAchats
			FROM [Clients] c
				INNER JOIN [Commandes] co ON c.[ID client] = co.[ID client]
			GROUP BY 
				c.[Nom du client]
			ORDER BY 
				TotalAchats DESC;
			--VerII
			SELECT TOP 5 
				c.[Nom du client], 
				SUM(co.[Montant commande]) AS TotalAchats
			FROM [Clients] c,
				[Commandes] co 
			WHERE 
				c.[ID client] = co.[ID client]
			GROUP BY 
				c.[Nom du client]
			ORDER BY 
				TotalAchats DESC;
		
	
			-- ---------
			/* ===================================================================================================
			Requete 15

			La plus grosse commande par client
			**********************************
			Demande du client : 
			Pour chaque client, quelle est le montant de sa plus grosse commande unique ?

			====================================================================================================*/
			-- Votre code ici
			-- Version I
			SELECT 
				cl.[Nom du client],
				MAX(c.[Montant commande]) AS PlusGrosseCommande
			FROM [Clients] cl
				JOIN [Commandes] c ON cl.[ID client] = c.[ID client]
			GROUP BY cl.[Nom du client];

			-- Version II
			SELECT 
				cl.[Nom du client],
				MAX(c.[Montant commande]) AS PlusGrosseCommande
			FROM [Clients] cl,
				[Commandes] c 
			WHERE cl.[ID client] = c.[ID client]
			GROUP BY cl.[Nom du client];
		
			-- ---------
			/* ===================================================================================================
			Requete 16

			Ancienneté de la derniere commande par client
			*********************************************
			Demande du client : 
			Pour chaque client, combien de jours se sont écoulés depuis leur dernière commande jusqu'à aujourd'hui ?

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				cl.[Nom du client],
				DATEDIFF(DAY, MAX(c.[Date de commande]), GETDATE()) AS JoursDerniereCommande
			FROM [Clients] cl
				JOIN [Commandes] c ON cl.[ID client] = c.[ID client]
			GROUP BY 
				cl.[Nom du client];


			SELECT 
				cl.[Nom du client],
				DATEDIFF(DAY, MAX(c.[Date de commande]), GETDATE()) AS JoursDerniereCommande
			FROM [Clients] cl,
				[Commandes] c 
			WHERE 
				cl.[ID client] = c.[ID client]
			GROUP BY 
				cl.[Nom du client];
		
			-- ---------
			/* ===================================================================================================
			Requete 17

			Ventes par employé et par année
			Demande du client : "Je veux voir l'évolution de mes vendeurs. 
			Donnez-moi le total des ventes réalisées par chaque employé, regroupé par année de commande."

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				CONCAT(e.[Nom], ', ', e.[Prénom]) NomComplet, 
				YEAR(co.[Date de commande]) AS Année, 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e
				JOIN [Commandes] co ON e.[ID employé] = co.[ID employé]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
			GROUP BY 
				CONCAT(e.[Nom], ', ', e.[Prénom]), YEAR(co.[Date de commande])
			ORDER BY CONCAT(e.[Nom], ', ', e.[Prénom]), YEAR(co.[Date de commande]);


			-- Version iI
			SELECT 
				YEAR(co.[Date de commande]) AS Année,
				CONCAT(e.[Nom], ', ', e.[Prénom]) NomComplet,      
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e,
				[Commandes] co,
				[Détails des commandes] dc
			WHERE
				co.[ID commande] = dc.[ID commande] AND
				e.[ID employé] = co.[ID employé]
			GROUP BY 
				YEAR(co.[Date de commande]), CONCAT(e.[Nom], ', ', e.[Prénom])
			ORDER BY YEAR(co.[Date de commande]), CONCAT(e.[Nom], ', ', e.[Prénom]);
		
			-- ---------
			/* ===================================================================================================
			Requete 18

			Nombre de produits par fournisseur et par type
			Demande du client : "Je veux analyser notre catalogue. Combien avons-nous de produits référencés pour chaque combinaison Fournisseur et Type de produit ?"

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				f.[Nom du fournisseur], 
				tp.[Nom du type de produit], 
				COUNT(p.[ID produit]) AS NombreProduits
			FROM [Fournisseurs] f
				JOIN [Produits] p ON f.[ID fournisseur] = p.[ID fournisseur]
				JOIN [Types de produit] tp ON p.[ID type de produit] = tp.[ID type de produit]
			GROUP BY 
				f.[Nom du fournisseur], tp.[Nom du type de produit];

		
			-- ---------
			/* ===================================================================================================
			Requete 19

			Chiffre d'affaires par type de produit
			**************************************
			Demande du client : 
			Quel est le montant total des ventes pour chaque type de produits ? 
			Je veux voir le nom du type de produit et le total.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				tp.[Nom du type de produit],
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS ChiffreAffaires
			FROM [Types de produit] tp
				JOIN [Produits] p ON tp.[ID type de produit] = p.[ID type de produit]
				JOIN [Détails des commandes] dc ON p.[ID produit] = dc.[ID produit]
			GROUP BY 
				tp.[Nom du type de produit];

		
	
			-- ---------
			/* ===================================================================================================
			Requete 20

			Quantité totale achetée par fournisseur
			***************************************
			Demande du client : 
			Quel fournisseur nous a fourni le plus grand nombre d'unités de produits au total (somme des quantités dans les détails de commandes) ?

			====================================================================================================*/
			-- Votre code ici
			SELECT TOP 1
				f.[Nom du fournisseur],
				SUM(dc.[Quantité]) AS TotalUnités
			FROM [Fournisseurs] f
				JOIN [Produits] p ON f.[ID fournisseur] = p.[ID fournisseur]
				JOIN [Détails des commandes] dc ON p.[ID produit] = dc.[ID produit]
			GROUP BY 
				f.[Nom du fournisseur]
			ORDER BY 
				TotalUnités DESC;

		
			-- ---------
			/* ===================================================================================================
			Requete 21

			Salaires moyens par poste (avec filtre)
			***************************************
			Demande du client : 
			Quels sont les postes pour lesquels le salaire moyen dépasse 5000$ ? 
			Affichez le poste et le salaire moyen.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				[Poste occupé], 
				AVG([Salaire]) AS SalaireMoyen
			FROM [Employés]
			GROUP BY	
				[Poste occupé]
			HAVING 
				AVG([Salaire]) > 5000;
		
			-- ---------
			/* ===================================================================================================
			Requete 22

			Employés très actifs et performants
			***********************************
			Demande du client : 
			Je veux récompenser les meilleurs. 
			Affichez les employés qui ont traité plus de 10 commandes AU TOTAL, et dont le montant total des ventes dépasse 20000$.

			====================================================================================================*/
			-- Votre code ici
			-- Version I
			SELECT 
				CONCAT(e.[Nom], ', ', e.[Prénom]), 
				COUNT(co.[ID commande]) AS NbCommandes, 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e
				JOIN [Commandes] co ON e.[ID employé] = co.[ID employé]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
			GROUP BY 
				CONCAT(e.[Nom], ', ', e.[Prénom])
			HAVING 
				COUNT(co.[ID commande]) > 10 AND 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) > 20000;

			-- Version II
			SELECT 
				CONCAT(e.[Nom], ', ', e.[Prénom]), 
				COUNT(co.[ID commande]) AS NbCommandes, 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e,
				[Commandes] co, 
				[Détails des commandes] dc
			WHERE
				e.[ID employé] = co.[ID employé] AND
				co.[ID commande] = dc.[ID commande]
			GROUP BY 
				CONCAT(e.[Nom], ', ', e.[Prénom])
			HAVING 
				COUNT(co.[ID commande]) > 600 AND 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) > 20000;
		
			-- ---------
			/* ===================================================================================================
			Requete 23

			Catégories de produits "Haut de Gamme"
			**************************************
			Demande du client : 
			Je veux identifier les catégories de produits qui sont considérées comme 'haut de gamme'. 
			Pour moi, une catégorie est haut de gamme si le prix moyen conseillé de ses produits dépasse 50$. 
			Donnez-moi le nom de la catégorie, le nombre de produits qu'elle contient et son prix moyen, triés du plus cher au moins cher.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				tp.[Nom du type de produit],
				COUNT(p.[ID produit]) AS NombreProduits,
				AVG(p.[Prix conseillé]) AS PrixMoyen
			FROM [Types de produit] tp
				JOIN [Produits] p ON tp.[ID type de produit] = p.[ID type de produit]
			GROUP BY 
				tp.[Nom du type de produit]
			HAVING 
				AVG(p.[Prix conseillé]) > 50
			ORDER BY 
				PrixMoyen DESC;

			-- Version II

			SELECT 
				tp.[Nom du type de produit],
				COUNT(p.[ID produit]) AS NombreProduits,
				AVG(p.[Prix conseillé]) AS PrixMoyen
			FROM [Types de produit] tp,
				[Produits] p
			WHERE 
				tp.[ID type de produit] = p.[ID type de produit]
			GROUP BY 
				tp.[Nom du type de produit]
			HAVING 
				AVG(p.[Prix conseillé]) > 50
			ORDER BY 
				PrixMoyen DESC;
		
			-- ---------
			/* ===================================================================================================
			Requete 24

			Rapport de performance global (Requête Complexe)
			*****************************
			Demande du client : 
			Je veux les 5 meilleurs employés en termes de ventes totales. 
			Affichez leur nom, le total vendu, et seulement s'ils ont vendu pour plus de 10000$. Triez du meilleur au moins bon.

			====================================================================================================*/
			-- Votre code ici
			SELECT TOP 5
				CONCAT(e.[Nom], ', ', e.[Prénom]),
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e
				JOIN [Commandes] c ON e.[ID employé] = c.[ID employé]
				JOIN [Détails des commandes] dc ON c.[ID commande] = dc.[ID commande]
			GROUP BY 
				CONCAT(e.[Nom], ', ', e.[Prénom])
			HAVING 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) > 10000
			ORDER BY 
				TotalVentes DESC;

		
			-- ---------
			/* ===================================================================================================
			Requete 25

			Types de produits rentables et variés
			*************************************
			Demande du client : 
			Je veux me concentrer sur les gammes de produits intéressantes. 
			Affichez les types de produits où le prix moyen conseillé est supérieur à 50$ ET où nous proposons plus de 3 produits différents dans cette catégorie.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				tp.[Nom du type de produit], 
				AVG(p.[Prix conseillé]) AS PrixMoyen, 
				COUNT(p.[ID produit]) AS NbProduits
			FROM [Types de produit] tp
				JOIN [Produits] p ON tp.[ID type de produit] = p.[ID type de produit]
			GROUP BY 
				tp.[Nom du type de produit]
			HAVING 
				AVG(p.[Prix conseillé]) > 50 AND 
				COUNT(p.[ID produit]) > 3;


			SELECT 
				tp.[Nom du type de produit], 
				AVG(p.[Prix conseillé]) AS PrixMoyen, 
				COUNT(p.[ID produit]) AS NbProduits
			FROM [Types de produit] tp,
				[Produits] p 
			WHERE 
				tp.[ID type de produit] = p.[ID type de produit]
			GROUP BY 
				tp.[Nom du type de produit]
			HAVING 
				AVG(p.[Prix conseillé]) > 50 AND 
				COUNT(p.[ID produit]) > 3;
		
			-- ---------
			/* ===================================================================================================
			Requete 26

			Qui a acheté quoi ? 
			*******************
			Demande du client : "J'ai besoin d'un rapport détaillé. Pour chaque commande, je veux savoir le nom du client, le nom du produit acheté, et la quantité commandée."
			Indice :  chaine/séquence d'une commande : Client -> Commande -> Détail -> Produit

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				c.[Nom du client], 
				p.[Nom du produit], 
				dc.[Quantité]
			FROM [Clients] c
				JOIN [Commandes] co ON c.[ID client] = co.[ID client]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
				JOIN [Produits] p ON dc.[ID produit] = p.[ID produit];

			SELECT 
				c.[Nom du client], 
				p.[Nom du produit], 
				dc.[Quantité]
			FROM [Clients] c,
				[Commandes] co, 
				[Détails des commandes] dc, 
				[Produits] p 
			WHERE
				c.[ID client] = co.[ID client] AND
				co.[ID commande] = dc.[ID commande] AND 
				dc.[ID produit] = p.[ID produit];
		
			-- ---------
			/* ===================================================================================================
			Requete 27

			Performance des employés par produit
			************************************
			Demande du client : "Je veux évaluer mes vendeurs. Affichez le nom de l'employé, le nom du produit qu'il a vendu, et le prix unitaire pratiqué lors de la vente."

			====================================================================================================*/
			-- Votre code ici
			-- Version I
			SELECT 
				e.[Nom], 
				e.[Prénom], 
				p.[Nom du produit], 
				dc.[Prix unitaire]
			FROM [Employés] e
				JOIN [Commandes] co ON e.[ID employé] = co.[ID employé]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
				JOIN [Produits] p ON dc.[ID produit] = p.[ID produit];


			-- Version II
			SELECT 
				e.[Nom], 
				e.[Prénom], 
				p.[Nom du produit], 
				dc.[Prix unitaire]
			FROM [Employés] e,
				[Commandes] co, 
				[Détails des commandes] dc, 
				[Produits] p
			WHERE 
				e.[ID employé] = co.[ID employé] AND
				co.[ID commande] = dc.[ID commande] AND
				dc.[ID produit] = p.[ID produit];
		
			-- ---------
			/* ===================================================================================================
			Requete 28

			Traçabilité complète (Client -> Produit -> Fournisseur)
			********************
			Demande du client : 
			En cas de rappel produit, je dois pouvoir contacter le client. 
			Donnez-moi le nom du client, le nom du produit acheté, et le nom du fournisseur de ce produit.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				c.[Nom du client], 
				p.[Nom du produit], 
				f.[Nom du fournisseur]
			FROM [Clients] c
				JOIN [Commandes] co ON c.[ID client] = co.[ID client]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
				JOIN [Produits] p ON dc.[ID produit] = p.[ID produit]
				JOIN [Fournisseurs] f ON p.[ID fournisseur] = f.[ID fournisseur];

			-- Version II
			SELECT DISTINCT
				c.[Nom du client], 
				p.[Nom du produit], 
				f.[Nom du fournisseur]
			FROM [Clients] c,
				[Commandes] co,
				[Détails des commandes] dc,
				[Produits] p,  
				[Fournisseurs] f
			WHERE
				c.[ID client] = co.[ID client] AND
				co.[ID commande] = dc.[ID commande] AND 
				dc.[ID produit] = p.[ID produit] AND 
				p.[ID fournisseur] = f.[ID fournisseur]
			ORDER BY 
				c.[Nom du client];
		
			-- ---------
			/* ===================================================================================================
			Requete 29

			Demande du client : 
			Affichez le nom du client, la date de commande, le nom du produit, et le nom du type de produit.
			Indice : (5 tables : Clients, Commandes, Employés, Détails commandes, Produits, Types de produit).

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				c.[Nom du client], 
				co.[Date de commande], 
				p.[Nom du produit], 
				tp.[Nom du type de produit]
			FROM [Clients] c
				JOIN [Commandes] co ON c.[ID client] = co.[ID client]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
				JOIN [Produits] p ON dc.[ID produit] = p.[ID produit]
				JOIN [Types de produit] tp ON p.[ID type de produit] = tp.[ID type de produit];
		
			-- ---------
			/* ===================================================================================================
			Requete 30

			Performance Vendeur par Catégorie
			*********************************
			Demande du client : 
			Je veux savoir quel employé vend le mieux dans quelle catégorie. 
			Affichez le nom complet de l'employé, le nom du type de produit, et le total vendu.

			====================================================================================================*/
			-- Votre code ici
			SELECT 
				CONCAT(e.[Nom], ' ',  e.[Prénom]),
				tp.[Nom du type de produit], 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e
				JOIN [Commandes] co ON e.[ID employé] = co.[ID employé]
				JOIN [Détails des commandes] dc ON co.[ID commande] = dc.[ID commande]
				JOIN [Produits] p ON dc.[ID produit] = p.[ID produit]
				JOIN [Types de produit] tp ON p.[ID type de produit] = tp.[ID type de produit]
			GROUP BY CONCAT(e.[Nom], ' ',  e.[Prénom]), tp.[Nom du type de produit];

			-- Version WHERE
			SELECT 
				CONCAT(e.[Nom], ' ',  e.[Prénom]),
				tp.[Nom du type de produit], 
				SUM(dc.[Prix unitaire] * dc.[Quantité]) AS TotalVentes
			FROM [Employés] e,
				[Commandes] co, 
				[Détails des commandes] dc, 
				[Produits] p, 
				[Types de produit] tp 
			WHERE
				e.[ID employé] = co.[ID employé] AND
				co.[ID commande] = dc.[ID commande] AND
				dc.[ID produit] = p.[ID produit] AND
				p.[ID type de produit] = tp.[ID type de produit]
			GROUP BY 
				CONCAT(e.[Nom], ' ',  e.[Prénom]), 
				tp.[Nom du type de produit];
		
			--(Difficile)
			/*====================================================================================================
			Produits jamais commandés ********* ==> LEFT JOIN ou SUB SELECT

			Demande du client : 
			Y a-t-il des produits dans notre catalogue qui n'ont jamais été vendus ? Je veux leur nom.
			====================================================================================================*/
			-- Votre code ici
			SELECT 
				p.[Nom du produit]
			FROM [Produits] p
				LEFT JOIN [Détails des commandes] dc ON p.[ID produit] = dc.[ID produit]
			WHERE dc.[ID commande] IS NULL;
		

W3schools

Python.org