Retour à la liste des articles Articles
18 minutes de lecture

15 exercices pratiques SQL Server avec solutions

Améliorez votre maîtrise de SQL Server avec nos exercices d'entraînement SQL Server. Chacune de ces 15 tâches T-SQL pratiques comprend une solution détaillée pour vous aider à améliorer vos compétences en matière d'interrogation.

Vous savez que tout le monde dit : "C'est en forgeant qu'on devient forgeron" ? C'est tout à fait vrai pour SQL. Le véritable apprentissage a lieu lorsque vous commencez à travailler avec des requêtes, des tables et des données. Si vous souhaitez améliorer vos compétences en MS SQL Server, vous êtes au bon endroit. Ces 15 exercices T-SQL pour débutants sont parfaits pour acquérir les bases. (Si vous vous posez la question, T-SQL est le dialecte SQL utilisé dans les bases de données SQL Server).

Les exercices sont tirés de notre cours interactif Exercices Pratiques de SQL in MS SQL Server. Il s'agit d'un cours de pratique T-SQL destiné aux débutants travaillant avec SQL Server. Il propose plus de 80 exercices pratiques, regroupés en sections sur les requêtes de table unique, les fonctions d'agrégation, le regroupement et l'ordonnancement des résultats, JOINS, et les sous-requêtes, entre autres. Si les exercices de cet article vous plaisent, je vous recommande d'essayer le cours!

Si vous êtes un débutant et que vous voulez apprendre tout ce que T-SQL a à offrir, consultez notre piste d'apprentissage complète Le SQL de A à Z in MS SQL Server. Ce parcours contient 7 cours T-SQL interactifs qui vous apprendront tout ce que T-SQL moderne peut offrir pour l'analyse de données.

Section 1 : Chats - Exercices SQL parfaits pour aiguiser vos griffes

Dans la première section, nous travaillerons sur la table Cat. Cette table a les colonnes suivantes :

  • Id - L'ID d'un chat donné.
  • Name - Le nom du chat.
  • Breed - La race du chat (par exemple Siamois, Cornish Rex).
  • Coloration - La coloration du chat (par exemple, écaille de tortue, noir).
  • Age - L'âge du chat.
  • Sex - Le sexe du chat.
  • FavToy - Le jouet préféré du chat.

Exercice 1 : tableau de connaissance du chat

Exercice : Sélectionnez toutes les données du Cat tableau.

Solution :

SELECT * 
FROM Cat;

Solution : Nous utilisons l'instruction SELECT pour sélectionner des données dans la base de données. L'astérisque (*) qui suit SELECT signifie que vous voulez toutes les colonnes de la table. La commande FROM Cat indique la table à partir de laquelle les lignes sont extraites.

Exercice 2 : chatons

Exercice : Sélectionnez les adresses Name, Breed, et Coloration pour chaque chat âgé de moins de cinq ans.

Solution :

SELECT 
  Name, 
  Breed, 
  Coloration 
FROM Cat 
WHERE Age < 5;

Explication : Comme précédemment, nous utilisons l'instruction SELECT. Cette fois, nous listons les colonnes que nous voulons sélectionner : Name, Breed, et Coloration. Dans la clause FROM, nous donnons le nom de la table (Cats).

Dans la clause WHERE, nous spécifions la condition pour ne sélectionner que les chats de moins de 5 ans : Age < 5. Nous utilisons l'opérateur < pour comparer la valeur de la colonne Age au nombre 5. La base de données ne sélectionnera que les chats qui ont moins de 5 ans (c'est-à-dire dont l'âge est inférieur à 5).

Exercice 3 : chats Ragdoll jeunes et vieux

Exercice : Sélectionner l'identifiant et le nom de chaque chat de race Ragdoll âgé de moins de 5 ans ou de plus de 10 ans.

Solution :

SELECT Id, Name 
FROM Cat
WHERE (Age < 5 OR Age > 10)
AND Breed = 'Ragdoll';

Explication : Cette requête est similaire à la précédente. La seule différence réside dans la clause WHERE.

Nous recherchons des chats qui ont moins de 5 ans ou plus de 10 ans. À cette fin, nous utilisons la condition (Age < 5 OR Age > 10). Nous utilisons les opérateurs de comparaison < et >, et nous les combinons avec l'opérateur logique OR. Cela permet de sélectionner les chats qui ont soit moins de 5 ans, soit plus de 10 ans.

Nous utilisons ensuite la condition Breed = 'Ragdoll' pour ne sélectionner que les chats Ragdoll. Il est important de noter que la valeur texte Ragdoll est placée entre guillemets simples : 'Ragdoll'.

Enfin, nous utilisons l'opérateur AND pour combiner les conditions d'âge et de race.

Exercice 4 : Quels chats aiment jouer avec des balles ?

Exercice : Sélectionner toutes les données pour les chats dont :

  • La race commence par un "R".
  • La coloration se termine par un "m".
  • Le jouet préféré commence par le mot "balle".

Solution :

SELECT *
FROM Cat
WHERE Breed LIKE 'R%'
  AND Coloration LIKE '%m'
  AND FavToy LIKE 'ball%'

Explication : Nous utilisons une simple requête SELECT pour résoudre l'exercice. Dans SELECT, nous plaçons l'astérisque * pour sélectionner toutes les colonnes du tableau.

Nous utilisons ensuite AND pour combiner trois conditions WHERE. La première condition sélectionne les chats dont le nom de race commence par R. Nous utilisons l'opérateur LIKE et le caractère générique %: Breed LIKE 'R%'. Cette condition signifie que nous recherchons les races commençant par R, suivies d'un texte quelconque (vide ou non).

Dans la deuxième condition, nous utilisons Coloration LIKE '%m' pour trouver les chats dont la coloration se termine par "m". Dans la troisième condition, nous utilisons FavToy LIKE 'ball%' pour rechercher les jouets préférés qui commencent par "ball".

Si vous recherchez d'autres exercices SQL de base, consultez notre article 10 exercices de débutant La pratique du SQL avec solutions.

Section 2 : Jeux - Améliorez vos compétences SQL avec des données de jeux vidéo

Nous allons maintenant nous éloigner des chats et nous concentrer sur quelque chose de complètement différent : les jeux vidéo. Nous allons travailler avec la table Games qui se compose de 9 colonnes :

  • Id - L'ID d'un jeu donné.
  • Title - Le titre du jeu (par exemple Mario Kart).
  • Company - La société qui a produit le jeu.
  • Type - Le genre (par exemple, course).
  • ProductionYear - L'année de création du jeu.
  • System - La console pour laquelle le jeu est sorti (par exemple, Nintendo).
  • ProductionCost - Le coût de production du jeu.
  • Revenue - Les revenus générés par ce jeu.
  • Rating - L'évaluation du jeu (par les utilisateurs).

Dans cette section, nous nous concentrerons sur l'utilisation des fonctions GROUP BY et aggregate.

Exercice 5 : coûts de production moyens pour les bons jeux

Exercice : Indiquez le coût de production moyen des jeux produits entre 2010 et 2015 et dont la note est supérieure à 7.

Solution :

SELECT 
  AVG(ProductionCost)
FROM Games
WHERE ProductionYear BETWEEN 2010 AND 2015
  AND Rating > 7;

Explication : Dans l'énoncé SELECT, nous utilisons la fonction agrégée AVG() pour calculer le coût de production moyen. Nous donnons ProductionCost comme argument ; l'expression complète est AVG(ProductionCost).

Dans la clause WHERE, nous filtrons les jeux bien notés (Rating > 7) et produits entre 2010 et 2015 (ProductionYear BETWEEN 2010 AND 2015).

Exercice 6 : Statistiques de production de jeux par année

Exercice : Pour tous les jeux, affichez le nombre de jeux sortis chaque année (sous la forme du nombre column), le coût moyen de production (dans la colonne AvgCost ) et leur revenu moyen (dans la colonne AvgRevenue ).

Solution :

SELECT
  ProductionYear,
  COUNT(*) AS count,
  AVG(ProductionCost) AS AvgCost,
  AVG(Revenue) AS AvgRevenue
FROM Games
GROUP BY ProductionYear;

Explication : Vous êtes habitué à la syntaxe de base de SELECT, nous n'y reviendrons donc pas. Dans cette requête, nous utilisons GROUP BY pour organiser les lignes en groupes sur la base d'une valeur donnée. Cela nous permet de trouver des statistiques pour chaque groupe.

