Retour à la liste des articles Articles
24 minutes de lecture

18 Questions pratiques SQL pour les débutants : Théorie et exercices pratiques

Que vous débutiez ou rafraîchissiez vos compétences en SQL, rejoignez-nous pour travailler sur ces 18 questions d'entraînement SQL pour débutants.

SQL, ou Structured Query Language, est un langage de programmation utilisé pour définir, récupérer et manipuler des données dans des bases de données relationnelles. Il fournit une syntaxe intuitive d'instructions SQL et de mots-clés qui permettent de créer, de modifier et d'interroger des bases de données relationnelles.

Cet article se concentre sur la révision et la pratique des bases du langage SQL. Nous commencerons par examiner l'instruction SELECT et ses composants obligatoires et facultatifs pour extraire des données d'une table unique. Ensuite, nous nous pencherons sur l'instruction JOINs, qui nous permet de fusionner les données de deux tables ou plus. Enfin, nous montrerons comment agréger et regrouper des données pour effectuer des analyses plus poussées. Ces exercices peuvent vous aider à réviser vos connaissances en SQL avant un entretien ou un test, ou simplement à rafraîchir et consolider vos compétences.

Cet article présente les exercices d'entraînement SQL de notre cours interactif Exercices Pratiques de SQL interactif. Le cours propose plus de 80 exercices pratiques qui couvrent différents sujets SQL : requêtes sur une seule table, jointures, agrégation et regroupement, sous-requêtes, et plus encore. Si vous souhaitez vous entraîner davantage par vous-même, nous vous encourageons à consulter notre La pratique du SQL piste.

Tous nos cours de pratique SQL proposent des exercices basés sur des ensembles de données réels, afin que vous puissiez pratiquer SQL dans des scénarios réalistes. Les cours sont regroupés en différents thèmes - par exemple, les requêtes sur une seule table, les jointures, l'agrégation et le regroupement, et les sous-requêtes - afin que vous puissiez choisir ce que vous voulez pratiquer.

Commençons par le commencement.

La pratique du SQL Pour les débutants

Les exercices d'entraînement SQL de cet article couvrent les bases de l'interrogation de données. Nous passerons en revue

  • Les requêtes sur une seule table - Interroger les données d'une seule table à l'aide de l'instruction SELECT.
  • JOINs - Joindre les données de plusieurs tables à l'aide de divers JOINs.
  • L'agrégation et le regroupement des données - Placer les données dans des groupes basés sur des colonnes définies et compiler des statistiques.

Requêtes sur une seule table

Nous commencerons par revoir les bases de l'interrogation des données d'une table unique et de l'imposition de conditions personnalisées sur les colonnes de données.

Question 1 : Éléments d'une requête SQL

Question :

Citez tous les éléments d'une requête SQL.

Réponse :

L'instruction SELECT comprend les éléments suivants :

  • SELECT column_name(s) - Définit les colonnes de données affichées dans la sortie.
  • FROM table_name - Définit la table de la base de données dans laquelle les données sont sélectionnées.
  • WHERE column_name = value - Filtre les données de sortie en fonction des conditions énoncées (facultatif).
  • GROUP BY column_name(s) - Si vous utilisez des fonctions d'agrégation, vous devez utiliser la clause GROUP BY.
  • HAVING - Filtre les données après leur traitement par GROUP BY (facultatif) ; vous pouvez l'utiliser pour imposer des conditions aux fonctions d'agrégation.
  • ORDER BY column_name [ASC | DESC] - Ordonne les données de sortie en fonction d'une colonne définie dans l'ordre croissant ou décroissant (facultatif).

Les clauses SELECT et FROM sont faciles à comprendre, car SELECT énumère les colonnes de données et FROM définit la table de données. Dans le cas de la clause WHERE, il existe plusieurs conditions que vous pouvez imposer aux colonnes, que nous examinerons dans la question suivante.

Pour en savoir plus sur les éléments de base d'une requête, consultez notre article Énumérer et expliquer tous les éléments de base d'une requête SQL.

À retenir :

