Exercices SQL corrigés : COUNT, SUM, AVG, MIN, MAX

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 · niveau 1

Affiche le nombre total de produits.

Table products (6 lignes)
idnamecategorypricestock
1KeyboardOffice2540
2MouseOffice150
3ScreenDisplay18012
4HeadsetAudio608
5WebcamOffice450
6SpeakerAudio3525
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 · niveau 1

Affiche le salaire le plus élevé parmi tous les employés.

Table employees (8 lignes)
idnamedepartmentsalary
1AliceFinance32000
2BobIT41000
3ClaireFinance38000
4DavidHR29000
5EmmaIT50000
6FaridIT47000
7GaelleHR33000
8HugoFinance44000
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 · niveau 2

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.

Table matches (10 lignes)
idplayed_onhome_idaway_idhome_goalsaway_goals
12025-08-021221
22025-08-033400
32025-08-095113
42025-08-102322
52025-08-164531
62025-08-171310
72025-08-232401
82025-08-243523
92025-08-304111
102025-08-315202
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)
36

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 · cours, niveau 5 · Guidé

Combien y a-t-il de livres dans la table books ?

Table books (10 lignes)
idtitleauthor_idgenrepagesyear
1Cold River1Novel3202011
2Salt Roads2Travel2102016
3The Glass Hive3Sci-Fi4122019
4Winter Ledger1Crime2882014
5Desert Letters2Novel3562020
6Small Engines4Sci-Fi1982022
7Harbor Lights5Novel4452008
8Night Garden3Crime3012017
9Paper Birds5Poetry962012
10Open Maps4Travel2402021
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 · cours, niveau 5 · Entraînement

Combien de places ont été vendues au total, tous vols confondus ?

Table flights (12 lignes)
idairlineorigindestdepartsduration_minpriceseats_soldcapacity
1SkyJetCDGMAD2025-06-01 08:1012589150180
2AirNovaCDGLIS2025-06-01 11:40155120160170
3BlueWingLYSFCO2025-06-02 07:309575110150
4SkyJetMADCDG2025-06-02 18:2012095170180
5AirNovaBERCDG2025-06-03 09:05110105140160
6BlueWingNCEBER2025-06-03 13:5013014090150
7SkyJetCDGFCO2025-06-04 06:4513599175180
8AirNovaLISMAD2025-06-04 16:15756560120
9BlueWingFCOLYS2025-06-05 20:3010082130150
10SkyJetCDGBER2025-06-05 10:00105110120180
11AirNovaMADLIS2025-06-06 12:25807095120
12BlueWingLYSMAD2025-06-06 15:4011579100150
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 · cours, niveau 5 · Entraînement

Affiche la date du premier prêt (first_loan) et celle du dernier prêt (last_loan).

Les noms de colonnes demandés comptent.

Table loans (12 lignes)
idbook_idmember_idloan_datereturn_date
1112025-01-052025-01-19
2322025-01-102025-02-02
3512025-02-012025-02-10
4732025-02-03NULL
5342025-02-152025-03-01
6222025-03-022025-03-30
7852025-03-05NULL
8132025-03-102025-03-18
9612025-03-202025-04-15
10352025-04-01NULL
11942025-04-052025-04-12
121022025-04-082025-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_loanlast_loan
2025-01-052025-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 · cours, niveau 5 · Entraînement

Combien de contacts ont une adresse e-mail renseignée ?

Table contacts (5 lignes)
idnameemailphonecity
1Alice Martinalice@mail.com0612345678Paris
2bob durandNULL0698765432Lyon
3CLAIRE ROUXclaire@work.orgNULLNULL
4David LefevreNULLNULLNantes
5Emma Petitemma@mail.com0611223344NULL
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 · cours, niveau 5 · Défi

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).

Les noms de colonnes demandés comptent.

Table grades (18 lignes)
idstudent_idsubjectgradeterm
11math151
21french121
31math172
42math91
52french141
62math112
73math131
83history161
94math181
104french161
114math192
125french81
135math101
146math141
156history111
… 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_gradesavg_mathspread
91410

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 »