logo

Exercices Corrigés – Bases de Données & SQL


Modélisation – MCD et MLD

Exercice 1

Une bibliothèque gère les livres, les auteurs et les emprunts.
Un auteur peut avoir écrit plusieurs livres. Un lecteur peut emprunter plusieurs livres.

  1. Propose un MCD.
  2. Déduis le MLD associé.
Correction
// MCD (notation ASCII)
[Auteur]------<Ecrit>------[Livre]------<Emprunt>------[Lecteur]
 idAuteur                   idLivre                      idLecteur
 nom                        titre                        nom
                            genre                        email

// MLD
Auteur(idAuteur PK, nom)
Livre(idLivre PK, titre, genre, idAuteur FK)
Lecteur(idLecteur PK, nom, email)
Emprunt(idLivre PK, idLecteur PK, dateEmprunt)

Explication :
Modélisation des entités et relations, puis traduction en MLD avec clés primaires et étrangères.

Exercice 2

Une entreprise souhaite modéliser les salariés, les départements et les projets.
Chaque salarié appartient à un seul département mais peut travailler sur plusieurs projets.

Correction
Département(idDept PK, nomDept)
Salarié(idSalarié PK, nom, idDept FK)
Projet(idProjet PK, nomProjet)
TravailleSur(idSalarié PK, idProjet PK)

Explication :
On distingue une relation 1-N (Département–Salarié) et une relation N-M (Salarié–Projet).

Exercice 3

Modélise une plateforme de vidéos en ligne avec les entités suivantes : Vidéo, Utilisateur, Commentaire.
Chaque utilisateur peut poster plusieurs vidéos et commenter plusieurs vidéos.

Correction
Utilisateur(idUser PK, nom, email)
Vidéo(idVideo PK, titre, datePublication, idUser FK)
Commentaire(idCom PK, contenu, dateCom, idUser FK, idVideo FK)

Explication :
Deux relations 1-N sont modélisées : Utilisateur–Vidéo et Utilisateur–Commentaire. Les commentaires sont liés à la fois aux vidéos et aux utilisateurs.


SQL – Création, insertion, interrogation

Exercice 4

Crée les tables pour des étudiants, des cours et des inscriptions.
Ajoute des données et affiche les étudiants inscrits à "Mathématiques".

Correction
-- (voir version précédente)

Exercice 5

Affiche les étudiants ayant une note supérieure ou égale à 12.

Correction
SELECT nom, prenom, note
FROM Etudiant
JOIN Inscription ON Etudiant.idEtudiant = Inscription.idEtudiant
WHERE note >= 12;

Exercice 6

Comptez le nombre d’étudiants par cours.

Correction
SELECT intitule, COUNT(*) AS nbEtudiants
FROM Cours
JOIN Inscription ON Cours.idCours = Inscription.idCours
GROUP BY intitule;

Exercice 7

Affiche les cours auxquels aucun étudiant n’est inscrit.

Correction
SELECT intitule
FROM Cours
WHERE idCours NOT IN (
  SELECT DISTINCT idCours FROM Inscription
);

Explication :
La sous-requête extrait les cours présents dans Inscription. On sélectionne les autres via NOT IN.


Algèbre relationnelle

Exercice 7

Afficher les noms et prénoms des étudiants inscrits à "Mathématiques".

Correction
π_{nom, prenom}(
  σ_{intitule = 'Mathématiques'}(
    Etudiant ⨝ Inscription ⨝ Cours
  )
)

Exercice 8

Afficher les cours suivis par l’étudiant "Durand".

Correction
π_{intitule}(
  σ_{nom = 'Durand'}(
    Etudiant ⨝ Inscription ⨝ Cours
  )
)

Exercice 9

Afficher les étudiants qui ont obtenu une note strictement inférieure à 10.

Correction
π_{nom, prenom}(
  σ_{note < 10}(
    Etudiant ⨝ Inscription
  )
)

Arbres algébriques

Exercice 10

Représente la requête :

SELECT nom, prenom FROM Etudiant WHERE dateNaissance < '2002-01-01';
Correction
π_{nom, prenom}(
  σ_{dateNaissance < '2002-01-01'}(
    Etudiant
  )
)

Exercice 11

Arbre pour la requête :

SELECT nom FROM Etudiant WHERE nom LIKE 'M%';
Correction
π_{nom}(
  σ_{nom LIKE 'M%'}(
    Etudiant
  )
)

Exercice 12

Représente la requête suivante en arbre algébrique :

SELECT intitule FROM Cours WHERE volumeHoraire BETWEEN 20 AND 40;
Correction
π_{intitule}(
  σ_{volumeHoraire ≥ 20 ∧ volumeHoraire ≤ 40}(
    Cours
  )
)

Requêtes complexes imbriquées

Exercice 13

Afficher les employés travaillant sur un projet d’un client situé à Paris.

Correction
-- (voir version précédente)

Exercice 14

Afficher les cours suivis uniquement par des étudiants nés après 2001.

Correction
SELECT DISTINCT intitule
FROM Cours
WHERE idCours IN (
  SELECT idCours
  FROM Inscription
  WHERE idEtudiant IN (
    SELECT idEtudiant FROM Etudiant WHERE dateNaissance > '2001-12-31'
  )
);

Exercice 15

Afficher les noms des étudiants inscrits à tous les cours disponibles.

Correction
SELECT nom, prenom
FROM Etudiant E
WHERE NOT EXISTS (
  SELECT idCours FROM Cours
  EXCEPT
  SELECT idCours FROM Inscription I WHERE I.idEtudiant = E.idEtudiant
);

Explication :
On utilise EXCEPT pour vérifier l’absence d’au moins un cours. Si aucun n’est exclu, l’étudiant est inscrit à tous.