Voici les éléments d'une requête SQL par ordre d'apparition : SELECT, FROM, WHERE, GROUP BY, ORDER BY, et HAVING.

Question 2 : Filtrage des données dans une requête SQL

Question :

Comment filtrer les données dans une requête SQL en utilisant des conditions personnalisées ?

Réponse :

Pour imposer des conditions personnalisées sur les colonnes de données, nous utilisons la clause WHERE. Par exemple, si vous voulez sélectionner les personnes âgées de plus de 18 ans, utilisez la clause WHERE comme suit :

SELECT name, age
FROM person
WHERE age > 18;

Les conditions de la clause WHERE impliquent généralement des comparaisons ou des opérations logiques et dépendent du type de données stockées dans la colonne.

  • Opérateurs de comparaison utilisés pour comparer des valeurs :
    • Types de données numériques : =, <> or !=, >, <, >=, <=
    • Types de données numériques : Types de données texte/chaîne : =, <> or !=, LIKE, IN, NOT LIKE, NOT IN
    • Types de données de date et d'heure : =, <> or !=, >, <, >=, <=, BETWEEN, NOT BETWEEN
    • Types de données booléennes : =, <> or !=
  • Opérateurs utilisés pour vérifier les valeurs NULL: IS NULL, IS NOT NULL
  • Opérateurs logiques utilisés pour combiner plusieurs conditions : AND, OR, NOT

Pour en savoir plus sur le filtrage des données, consultez nos articles Comment écrire une clause WHERE en SQL et Utiliser les opérateurs AND, OR et NOT en SQL.

À retenir :

La clause WHERE est utilisée pour filtrer les données en imposant des conditions sur les colonnes de données.

Données pour les questions 3 - 6

Dans les exercices 3 - 6, nous utiliserons la table cat table. Il comporte les colonnes suivantes :

  • id - L'identifiant d'un chat donné.
  • name - Le nom du chat.
  • breed - La race du chat (ex : siamois, british shorthair, etc.).
  • coloration - La coloration du chat (par exemple calicot, tabby, etc.).
  • age - L'âge du chat.
  • sex - Le sexe du chat.
  • fav_toy - Le jouet préféré du chat.

Question 3 : Sélectionner des chats d'un âge et d'une race donnés

Question :

Sélectionnez l'identifiant et le nom de chaque chat Ragdoll qui est soit 1) âgé de moins de cinq ans, soit 2) âgé de plus de dix ans.

Réponse :

SELECT
  id,
  name
FROM cat
WHERE (age < 5 OR age > 10)
  AND breed = 'Ragdoll';

Explication :

Comme l'indique l'instruction, nous sélectionnons les colonnes id et name de la table. cat de la table.

Ensuite, nous utilisons la clause WHERE pour imposer des conditions :

  • Sur la colonne âge :

Nous voulons sélectionner les chats qui ont moins de 5 ans (age < 5) ou plus de 10 ans (age > 10), nous utilisons donc le mot-clé OR et mettons les deux conditions entre parenthèses.

Pourquoi avons-nous besoin de parenthèses ? Nous voulons imposer cette condition composite à la colonne de l'âge. Que se passe-t-il si nous n'incluons pas de parenthèses ? Les parenthèses seront implicitement imposées aux deux dernières conditions, comme ceci : age < 5 OR (age > 10 AND breed = 'Ragdoll'). Le résultat sera donc incorrect.

  • Dans la colonne race :

Nous voulons sélectionner les chats de la race Ragdoll ; par conséquent, nous définissons simplement la condition comme breed = 'Ragdoll'. Notez que les valeurs textuelles en SQL sont placées entre guillemets simples (').

Cet exercice démontre une condition composite qui utilise des opérateurs logiques (AND, OR) et des opérateurs de comparaison mathématique (<, >, =).

Question 4 : Liste des chats dont le jouet préféré est une balle

Question :

Sélectionnez toutes les données relatives aux chats dont la race commence par "R", dont le jouet préféré commence par "ball" et dont la coloration se termine par un "m".

Réponse :

SELECT *
FROM cat
WHERE breed LIKE 'R%'
  AND fav_toy LIKE 'ball%'
  AND coloration LIKE '%m';

Explication :

Ici, nous sélectionnons toutes les colonnes de données (*) du tableau. cat tableau.

Nous voulons imposer des conditions sur les valeurs littérales des colonnes breed, colorations, et fav_toy. Pour ce faire, nous utiliserons la recherche de motifs ; en SQL, % est un caractère de remplacement qui représente n'importe quelle séquence de caractères.

La valeur de la colonne breed doit commencer par un "R". Par conséquent, nous utilisons un modèle qui indique une valeur commençant par "R" et suivie d'un nombre quelconque de caractères (défini par %). Si nous voulons imposer une telle condition à une valeur littérale, nous devons utiliser le mot-clé LIKE: breed LIKE 'R%'.

De même, nous voulons que le nom du jouet préféré commence par "ball" ; la condition est donc fav_toy LIKE 'ball%'.

Il en va de même pour la colonne coloration. Nous voulons que la valeur littérale se termine par un "m", le caractère % est donc placé devant : coloration LIKE '%m'.

Pour en savoir plus sur l'utilisation de l'opérateur LIKE, consultez nos articles Que font les opérateurs LIKE et NOT LIKE ? et How to Use LIKE in SQL.

Question 5 : Trouver le chat le plus ennuyé

Question :

Sélectionnez les noms de tous les chats mâles qui n'ont pas de jouet préféré - c'est-à-dire que la valeur du champ fav_toy est NULL.

Réponse :

SELECT name
FROM cat
WHERE sex = 'M'
  AND fav_toy IS NULL;

Explication :

Comme l'indique l'instruction, nous sélectionnons la colonne name de la table cat table.

Nous voulons sélectionner uniquement les chats mâles ; par conséquent, nous définissons une condition sur la colonne sex comme sex = 'M'. Pour définir cette condition, vous devez connaître les données stockées dans la table cat pour définir cette condition, c'est-à-dire savoir que la colonne sexe contient la valeur ‘F’ pour les chats femelles et ‘M’ pour les chats mâles.

Comme nous recherchons le chat qui s'ennuie le plus, nous devons définir une condition indiquant que la colonne fav_toy ne doit pas avoir de valeur ou doit être NULL. C'est ce que nous faisons avec fav_toy IS NULL.

Travailler avec les NULL est assez compliqué en SQL. Pour plus de détails, nous vous recommandons les articles suivants

Question 6 : Sélectionner les chats qui aiment les jouets aguicheurs

Question :

Sélectionnez l'ID, le nom, la race et la couleur de tous les chats qui :

  • Sont des femelles.
  • Aiment les jouets à taquiner,
  • Ne sont pas de race persane ou siamoise.

Réponse :

SELECT 
  id,
  name,
  breed,
  coloration
FROM cat
WHERE sex = 'F'
  AND fav_toy = 'teaser'
  AND (breed NOT LIKE 'Persian' AND breed NOT LIKE 'Siamese');

Explication :

Dans cet exercice, nous sélectionnons les colonnes id, name, breed, et coloration du tableau. cat tableau. Nous imposons ensuite les conditions suivantes :

  • Sur la colonne sex:
    Nous voulons sélectionner des chats femelles ; la condition est donc sex = 'F'.
  • Sur la colonne fav_toy:
    Nous voulons trouver des chats qui aiment les jouets aguicheurs ; la condition est donc fav_toy = 'teaser'.
  • Dans la colonne Race :
    Nous voulons sélectionner n'importe quelle race, à l'exception des Persans et des Siamois. Pour ce faire, nous utilisons le mot-clé NOT LIKE et mettons l'ensemble de la condition composite entre parenthèses (breed NOT LIKE 'Persian' AND breed NOT LIKE 'Siamese').

Bon travail ! Vous avez terminé la section sur la sélection de données dans un tableau unique avec différentes conditions de filtrage. Passons maintenant à l'utilisation de plusieurs tables.

Données provenant de plusieurs tableaux : Les jointures en SQL

Vous savez maintenant comment sélectionner des données dans un seul tableau. Mais que se passe-t-il si nous voulons sélectionner des données dans deux tables ou plus ? Nous devons joindre ces tables sur la base de valeurs de colonnes communes. C'est là que les opérations JOIN entrent en jeu.

Question 7 : Le rôle du JOIN

Question :

Que fait JOIN en SQL ?

Réponse :

La clause JOIN est utilisée pour combiner les données de deux tables ou plus.

Vous pouvez utiliser autant de JOINs que nécessaire. Ci-dessous, nous utilisons deux JOINs pour combiner les données de trois tables :

SELECT t1.column, t2.column, t3.column
FROM table1 AS t1
JOIN table2 AS t2 ON t1.column = t2.column
JOIN table3 AS t3 ON t1.column = t3.column
...

Lorsque vous joignez des tables, il est préférable d'utiliser des noms d'alias pour chaque table (ici, t1, t2, et t3). Ces noms d'alias sont utilisés pour faire référence aux colonnes de chaque table.

Pour en savoir plus sur Les jointures en SQL, consultez nos articles SQL INNER JOIN expliqué en mots simples et Comment lier deux tables en SQL.

À retenir :

JOINs Les JOIN sont utilisés pour combiner des données provenant de plusieurs tables.

Question 8 : Types de JOIN

Question :

Listez tous les types de JOINs disponibles en SQL et décrivez brièvement chacun d'entre eux.

Réponse :

Il existe quatre types de JOINs: [INNER] JOIN, RIGHT JOIN, LEFT JOIN, et FULL [OUTER] JOIN. Chacun d'entre eux fournit des résultats différents.

Une JOIN, également connue sous le nom de INNER JOIN, est le type de jointure le plus courant. Il ne renvoie que les enregistrements correspondants de deux tables ou plus.

sql practice questions

Un LEFT JOIN renvoie tous les enregistrements de la table de gauche (première) et les enregistrements correspondants de la table de droite (deuxième). S'il n'y a pas de correspondance dans la table de droite, les valeurs de null sont incluses dans le jeu de résultats.

sql practice questions

Pour plus de détails, voir Qu'est-ce qu'un JOINT DE GAUCHE en SQL ?

Une adresse RIGHT JOIN renvoie tous les enregistrements de la table de droite (deuxième) et les enregistrements correspondants de la table de gauche (première). S'il n'y a pas de correspondance dans la table de gauche, les valeurs de null sont incluses dans le jeu de résultats.

sql practice questions

Une requête FULL JOIN, également appelée FULL OUTER JOIN, renvoie tous les enregistrements des tables de gauche et de droite. Elle inclut les enregistrements correspondants des deux tables et utilise les valeurs null pour les enregistrements non correspondants.

sql practice questions

Lisez cet article pour en savoir plus sur les FULL JOIN.

En résumé, LEFT JOIN et RIGHT JOIN se concentrent sur une table en tant que source principale de données, tandis que FULL JOIN combine tous les enregistrements des deux tables. Le choix du site JOIN à utiliser dépend des besoins spécifiques en matière de recherche de données et de la relation entre les tables concernées.

Pour en savoir plus sur les différents types de JOIN, nous vous recommandons nos articles Les jointures en SQL et Les types de JOIN SQL expliqués. Notre aide-mémoire SQL JOIN résume la syntaxe des différents types de JOIN.

À retenir :

Les types de JOIN comprennent [INNER] JOIN, LEFT JOIN, RIGHT JOIN et FULL [OUTER] JOIN.

Données pour les questions 9 - 12

Dans les exercices 9 - 12, nous utiliserons l'ensemble de données Museum qui se compose de trois tables.

Le tableau artists contient les colonnes suivantes :

  • id - L'identifiant de la base de données pour un artiste donné.
  • name - Le nom de l'artiste.
  • birth_year - L'année de naissance de l'artiste.
  • death_year - L'année de naissance de l'artiste.
  • artistic_field - Le domaine principal de l'artiste (par exemple, aquarelle, sculpture, peinture à l'huile).

La table museum contient les 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.

Le tableau piece_of_art contient les colonnes suivantes :

  • id - L'ID d'une œuvre d'art donnée.
  • name - Le nom de l'œuvre.
  • artist_id - L'identifiant de l'artiste qui a créé cette œuvre.
  • museum_id - L'identifiant du musée qui possède cette œuvre dans sa collection.

Question 9 : Trouver des artistes nés après 1800 et l'art qu'ils ont créé

Question :

Pour chaque artiste né après 1800 et ayant vécu plus de 50 ans, indiquez son nom et le nom des œuvres d'art qu'il a créées. Renommez les colonnes nom_artiste et nom_œuvre, respectivement.

Réponse :

SELECT
  a.name AS artist_name,
  poa.name AS piece_name
FROM artist a
JOIN piece_of_art poa
  ON a.id = poa.artist_id
WHERE death_year - birth_year > 50
  AND birth_year > 1800;

Explication :

Nous sélectionnons des noms d'artistes (alias artist_name) et des œuvres d'art qu'ils ont créées (alias piece_name). Par conséquent, nous devons joindre la table artist (alias a) avec la table piece_of_art (alias poa) sur leur colonne commune qui stocke les identifiants des artistes (ON a.id = poa.artist_id).

Nous voulons prendre en compte uniquement les artistes qui ont vécu plus de 50 ans. Pour définir cette condition, nous utiliserons les colonnes birth_year et death_year de la table des artistes comme suit :

death_year - birth_year > 50

Nous voulons également répertorier les artistes nés après 1800 : birth_year > 1800.

Pour en savoir plus, consultez cet article sur l'association de deux tables en SQL.

Question 10 : Sélectionner toutes les œuvres d'art et leur emplacement

Question :

Sélectionner les noms de toutes les œuvres d'art ainsi que les noms des musées qui les abritent et les pays dans lesquels ces musées sont situés. Indiquez également les œuvres d'art perdues (celles qui n'ont pas de musée associé).

Réponse :

SELECT
  poa.name,
  m.name,
  m.country
FROM piece_of_art poa
LEFT JOIN museum m
  ON poa.museum_id = m.id;

Explication :

Comme nous voulons sélectionner les noms des œuvres d'art et les noms et pays des musées, nous devons joindre la table piece_of_art (alias poa) avec la table museum (alias m) sur la colonne de l'ID du musée (ON poa.museum_id = m.id).

Nous devons afficher toutes les œuvres d'art, y compris celles qui ont été perdues. Notez que les œuvres d'art perdues n'ont pas de musée attribué. Par conséquent, nous avons besoin d'un type spécifique de JOIN qui sélectionne toutes les données de la table, qu'elles soient ou non associées à un musée. piece_of_art qu'il y ait ou non des enregistrements correspondants dans la table museum table :

FROM piece_of_art poa LEFT JOIN museum m

Ce LEFT JOIN garantit que nous sélectionnons toutes les lignes du tableau de gauche (ici, piece_of_art).

Consultez cet article sur le LEFT JOIN pour en savoir plus.

Question 11 : Liste de toutes les œuvres d'art

Question :

Indiquez les noms de toutes les œuvres d'art ainsi que les noms de leurs créateurs et les noms des musées qui abritent ces œuvres d'art. Oubliez les œuvres perdues et les œuvres d'art dont l'artiste est inconnu. Nommez les colonnes nom_de_l'oeuvre_d'art, nom_de_l'artiste et nom_du_musée.

Réponse :

SELECT
  a.name AS artist_name,
  m.name AS museum_name,
  poa.name AS piece_of_art_name
FROM museum m
JOIN piece_of_art poa
  ON m.id = poa.museum_id
JOIN artist a
  ON a.id = poa.artist_id;

Explication :

Ici, nous sélectionnons des noms d'artistes dans le tableau, des noms de musées dans le tableau. artist les noms des musées dans la table museum et des noms d'œuvres d'art dans le tableau piece_of_art tableau. Nous devons donc joindre les trois tableaux sur leurs colonnes communes :

  • Nous joignons la table museum avec la table piece_of_art sur les valeurs d'identification des musées.
  • Nous joignons la table artist avec la table piece_of_art sur les valeurs d'identification des artistes.

Une fois que nous avons joint les trois tables, nous pouvons sélectionner les valeurs de sortie.

Notez que nous voulons omettre les œuvres d'art auxquelles aucun musée ou artiste n'a été attribué. C'est pourquoi nous utilisons la méthode standard JOIN (ou INNER JOIN) qui joint les données des tables uniquement lorsqu'il existe une correspondance dans la colonne sur laquelle JOIN est exécuté.

Pour en savoir plus, suivez cet article sur la manière de joindre 3 tables ou plus.

Question 12 : Liste d'œuvres d'art créées par des artistes inconnus

Question :

Vérifiez si des œuvres ont été créées par des artistes inconnus. Indiquez les noms de ces œuvres ainsi que les noms des musées qui les abritent.

Réponse :

SELECT
  poa.name,
  m.name
FROM piece_of_art poa
JOIN museum m
  ON poa.museum_id = m.id
WHERE poa.artist_id IS NULL;

Explication :

Nous voulons montrer les noms des pièces créées par des artistes inconnus ainsi que les noms des musées qui les abritent. Nous joignons donc la table piece_of_art (alias poa) avec la table museum (alias m) sur la colonne de l'ID du musée (ON poa.museum_id = m.id).

Comme nous recherchons des œuvres d'art créées par des artistes inconnus, nous incluons la condition suivante dans la clause WHERE: poa.artist_id IS NULL.

Groupement et agrégation de données

L'agrégation et le regroupement sont des techniques utilisées pour organiser les données en groupes sur la base de critères définis et effectuer des calculs sur les groupes.

Question 13 : Fonctions d'agrégation et rôle de GROUP BY

Question :

Dressez la liste des fonctions d'agrégation disponibles et expliquez le rôle de la clause GROUP BY.

Réponse :

L'agrégation consiste à appliquer des opérations mathématiques à un ensemble de valeurs dans une colonne. Les fonctions d'agrégation les plus couramment utilisées sont SUM(), AVG(), COUNT(), MAX() et MIN().

Par exemple, imaginons une table qui stocke des valeurs de ventes mensuelles :

yearmonthsales
2022115
2022124
202313
202326
202336
202344
202355

Vous pouvez utiliser la fonction d'agrégation SUM() pour obtenir le total des ventes, comme ceci :

SELECT SUM(sales) AS total_sales
FROM sales_table;

Le résultat est le suivant :

total_sales
33

Lorsque nous agrégeons des données, nous les segmentons souvent en groupes sur la base de valeurs distinctes dans la colonne utilisée pour regrouper les données.

Le regroupement consiste à créer des groupes de données sur la base des valeurs de la (des) colonne(s) donnée(s) en argument à la clause GROUP BY.

Par exemple, imaginons que vous souhaitiez sélectionner les ventes par année. Pour ce faire, vous devez regrouper les données par année, comme ceci :

SELECT year, SUM(sales) AS year_sales
FROM sales_table
GROUP BY year;

La sortie est la suivante :

yearyear_sales
20229
202324

Si la colonne sur laquelle nous regroupons les données a cinq valeurs distinctes, les données seront regroupées en cinq groupes.

Nous vous recommandons cet article si vous souhaitez en savoir plus sur la clause GROUP BY.

À retenir :

L'agrégation consiste à effectuer des calculs sur un ensemble de valeurs et le regroupement consiste à organiser les données en groupes sur la base de critères spécifiques.

Question 14 : WHERE vs. HAVING

Question :

Quelle est la différence entre WHERE et HAVING?

Réponse :

Les sites WHERE et HAVING sont tous deux utilisés pour filtrer les données en imposant certaines conditions.

La différence est que WHERE est utilisé pour imposer des conditions sur les colonnes de données (comme vous l'avez vu dans la section Requêtes sur une seule table ) et HAVING est utilisé pour imposer des conditions sur les fonctions agrégées (comme vous le verrez dans cette section).

Lisez cet article sur WHERE vs. HAVING pour en savoir plus sur les différences entre ces deux clauses.

À retenir :

WHERE La clause WHERE impose des conditions sur les colonnes. HAVING impose des conditions sur les fonctions d'agrégat.

Données pour les questions 15 - 18

Dans les exercices 15 à 18, nous utiliserons le tableau games tableau. Il est composé des colonnes suivantes :

  • id - L'identifiant d'un jeu donné.
  • title - Le nom du jeu (par exemple "Super Mario Bros").
  • company - Le nom de la société qui fabrique ce jeu (par exemple, "Nintendo").
  • type - Le type de jeu (par exemple, "arcade").
  • production_year - L'année de création du jeu.
  • system - La console pour laquelle le jeu est sorti (par exemple, "NES").
  • production_cost - Le coût de production du jeu.
  • revenue - Les revenus générés par le jeu.
  • rating - La note attribuée à ce jeu.

Question 15 : Calculer le coût de production moyen des bons jeux

Question :

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

Réponse :

SELECT 
  AVG(production_cost)
FROM games
WHERE production_year BETWEEN 2010 AND 2015
  AND rating > 7;

Explication :

Pour sélectionner le coût de production moyen des jeux, nous utilisons la fonction d'agrégation AVG() sur la colonne production_cost. Cette fonction prend toutes les valeurs présentes dans la colonne production_cost et calcule la moyenne.

Comme nous nous intéressons aux jeux produits entre 2010 et 2015, nous devons inclure cette condition dans la clause WHERE: production_year BETWEEN 2010 AND 2015. Cela ressemble à de l'anglais ordinaire !

De plus, nous voulons inclure uniquement les jeux dont la note est supérieure à 7, nous ajoutons donc une autre condition dans la clause WHERE: AND rating > 7.

Consultez cet article sur la fonction AVG() pour voir d'autres exemples.

Question 16 : Fournir des statistiques de production de jeux par année

Question :

Pour chaque année :

  • Afficher l'année (production_year).
  • Comptez le nombre de jeux sortis cette année-là (nommez ce compte).
  • Indiquez le coût moyen de production (sous la forme avg_cost) pour ces jeux.
  • Indiquez le revenu moyen (sous la forme avg_revenue) de ces jeux.

Réponse :

SELECT
  production_year,
  COUNT(*) AS count,
  AVG(production_cost) AS avg_cost,
  AVG(revenue) AS avg_revenue
FROM games
GROUP BY production_year;

Explication :

Nous voulons afficher différentes statistiques par année ; par conséquent, nous devons GROUP BY production_year.

Lorsque nous effectuons une sélection dans le tableau games nous utilisons la fonction d'agrégation COUNT() pour compter les jeux sortis chaque année. Nous utilisons * comme argument car nous voulons compter toutes les lignes (et non les valeurs d'une colonne spécifique). Nous lui donnons l'alias AS count.

Ensuite, nous voulons afficher le coût moyen de production : AVG(coût_de_production). Nous l'appelons AS avg_cost.

Enfin, nous affichons le revenu moyen : AVG(revenue). Nous l'aliasons comme avg_revenue.

Question 17 : Calculer la marge brute par entreprise

Question :

Pour toutes les entreprises présentes dans le games tableau, indiquez leur nom et leur marge brute sur l'ensemble des années. Pour simplifier ce problème, supposons que le bénéfice brut est égal aux recettes moins le coût de production de tous les jeux ; nommons cette colonne gross_profit_sum. Ordonnez les résultats de manière à ce que l'entreprise ayant le bénéfice brut le plus élevé soit la première.

Réponse :

SELECT
  company,
  SUM(revenue - production_cost) AS gross_profit_sum
FROM games
GROUP BY 1
ORDER BY 2 DESC;

Explication :

Nous sélectionnons la colonne company dans le games tableau. Pour chaque société, nous additionnons les valeurs de la marge brute (revenue - production_cost) produites par chaque jeu créé par cette société.

Comme nous voulons voir la somme des bénéfices bruts par société, nous devons utiliser GROUP BY company. Cependant, dans ce cas, nous utilisons une syntaxe différente : GROUP BY 1, ce qui signifie que nous voulons GROUP BY lapremière colonne listée dans SELECT.

Enfin, nous classons les résultats par ordre décroissant sur la base des valeurs de la marge brute par entreprise.

Question 18 : Identifier les bons jeux

Question :

Nous nous intéressons aux bons jeux produits entre 2000 et 2009. Un bon jeu a une note supérieure à 6 et était rentable. Pour chaque entreprise, indiquez

  • Le nom de l'entreprise.
  • Le revenu total des bons jeux produits entre 2000 et 2009 (dans la colonne revenue_sum ).
  • Le nombre de bons jeux produits par l'entreprise au cours de cette période (colonne number_of_games ).

Important : N'affichez que les entreprises dont le revenu des bons jeux est supérieur à 4 000 000.

Réponse :

SELECT
  company,
  COUNT(company) AS number_of_games,
  SUM(revenue) AS revenue_sum
FROM games
WHERE production_year BETWEEN 2000 AND 2009
  AND rating > 6
  AND revenue - production_cost > 0
GROUP BY company
HAVING SUM(revenue) > 4000000;

Explication :

Cette question est un peu plus délicate, car nous devons créer une requête qui utilise WHERE, HAVING, des fonctions d'agrégation et de regroupement.

Analysons les instructions étape par étape et traduisons-les en code SQL.

WHERE-Instructions relatives aux jeux :

  • lesjeux produits entre 2000 et 2009 entraînent l'ajout de cette condition à la clause WHERE:
    WHERE production_year BETWEEN 2000 AND 2009
  • les jeux dont lanote est supérieure à 6 entraînent l'ajout de cette condition à la clause WHERE:
    AND rating > 6
  • lesjeux rentables entraînent l'ajout de cette condition à la clause WHERE:
    AND revenue - production_cost > 0
    N'oubliez pas qu'un jeu rentable signifie que les recettes sont supérieures au coût de production.

SELECT-instructions connexes :

  • afficher le nom de l'entreprise entraîne l'ajout de cette colonne à l'énoncé SELECT:
    SELECT company
  • afficher son revenu total (en tant que revenue_sum) entraîne l'ajout de cette colonne à la déclaration SELECT:
    SUM(revenue) AS revenue_sum
  • afficher lenombre de bons jeux (number_of_games) entraîne l'ajout de cette colonne à la déclaration SELECT:
    COUNT(company) AS number_of_games

GROUP BY- and HAVING-Les instructions relatives à ce sujet :

  • pour chaque entreprise signifie que nous calculons les statistiques (COUNT() et SUM()) sur une entreprise Nous devons donc regrouper les données par entreprise :
    GROUP BY company
  • montrer les entreprises dont le chiffre d'affaires du jeu est supérieur à 4 000 000 entraîne l'ajout de cette condition à la clause HAVING:
    HAVING SUM(revenue) > 4000000

Voilà comment nous avons disséqué les instructions et les avons traduites en code SQL.

En savoir plus sur les bases La pratique du SQL

Cet article a couvert les bases des requêtes SQL, y compris la manière de filtrer les données, de joindre plusieurs tables, d'ordonner et de trier les résultats, et d'agréger et de grouper les données.

Vous avez aimé les exercices d'entraînement SQL jusqu'à présent ? Tous ces exercices proviennent de notre Exercices Pratiques de SQL cours. Pour plus d'exercices SQL, consultez ces cours d'entraînement LearnSQL.fr:

Vous pouvez acheter chacun de ces cours individuellement, ou vous pouvez acheter notre package Tout à vie SQL. Il couvre l'ensemble des 70+ cours SQL proposés sur notre plateforme, y compris ces cours pratiques, et tous les nouveaux cours que nous ajouterons à l'avenir.

Et n'oubliez pas, c'est en forgeant qu'on devient forgeron. Bonne chance dans votre parcours SQL !