Rappels SQL MySQL & Correction - Gestion des absences scolaires
Rappels de mots-clés SQL (MySQL)
1️⃣ `LIKE` — Recherche par motif
Rôle
LIKE permet de filtrer des chaînes de caractères selon un motif.
Caractères spéciaux
% → remplace 0, 1 ou plusieurs caractères
_ → remplace un seul caractère
Syntaxe
SELECT ...
FROM table
WHERE colonne LIKE 'motif';
Exemples
-- Noms qui commencent par N
WHERE nom LIKE 'N%';
-- Emails qui contiennent @school
WHERE email LIKE '%@school%';
-- Motif contenant "mal"
WHERE motif LIKE '%mal%';
2️⃣ `AVG()` — Moyenne
Rôle
AVG() calcule la moyenne des valeurs numériques d’une colonne.
Syntaxe
AVG(colonne)
Utilisation avec `GROUP BY`
SELECT id_eleve, AVG(nb_heures)
FROM ABSENCE
GROUP BY id_eleve;
Avec `ROUND()` pour arrondir
SELECT ROUND(AVG(nb_heures), 2)
FROM ABSENCE;
? ROUND(valeur, 2) arrondit à 2 chiffres après la virgule.
3️⃣ `SOME` / `ANY` — Comparaison avec une sous-requête
Rôle
SOME (synonyme de ANY) compare une valeur avec les résultats d’une sous-requête.
La condition est vraie si au moins une valeur de la sous-requête satisfait la comparaison.
Syntaxe générale
expression opérateur SOME (sous-requête)
Exemples d’opérateurs
Exemple simple
-- Élèves ayant au moins une absence > 2 heures
SELECT nom, prenom
FROM ELEVE
WHERE id_eleve = SOME (
SELECT id_eleve
FROM ABSENCE
WHERE nb_heures > 2
);
? Signification : l’élève est sélectionné s’il existe au moins une absence de plus de 2 heures.
Exemple avec calcul
-- Élèves dont le total d'heures est supérieur à au moins un autre élève
SELECT el.nom, el.prenom
FROM ELEVE el
WHERE (
SELECT SUM(a.nb_heures)
FROM ABSENCE a
WHERE a.id_eleve = el.id_eleve
) > SOME (
SELECT SUM(nb_heures)
FROM ABSENCE
GROUP BY id_eleve
);
4️⃣ Comparaison rapide
| Mot-clé |
Utilité |
LIKE |
Recherche par motif |
AVG() |
Calculer une moyenne |
ROUND() |
Arrondir un résultat |
SOME / ANY |
Comparer avec au moins un résultat |
IN |
Appartenance à une liste |
EXISTS |
Test d’existence |
? À retenir pour l’examen (MySQL)
LIKE → texte
AVG → moyenne
ROUND(AVG(...), n) → moyenne arrondie
SOME → au moins une valeur dans une sous-requête
CORRECTION SQL (MySQL)
Gestion des absences scolaires
Schéma relationnel utilisé
ELEVE(id_eleve, matricule, nom, prenom, date_naissance, classe)
ENSEIGNANT(id_ens, nom, prenom, email)
COURS(id_cours, libelle, classe, id_ens)
ABSENCE(id_abs, id_eleve, id_cours, date_abs, nb_heures, motif, justifie)
Partie A – Requêtes de base (SELECT)
Q1
SELECT nom, prenom, classe
FROM ELEVE
ORDER BY classe, nom;
Q2
SELECT date_abs, nb_heures, motif, justifie
FROM ABSENCE;
Q3
SELECT c.libelle, c.classe, e.nom, e.prenom
FROM COURS c
JOIN ENSEIGNANT e ON e.id_ens = c.id_ens;
Partie B – WHERE et LIKE
Q4
SELECT *
FROM ELEVE
WHERE nom LIKE 'N%';
Q5
SELECT *
FROM ENSEIGNANT
WHERE email LIKE '%@school%';
Q6
SELECT *
FROM ABSENCE
WHERE motif LIKE '%mal%';
Q7
SELECT *
FROM COURS
WHERE libelle LIKE '%Math%';
Partie C – Jointures
Q8
SELECT el.nom, el.prenom, c.libelle, a.date_abs, a.nb_heures
FROM ABSENCE a
JOIN ELEVE el ON el.id_eleve = a.id_eleve
JOIN COURS c ON c.id_cours = a.id_cours;
Q9
SELECT el.nom, el.prenom, c.libelle, a.date_abs, a.nb_heures
FROM ABSENCE a
JOIN ELEVE el ON el.id_eleve = a.id_eleve
JOIN COURS c ON c.id_cours = a.id_cours
WHERE el.classe = '3A';
Partie D – Agrégats et ROUND
Q10 (moyenne arrondie à 2 décimales)
SELECT el.id_eleve, el.nom, el.prenom,
ROUND(AVG(a.nb_heures), 2) AS moyenne_heures
FROM ELEVE el
JOIN ABSENCE a ON a.id_eleve = el.id_eleve
GROUP BY el.id_eleve, el.nom, el.prenom;
Q11
SELECT el.id_eleve, el.nom, el.prenom,
SUM(a.nb_heures) AS total_heures
FROM ELEVE el
JOIN ABSENCE a ON a.id_eleve = el.id_eleve
GROUP BY el.id_eleve, el.nom, el.prenom;
Q12 (Top 3 – MySQL)
SELECT el.id_eleve, el.nom, el.prenom,
SUM(a.nb_heures) AS total_heures
FROM ELEVE el
JOIN ABSENCE a ON a.id_eleve = el.id_eleve
GROUP BY el.id_eleve, el.nom, el.prenom
ORDER BY total_heures DESC
LIMIT 3;
Q13
SELECT c.libelle, COUNT(a.id_abs) AS nb_absences
FROM COURS c
LEFT JOIN ABSENCE a ON a.id_cours = c.id_cours
GROUP BY c.libelle;
Q14
SELECT el.classe, ROUND(AVG(a.nb_heures), 2) AS moyenne_heures
FROM ABSENCE a
JOIN ELEVE el ON el.id_eleve = a.id_eleve
GROUP BY el.classe;
Q15
SELECT el.nom, el.prenom, SUM(a.nb_heures) AS total_heures
FROM ELEVE el
JOIN ABSENCE a ON a.id_eleve = el.id_eleve
GROUP BY el.id_eleve, el.nom, el.prenom
HAVING SUM(a.nb_heures) > 10;
Partie E – Sous-requêtes avec SOME (MySQL)
Q16
SELECT nom, prenom
FROM ELEVE
WHERE id_eleve = SOME (
SELECT id_eleve
FROM ABSENCE
WHERE nb_heures > 2
);
Q17
SELECT el.nom, el.prenom
FROM ELEVE el
WHERE (
SELECT SUM(a.nb_heures)
FROM ABSENCE a
WHERE a.id_eleve = el.id_eleve
) > SOME (
SELECT SUM(nb_heures)
FROM ABSENCE
GROUP BY id_eleve
);
Q18
SELECT el.nom, el.prenom
FROM ELEVE el
WHERE el.id_eleve = SOME (
SELECT a.id_eleve
FROM ABSENCE a
JOIN COURS c ON c.id_cours = a.id_cours
WHERE c.libelle LIKE '%Math%'
);
Partie F – INSERT
Q19
INSERT INTO ELEVE (id_eleve, matricule, nom, prenom, date_naissance, classe)
VALUES (1, 'MAT001', 'NGOMA', 'Lina', '2010-05-12', '3A');
Q20
INSERT INTO ENSEIGNANT (id_ens, nom, prenom, email)
VALUES (1, 'KAMGA', 'Jean', 'jean.kamga@school.com');
Q21
INSERT INTO COURS (id_cours, libelle, classe, id_ens)
VALUES (1, 'Mathématiques', '3A', 1);
Q22
INSERT INTO ABSENCE (id_abs, id_eleve, id_cours, date_abs, nb_heures, motif, justifie)
VALUES (1, 1, 1, '2026-01-15', 2, 'maladie', 0);
Partie G – UPDATE / DELETE
Q23
UPDATE ABSENCE
SET justifie = 1
WHERE id_abs = 1;
Q24
UPDATE ELEVE
SET classe = '3B'
WHERE id_eleve = 1;
Q25
DELETE FROM ABSENCE
WHERE id_abs = 1;
Q26 (intégrité référentielle)
DELETE FROM ABSENCE
WHERE id_cours = 1;
DELETE FROM COURS
WHERE id_cours = 1;