Dans SELECT, nous listons ProductionYear et les expressions suivantes :

  • COUNT(*) pour compter les lignes dans chaque groupe.
  • AVG(ProductionCost) pour calculer le coût de production moyen dans chaque groupe.
  • AVG(Revenue) pour calculer le revenu moyen de chaque groupe.

Après FROM, nous ajoutons GROUP BY. Comme nous voulons calculer les statistiques pour chaque année de production, nous utilisons GROUP BY ProductionYear.

Exercice 7 : Statistiques de production des entreprises

Exercice : Pour chaque entreprise, sélectionnez son nom, le nombre de jeux qu'elle a produits (dans la colonne NumberOfGames ), le coût moyen de production (dans la colonne AvgCost ). Note : N'indiquez que les entreprises qui ont produit plus d'un jeu.

Solution :

SELECT Company,
  COUNT(*) AS NumberOfGames,
  AVG(ProductionCost) AS AvgCost
FROM Games
GROUP BY Company
HAVING COUNT(Company) > 1; 

Explication : Dans cette requête, nous sélectionnons des données dans la table Games table. Nous sélectionnons Company, COUNT(*) pour compter les lignes pour cette société, et AVG(ProductionCost) pour calculer le coût de production moyen de tous les jeux produits par cette société.

Nous utilisons ensuite GROUP BY Company pour regrouper les jeux produits par chaque société. Enfin, nous utilisons la clause HAVING pour limiter les résultats aux entreprises qui ont produit plus d'un jeu.

Exercice 8 : Identifier les bons jeux

Exercice : Nous nous intéressons aux bons jeux produits entre 2000 et 2009. Un bon jeu est un jeu dont la note est supérieure à 6 et qui a été rentable (qui a rapporté plus que ses coûts de production).

Pour chaque entreprise, indiquez le nom de l'entreprise, son revenu total provenant des bons jeux produits entre 2000 et 2009 (colonne RevenueSum ) et le nombre de bons jeux qu'elle a produits au cours de cette période (colonne NumberOfGames ). N'indiquez que les entreprises dont les recettes provenant des bons jeux sont supérieures à 4 000 000.

Solution :

SELECT
  Company,
  COUNT(*) AS NumberOfGames,
  SUM(Revenue) AS RevenueSum
FROM Games
WHERE ProductionYear BETWEEN 2000 AND 2009
  AND Rating > 6
  AND Revenue - ProductionCost > 0
GROUP BY Company
HAVING SUM(Revenue) > 4000000;

Explication : Dans SELECT, nous énumérons Company pour obtenir le nom de la société, COUNT(*) pour compter le nombre de jeux produits par cette société, et SUM(Revenue) pour calculer le revenu total de la société.

Dans WHERE, nous appliquons les filtres au niveau des lignes mentionnés dans l'exercice :

  • ProductionYear BETWEEN 2000 AND 2009 pour trouver les jeux produits entre 2000 et 2009.
  • Rating > 6 pour trouver les jeux dont la note est supérieure à 6.
  • Revenue - ProductionCost > 0 pour trouver les jeux dont les revenus sont supérieurs aux coûts de production.

Nous regroupons les lignes à l'aide de GROUP BY Company. Enfin, nous utilisons HAVING pour trouver les entreprises dont le revenu total est supérieur à 4000000.

Exercice 9 : Bénéfice brut par entreprise

Exercice : Pour toutes les entreprises présentes dans le tableau, indiquez leur nom et la somme des bénéfices bruts pour toutes les années. Pour simplifier ce problème, supposez que la marge brute est de Revenue - ProductionCost; affichez cette colonne sous la forme GrossProfitSum.

Assurez-vous que les résultats commencent par l'entreprise qui a réalisé la marge brute la plus élevée.

Solution :

SELECT
  Company,
  SUM(Revenue - ProductionCost) AS GrossProfitSum
FROM Games
GROUP BY Company
ORDER BY SUM(Revenue - ProductionCost) DESC;

Explication : Dans l'instruction SELECT, nous listons les valeurs Company et SUM(Revenue - ProductionCost). L'expression Revenue - ProductionCost calcule la marge brute pour chaque jeu et SUM(Revenue - ProductionCost) additionne cette marge pour plusieurs jeux.

