Gestion des absences scolaires | SQL

Passage du schéma relationnel aux requêtes SQL

On considère une base de données relationnelle de gestion des absences scolaires. Le schéma relationnel ci-dessous a été obtenu après le passage du schéma Entité-Association (EA) au modèle relationnel, conformément aux règles vues en cours.

Schéma relationnel

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)
    

Hypothèses de gestion

  • Un élève peut avoir plusieurs absences.
  • Un cours peut enregistrer plusieurs absences.
  • Une absence concerne un seul élève et un seul cours.
  • Un enseignant peut assurer plusieurs cours.
  • Chaque cours est assuré par un seul enseignant.

QUESTIONS

Partie A – Requêtes de base (SELECT)

  1. Q1. Afficher la liste de tous les élèves (nom, prénom, classe), triée par classe puis par nom.
  2. Q2. Afficher la liste complète des absences (date, nombre d'heures, motif, justification).
  3. Q3. Afficher les cours avec leur libellé, la classe et le nom de l'enseignant responsable.

Partie B – Filtrage avec WHERE et LIKE

  1. Q4. Afficher les élèves dont le nom commence par la lettre N.
  2. Q5. Afficher les enseignants dont l'email contient la chaîne @school.
  3. Q6. Afficher les absences dont le motif contient le mot mal.
  4. Q7. Afficher les cours dont le libellé contient le mot Math.

Partie C – Jointures

  1. Q8. Afficher la liste des absences avec :
    • le nom et le prénom de l'élève,
    • le libellé du cours,
    • la date de l'absence,
    • le nombre d'heures.
  2. Q9. Afficher toutes les absences des élèves appartenant à la classe 3A.

Partie D – Calculs et fonctions d'agrégation

  1. Q10. Calculer la moyenne du nombre d'heures d'absence par élève et afficher le résultat arrondi à deux décimales à l'aide de la fonction ROUND.
  2. Q11. Calculer le nombre total d'heures d'absence par élève.
  3. Q12. Afficher les trois élèves ayant le plus grand nombre d'heures d'absence.
  4. Q13. Calculer le nombre d'absences par cours.
  5. Q14. Calculer la moyenne du nombre d'heures d'absence par classe.
  6. Q15. Afficher les élèves ayant plus de 10 heures d'absence au total.

Partie E – Sous-requêtes avec SOME / ANY

  1. Q16. Afficher les élèves ayant au moins une absence de plus de 2 heures en utilisant l'opérateur SOME.
  2. Q17. Afficher les élèves dont le total d'heures d'absence est supérieur à celui d'au moins un autre élève (utiliser SOME).
  3. Q18. Afficher les élèves absents dans au moins un cours dont le libellé contient Math, à l'aide d'une sous-requête avec SOME.

Partie F – Manipulation des données

  1. Q19. Insérer un nouvel élève dans la base de données.
  2. Q20. Insérer un nouvel enseignant.
  3. Q21. Insérer un cours assuré par un enseignant existant.
  4. Q22. Insérer une absence pour un élève donné.

Partie G – Mise à jour et suppression

  1. Q23. Mettre à jour une absence afin de la marquer comme justifiée.
  2. Q24. Modifier la classe d'un élève.
  3. Q25. Supprimer une absence erronée.
  4. Q26. Supprimer un cours en respectant l'intégrité référentielle.

Solution :

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
  • SOMEau 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;

Voir Aussi :

Teacher 3


 

Exercice BD La Banque

Soit le schéma de base de donnée relationnel suivant d'une Banque:
AGENCE (Num_Agence, Nom, Ville, Actif)......

EXERCICE BD CARNET DE VOYAG

Soit la relation suivante, donnée avec une couverture minimale de ses DFE :CarnetDeVoyage (numAuteur.....

Exercice BD La Gestions Des

Soit une université

EXERCICE BD FICHE TD

Exercice 1: Mr kenfack Alain Paulin vous demande de Construire le modèle Entité-Association relatif aux informations suivantes .....

 

voir plus

 

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam