Exercices SQL corrigés : COUNT, SUM, AVG, MIN, MAX
Mis à jour le
Les agrégats résument plusieurs lignes en une valeur : COUNT, SUM, AVG, MIN, MAX. Ces 3 exercices vont du niveau 1 au niveau 2 ; ils utilisent la syntaxe de SQLite, le moteur SQL de SpeedQL.
Conseil : COUNT(*) compte les lignes ; COUNT(colonne) ignore les valeurs NULL.
Relire la fiche « COUNT, SUM, AVG, MIN, MAX » de l’aide-mémoire
Exercice 1
Affiche le nombre total de produits.
| id | name | category | price | stock |
|---|---|---|---|---|
| 1 | Keyboard | Office | 25 | 40 |
| 2 | Mouse | Office | 15 | 0 |
| 3 | Screen | Display | 180 | 12 |
| 4 | Headset | Audio | 60 | 8 |
| 5 | Webcam | Office | 45 | 0 |
| 6 | Speaker | Audio | 35 | 25 |
Voir l’indice
Notions à utiliser : COUNT, SUM, AVG, MIN, MAX.
Structure de la requête :
SELECT COUNT(*)
FROM …Voir la correction
SELECT COUNT(*)
FROM products;Résultat attendu (1 ligne) :
| COUNT(*) |
|---|
| 6 |
Exercice 2
Affiche le salaire le plus élevé parmi tous les employés.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
| 5 | Emma | IT | 50000 |
| 6 | Farid | IT | 47000 |
| 7 | Gaelle | HR | 33000 |
| 8 | Hugo | Finance | 44000 |
Voir l’indice
Notions à utiliser : COUNT, SUM, AVG, MIN, MAX.
Structure de la requête :
SELECT MAX(…)
FROM …Voir la correction
SELECT MAX(salary)
FROM employees;Résultat attendu (1 ligne) :
| MAX(salary) |
|---|
| 50000 |
Exercice 3
Affiche le nombre de matchs nuls (les deux équipes ont marqué autant de buts) et le nombre total de buts marqués pendant ces matchs.
| id | played_on | home_id | away_id | home_goals | away_goals |
|---|---|---|---|---|---|
| 1 | 2025-08-02 | 1 | 2 | 2 | 1 |
| 2 | 2025-08-03 | 3 | 4 | 0 | 0 |
| 3 | 2025-08-09 | 5 | 1 | 1 | 3 |
| 4 | 2025-08-10 | 2 | 3 | 2 | 2 |
| 5 | 2025-08-16 | 4 | 5 | 3 | 1 |
| 6 | 2025-08-17 | 1 | 3 | 1 | 0 |
| 7 | 2025-08-23 | 2 | 4 | 0 | 1 |
| 8 | 2025-08-24 | 3 | 5 | 2 | 3 |
| 9 | 2025-08-30 | 4 | 1 | 1 | 1 |
| 10 | 2025-08-31 | 5 | 2 | 0 | 2 |
Voir l’indice
Notions à utiliser : WHERE (filtres), COUNT, SUM, AVG, MIN, MAX.
Structure de la requête :
SELECT COUNT(*), SUM(… + …)
FROM …
WHERE … = …Voir la correction
SELECT COUNT(*), SUM(home_goals + away_goals)
FROM matches
WHERE home_goals = away_goals;Résultat attendu (1 ligne) :
| COUNT(*) | SUM(home_goals + away_goals) |
|---|---|
| 3 | 6 |
Plus d’exercices : niveau 5 du cours SQL, « Résumer une table : les agrégats »
Ces 5 exercices viennent du niveau 5 du cours, sur d’autres tables. Chacun a des indices écrits et sa correction, repliés par défaut.
Exercice 4
Combien y a-t-il de livres dans la table books ?
| id | title | author_id | genre | pages | year |
|---|---|---|---|---|---|
| 1 | Cold River | 1 | Novel | 320 | 2011 |
| 2 | Salt Roads | 2 | Travel | 210 | 2016 |
| 3 | The Glass Hive | 3 | Sci-Fi | 412 | 2019 |
| 4 | Winter Ledger | 1 | Crime | 288 | 2014 |
| 5 | Desert Letters | 2 | Novel | 356 | 2020 |
| 6 | Small Engines | 4 | Sci-Fi | 198 | 2022 |
| 7 | Harbor Lights | 5 | Novel | 445 | 2008 |
| 8 | Night Garden | 3 | Crime | 301 | 2017 |
| 9 | Paper Birds | 5 | Poetry | 96 | 2012 |
| 10 | Open Maps | 4 | Travel | 240 | 2021 |
Voir les indices
Indice : SELECT COUNT(*) FROM books;
Voir la correction
SELECT COUNT(*) AS nb_books
FROM books;Résultat attendu (1 ligne) :
| nb_books |
|---|
| 10 |
COUNT(*) compte toutes les lignes de la table.
Exercice 5
Combien de places ont été vendues au total, tous vols confondus ?
| id | airline | origin | dest | departs | duration_min | price | seats_sold | capacity |
|---|---|---|---|---|---|---|---|---|
| 1 | SkyJet | CDG | MAD | 2025-06-01 08:10 | 125 | 89 | 150 | 180 |
| 2 | AirNova | CDG | LIS | 2025-06-01 11:40 | 155 | 120 | 160 | 170 |
| 3 | BlueWing | LYS | FCO | 2025-06-02 07:30 | 95 | 75 | 110 | 150 |
| 4 | SkyJet | MAD | CDG | 2025-06-02 18:20 | 120 | 95 | 170 | 180 |
| 5 | AirNova | BER | CDG | 2025-06-03 09:05 | 110 | 105 | 140 | 160 |
| 6 | BlueWing | NCE | BER | 2025-06-03 13:50 | 130 | 140 | 90 | 150 |
| 7 | SkyJet | CDG | FCO | 2025-06-04 06:45 | 135 | 99 | 175 | 180 |
| 8 | AirNova | LIS | MAD | 2025-06-04 16:15 | 75 | 65 | 60 | 120 |
| 9 | BlueWing | FCO | LYS | 2025-06-05 20:30 | 100 | 82 | 130 | 150 |
| 10 | SkyJet | CDG | BER | 2025-06-05 10:00 | 105 | 110 | 120 | 180 |
| 11 | AirNova | MAD | LIS | 2025-06-06 12:25 | 80 | 70 | 95 | 120 |
| 12 | BlueWing | LYS | MAD | 2025-06-06 15:40 | 115 | 79 | 100 | 150 |
Voir les indices
Indice 1 · piste : Il faut additionner une colonne sur toutes les lignes.
Indice 2 · méthode : Additionne la colonne seats_sold avec SUM.
Voir la correction
SELECT SUM(seats_sold) AS total_seats
FROM flights;Résultat attendu (1 ligne) :
| total_seats |
|---|
| 1500 |
SUM additionne la colonne sur toutes les lignes.
Exercice 6
Affiche la date du premier prêt (first_loan) et celle du dernier prêt (last_loan).
| id | book_id | member_id | loan_date | return_date |
|---|---|---|---|---|
| 1 | 1 | 1 | 2025-01-05 | 2025-01-19 |
| 2 | 3 | 2 | 2025-01-10 | 2025-02-02 |
| 3 | 5 | 1 | 2025-02-01 | 2025-02-10 |
| 4 | 7 | 3 | 2025-02-03 | NULL |
| 5 | 3 | 4 | 2025-02-15 | 2025-03-01 |
| 6 | 2 | 2 | 2025-03-02 | 2025-03-30 |
| 7 | 8 | 5 | 2025-03-05 | NULL |
| 8 | 1 | 3 | 2025-03-10 | 2025-03-18 |
| 9 | 6 | 1 | 2025-03-20 | 2025-04-15 |
| 10 | 3 | 5 | 2025-04-01 | NULL |
| 11 | 9 | 4 | 2025-04-05 | 2025-04-12 |
| 12 | 10 | 2 | 2025-04-08 | 2025-04-20 |
Voir les indices
Indice 1 · piste : MIN et MAX ne servent pas qu'aux nombres.
Indice 2 · méthode : MIN(loan_date) AS first_loan et MAX(loan_date) AS last_loan.
Voir la correction
SELECT MIN(loan_date) AS first_loan, MAX(loan_date) AS last_loan
FROM loans;Résultat attendu (1 ligne) :
| first_loan | last_loan |
|---|---|
| 2025-01-05 | 2025-04-08 |
Au format AAAA-MM-JJ, l'ordre alphabétique est aussi l'ordre chronologique : MIN donne la date la plus ancienne, MAX la plus récente.
Exercice 7
Combien de contacts ont une adresse e-mail renseignée ?
| id | name | phone | city | |
|---|---|---|---|---|
| 1 | Alice Martin | alice@mail.com | 0612345678 | Paris |
| 2 | bob durand | NULL | 0698765432 | Lyon |
| 3 | CLAIRE ROUX | claire@work.org | NULL | NULL |
| 4 | David Lefevre | NULL | NULL | Nantes |
| 5 | Emma Petit | emma@mail.com | 0611223344 | NULL |
Voir les indices
Indice 1 · piste : L'une des deux formes de COUNT ignore les cases vides.
Indice 2 · méthode : COUNT(email) ne compte que les e-mails non vides.
Voir la correction
SELECT COUNT(email) AS with_email
FROM contacts;Résultat attendu (1 ligne) :
| with_email |
|---|
| 3 |
COUNT(*) aurait donné 5 ; COUNT(email) ignore les 2 contacts sans e-mail.
Exercice 8
Pour les notes de mathématiques, affiche en une seule ligne : le nombre de notes (nb_grades), leur moyenne arrondie à une décimale (avg_math) et l'écart entre la meilleure et la moins bonne note (spread).
| id | student_id | subject | grade | term |
|---|---|---|---|---|
| 1 | 1 | math | 15 | 1 |
| 2 | 1 | french | 12 | 1 |
| 3 | 1 | math | 17 | 2 |
| 4 | 2 | math | 9 | 1 |
| 5 | 2 | french | 14 | 1 |
| 6 | 2 | math | 11 | 2 |
| 7 | 3 | math | 13 | 1 |
| 8 | 3 | history | 16 | 1 |
| 9 | 4 | math | 18 | 1 |
| 10 | 4 | french | 16 | 1 |
| 11 | 4 | math | 19 | 2 |
| 12 | 5 | french | 8 | 1 |
| 13 | 5 | math | 10 | 1 |
| 14 | 6 | math | 14 | 1 |
| 15 | 6 | history | 11 | 1 |
| … et 3 lignes de plus | ||||
Voir les indices
Indice 1 · piste : Filtre d'abord les notes de maths. Un calcul peut combiner deux agrégats, comme il combine deux colonnes.
Indice 2 · méthode : WHERE subject = 'math', puis COUNT(*), ROUND(AVG(grade), 1) et MAX(grade) - MIN(grade).
Voir la correction
SELECT COUNT(*) AS nb_grades,
ROUND(AVG(grade), 1) AS avg_math,
MAX(grade) - MIN(grade) AS spread
FROM grades
WHERE subject = 'math';Résultat attendu (1 ligne) :
| nb_grades | avg_math | spread |
|---|---|---|
| 9 | 14 | 10 |
WHERE s'applique avant les trois agrégats, qui ne voient donc que les notes de maths. MAX(grade) - MIN(grade) est un calcul entre deux agrégats.
S’entraîner avec correction automatique
Dans SpeedQL, tu écris ta requête et elle est vérifiée tout de suite, sur ces tables puis sur un jeu de données caché.
S’entraîner sur les 7 questions « COUNT, SUM, AVG, MIN, MAX »