Nous regroupons ensuite les données par société (GROUP BY Company), puis nous classons les résultats par ordre décroissant de la marge brute totale. Enfin, nous classons les résultats par bénéfice brut ; nous spécifions l'ordre décroissant (10-1 au lieu de 1-10) afin que le bénéfice le plus élevé soit classé en premier.

Vous trouverez d'autres exercices spécifiques à GROUP BY dans 10 GROUP BY La pratique du SQL Exercices avec solutions

Section 3 : L'art de la jointure

Dans cette section, nous nous concentrerons sur les JOIN. Nous travaillerons avec une base de données contenant des données sur les œuvres d'art. La base de données comporte trois tables.

La table Artist comporte les colonnes suivantes

  • Id - L'ID d'un artiste donné.
  • Name - Le nom de l'artiste.
  • BirthYear - L'année de naissance de l'artiste.
  • DeathYear - L'année de décès de l'artiste.
  • ArtisticField - Le domaine de prédilection de l'artiste (par exemple, peinture, sculpture).

Le tableau PieceOfArt comporte les colonnes suivantes :

  • Id - L'identifiant d'une œuvre d'art donnée.
  • Name - Le nom de l'œuvre.
  • ArtistId - L'identifiant de l'artiste qui a créé l'œuvre.
  • MuseumId - L'identifiant du musée qui abrite l'œuvre.

La table Musée se compose des trois colonnes suivantes :

  • Id - L'ID d'un musée donné.
  • Name - Le nom du musée.
  • Country - Le pays où se trouve le musée.

Exercice 10 : Liste de toutes les œuvres d'art

Exercice : Indiquez les noms de toutes les œuvres d'art, ainsi que les noms de leurs créateurs et les noms des musées qui les abritent.

N'incluez pas les œuvres perdues (c'est-à-dire celles qui n'ont pas d'identifiant de musée) ni les œuvres dont l'artiste est inconnu. Nommez les colonnes PieceOfArtName, ArtistName, et MuseumName.

Solution :

SELECT
  A.Name AS ArtistName,
  M.Name AS MuseumName,
  Poa.Name AS PieceOfArtName
FROM Museum M
JOIN PieceOfArt Poa
  ON M.Id = Poa.MuseumId
JOIN Artist A
  ON A.Id = Poa.ArtistId;

Explication : Nous voulons dresser la liste de toutes les œuvres d'art pour lesquelles nous disposons d'informations complètes (artiste, musée). Cela signifie que nous devons utiliser INNER JOIN pour relier les tables.

Nous utilisons le mot-clé JOIN, qui est l'équivalent de INNER JOIN. Nous joignons d'abord les tables Museum et PieceOfArt sur l'ID du musée. Ensuite, nous joignons la table Artist sur l'ID de l'artiste.

Pour en savoir plus sur la jointure de plusieurs tables, consultez la rubrique Comment joindre 3 tables (ou plus) en SQL.

Exercice 11 : œuvres d'artistes du XIXe siècle (et plus)

Exercice : Trouvez des artistes qui ont vécu plus de 50 ans et qui sont nés après 1800. Indiquez leur nom et le nom des œuvres d'art qu'ils ont créées. Renommez ces colonnes ArtistName et PieceName, respectivement.

Solution :

SELECT
  A.Name AS ArtistName,
  Poa.Name AS PieceName
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
WHERE DeathYear - BirthYear > 50
  AND BirthYear > 1800;

Explication : Ici, nous joignons les tables Artist et PieceOfArt sur l'ID de l'artiste. Dans la clause WHERE, nous filtrons les artistes qui ont vécu plus de 50 ans. Pour ce faire, nous calculons l'âge de l'artiste à l'aide de l'expression DeathYear - BirthYear et nous le filtrons à l'aide de la comparaison DeathYear - BirthYear > 50.

Nous filtrons également les artistes du 19e siècle ou plus récents avec la condition BirthYear > 1800. Nous combinons les deux conditions avec l'opérateur AND.

Exercice 12 : Productivité des artistes

Exercice : Affichez les noms des artistes avec le nombre d'années pendant lesquelles ils ont vécu (nommez la colonne YearsLived) et le nombre d'œuvres qu'ils ont créées (nommez la colonne NumberOfCreated).

N'indiquez que les artistes qui ont créé au moins une œuvre d'art.

Solution :

SELECT
  A.Name,
  DeathYear - BirthYear AS YearsLived,
  COUNT(Poa.ArtistId) AS NumberOfCreated
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
GROUP BY A.Name, DeathYear - BirthYear;

Explication : Cette requête SQL sélectionne le nom de l'artiste, le nombre d'années pendant lesquelles il a vécu (DeathYear - BirthYear) et le nombre total d'œuvres qu'il a créées COUNT(Poa.ArtistId).

Les données sont jointes sur l'ID de l'artiste entre la table Artist et la table PieceOfArt table. Les résultats sont regroupés en fonction du nom de l'artiste et de sa durée de vie.

Deux choses sont importantes à noter ici. Premièrement, nous devons inclure l'expression DeathYear - BirthYear dans la clause GROUP BY, car cette expression n'est pas agrégée. Dans le cas contraire, la base de données pourrait générer une erreur. (Vous pouvez lire cette erreur dans Comment corriger une erreur 'Not a GROUP BY Expression' et Comment résoudre l'erreur "must appear in the GROUP BY clause").

Deuxièmement, puisque nous utilisons INNER JOIN, nous sommes déjà assurés d'obtenir les artistes qui ont créé au moins une œuvre d'art. Les artistes qui n'ont pas créé d'œuvres d'art seront omis par ce site JOIN.

Vous trouverez d'autres exercices de SQL JOIN dans SQL Joins : 12 questions pratiques avec des réponses détaillées.

Section 4 : Un chariot de données

Dans cette dernière section, nous allons travailler avec des données provenant de la base de données d'un magasin. Elle comporte cinq tables :

Categories stocke les noms des catégories de produits :

  • Id - L'ID d'une catégorie donnée
  • Name - Le nom de la catégorie.

Products stocke les informations sur les produits :

  • Id - L'ID d'un produit donné.
  • Name - Le nom du produit.
  • CategoryId - L'identifiant de la catégorie à laquelle le produit appartient.
  • Price - Le prix du produit.

Clients stocke les informations de base sur le client :

  • Id - L'identifiant d'un client donné.
  • FirstName - Le prénom du client.
  • LastName - Le nom de famille du client.

Orders enregistre des informations de base sur les commandes :

  • Id - L'ID d'une commande donnée.
  • ClientId - L'identifiant du client qui a passé la commande.
  • Year - L'année où la commande a été passée.

Enfin, la table OrderItems contient des données sur les articles qui composent chaque commande. Il s'agit d'un tableau associatif qui relie les données des tableaux Orders et Products . Elle se compose des colonnes suivantes :

  • OrderId - L'ID de la commande.
  • ProductId - L'ID du produit dans la commande ci-dessus.
  • Quantity - La quantité du produit dans cette commande.
  • Price - Le prix total du produit dans cette commande.

Exercice 13 : Recettes pour chaque commande

Exercice : Pour chaque commande, sélectionnez son ID (nommez la colonne OrderId), le nom et le prénom du client qui a passé cette commande, et le revenu total généré par cette commande (nommez la colonne Revenue).

Note : Le revenu de la commande est la somme des colonnes Price pour chaque article de la commande.

Solution :

SELECT
  O.Id AS OrderId,
  C.FirstName,
  C.LastName,
  SUM(Oi.Price) AS Revenue
FROM Orders AS O
JOIN OrderItems AS Oi
  ON O.Id = Oi.OrderId
JOIN Clients AS C
  ON O.ClientId = C.Id
GROUP BY O.Id, C.FirstName, C.LastName;

Explication : Dans cette requête, nous joignons les tables Orders, OrderItems, et Clients.

Dans SELECT, nous sélectionnons quatre expressions : l'ID de la commande, le nom et le prénom du client et la somme de tous les prix des articles de la commande. Dans GROUP BY, nous regroupons les données par ID de la commande et par nom et prénom du client. Nous obtenons ainsi le chiffre d'affaires total pour chaque commande contenant des informations (nom et prénom) sur le client.

Exercice 14 : Qui a racheté des produits ?

Exercice : Sélectionnez le prénom et le nom des clients qui ont racheté des produits (c'est-à-dire qui ont acheté le même produit lors de plusieurs commandes). Incluez les noms de ces produits et le numéro des commandes auxquelles ils ont participé (nommez la colonne OrderCount).

Solution :

SELECT
  Cli.FirstName,
  Cli.LastName,
  P.Name,
  COUNT(O.Id) AS OrderCount
FROM Clients cli
JOIN Orders O
  ON Cli.Id = O.ClientId
JOIN OrderItems Oi
  ON O.Id = Oi.OrderId
JOIN Products P
  ON P.Id = Oi.ProductId
GROUP BY Cli.FirstName, Cli.LastName, P.Name
HAVING COUNT(O.Id) > 1

Explication : Ici, nous joignons quatre tables : Clients, Orders, OrderItems, et Products.

Dans SELECT, nous sélectionnons le nom et le prénom du client, le nom du produit et le nombre de commandes dans lesquelles ce produit a été acheté par ce client. Nous regroupons la table par les données du client (nom et prénom) et par le nom du produit. Ainsi, les achats de ce produit par ce client sont regroupés.

Dans HAVING, nous filtrons les lignes où le nombre de commandes est supérieur à 1. Cela nous permet de sélectionner les clients qui ont acheté le même produit plus d'une fois.

Exercice 15 : Combien chaque client a-t-il dépensé par catégorie ?

Exercice : Sélectionnez le prénom et le nom de chaque client, le nom de la catégorie dans laquelle il a acheté (dans n'importe laquelle de ses commandes) et le montant total qu'il a dépensé pour cette catégorie de produits (nommez cette colonne TotalAmount).

Solution :

SELECT
  Cli.FirstName,
  Cli.LastName,
  C.Name,
  SUM(OI.Price) as TotalAmount
FROM Categories AS C
JOIN Products AS P
  ON C.Id = P.CategoryId
JOIN OrderItems AS OI
  ON P.Id = OI.ProductId
JOIN Orders AS O
  ON O.Id = OI.OrderId
JOIN Clients Cli
  ON Cli.Id = O.ClientId
GROUP BY Cli.FirstName, Cli.LastName, C.Name

Solution : Nous joignons les tables Categories, Products, OrderItems, Orders, et Clients. Nous sélectionnons le nom et le prénom du client, le nom de la catégorie et la somme des prix des articles commandés. Cela nous permet de calculer combien d'argent chaque client a dépensé dans chaque catégorie.

Nous regroupons les résultats en fonction du nom et du prénom du client et du nom de la catégorie. De cette manière, tous les articles d'achat de chaque client et de chaque catégorie sont regroupés.

Autres pratiques SQL Server

J'ai eu l'occasion d'explorer le monde varié des données avec T-SQL. Qu'il s'agisse de découvrir les secrets du comportement des chats, d'analyser des stratégies de jeu ou d'apprécier l'art à travers les chiffres, SQL a été mon outil de confiance. Il a changé ma façon d'aborder les questions et de découvrir les histoires cachées dans les données qui nous entourent.

Voulez-vous plus de pratique sur le serveur SQL ? Consultez ces ressources géniales :

Si vous êtes prêt à approfondir vos compétences, notre cours Exercices Pratiques de SQL in MS SQL Server est exactement ce qu'il vous faut. Il est conçu pour renforcer vos bases et améliorer votre capacité à analyser et interpréter les données de manière efficace. Avec chaque exercice, vous vous sentirez plus confiant et plus compétent pour aborder des requêtes complexes.

Pratique du serveur SQL

Pour ceux qui souhaitent explorer tous les aspects de SQL, notre formation complète Le SQL de A à Z in MS SQL Server couvre tous les aspects, des bases aux techniques avancées. Il s'agit d'un parcours d'apprentissage parfait pour tous ceux qui souhaitent maîtriser SQL Server et prendre des décisions éclairées sur la base de données. Que vous soyez débutant ou que vous souhaitiez rafraîchir vos connaissances, ces ressources vous aideront à réussir dans le monde des données.

N'attendez plus, commencez dès aujourd'hui à maîtriser SQL Server et exploitez tout le potentiel de vos données !