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.
// 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.
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.
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).
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.
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.
Crée les tables pour des étudiants, des cours et des inscriptions.
Ajoute des données et affiche les étudiants inscrits à "Mathématiques".
-- (voir version précédente)
Affiche les étudiants ayant une note supérieure ou égale à 12.
SELECT nom, prenom, note
FROM Etudiant
JOIN Inscription ON Etudiant.idEtudiant = Inscription.idEtudiant
WHERE note >= 12;
Comptez le nombre d’étudiants par cours.
SELECT intitule, COUNT(*) AS nbEtudiants
FROM Cours
JOIN Inscription ON Cours.idCours = Inscription.idCours
GROUP BY intitule;
Affiche les cours auxquels aucun étudiant n’est inscrit.
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
.
Afficher les noms et prénoms des étudiants inscrits à "Mathématiques".
π_{nom, prenom}(
σ_{intitule = 'Mathématiques'}(
Etudiant ⨝ Inscription ⨝ Cours
)
)
Afficher les cours suivis par l’étudiant "Durand".
π_{intitule}(
σ_{nom = 'Durand'}(
Etudiant ⨝ Inscription ⨝ Cours
)
)
Afficher les étudiants qui ont obtenu une note strictement inférieure à 10.
π_{nom, prenom}(
σ_{note < 10}(
Etudiant ⨝ Inscription
)
)
Représente la requête :
SELECT nom, prenom FROM Etudiant WHERE dateNaissance < '2002-01-01';
π_{nom, prenom}(
σ_{dateNaissance < '2002-01-01'}(
Etudiant
)
)
Arbre pour la requête :
SELECT nom FROM Etudiant WHERE nom LIKE 'M%';
π_{nom}(
σ_{nom LIKE 'M%'}(
Etudiant
)
)
Représente la requête suivante en arbre algébrique :
SELECT intitule FROM Cours WHERE volumeHoraire BETWEEN 20 AND 40;
π_{intitule}(
σ_{volumeHoraire ≥ 20 ∧ volumeHoraire ≤ 40}(
Cours
)
)
Afficher les employés travaillant sur un projet d’un client situé à Paris.
-- (voir version précédente)
Afficher les cours suivis uniquement par des étudiants nés après 2001.
SELECT DISTINCT intitule
FROM Cours
WHERE idCours IN (
SELECT idCours
FROM Inscription
WHERE idEtudiant IN (
SELECT idEtudiant FROM Etudiant WHERE dateNaissance > '2001-12-31'
)
);
Afficher les noms des étudiants inscrits à tous les cours disponibles.
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.