Vous êtes sur la page 1sur 8

Génie Informatique

2ème année - Semestre 3


2023 | 2024

Base de Données Avancées


Travaux Pratique 3

On souhaite créer une base de données pour représenter les notes obtenues par des
étudiants à différents examens. Chaque étudiant est inscrit à exactement un cursus, où
chaque cursus est associé à un responsable. Dans chaque cursus, plusieurs examens sont
planifiés, chacun avec le même coefficient. Chaque étudiant obtient une note pour chaque
examen, laquelle est comprise entre 0 et 20.
Pour modéliser cette situation, nous avons défini les tables suivantes :
Table Enseignant : La table Enseignant contient des informations sur les enseignants, tels
que leur identifiant (id), nom, prénom et spécialité. Chaque enseignant peut être associé à
plusieurs cursus en tant que responsable.
Table Cursus : La table Cursus représente les cursus auxquels les étudiants sont inscrits.
Chaque cursus a un identifiant unique (id), un nom (unique), et est lié à un enseignant
responsable grâce à l'identifiant responsable_id. La clé étrangère responsable_fk assure que
l'enseignant responsable existe dans la table Enseignant.
Table Etudiant : La table Etudiant enregistre les détails des étudiants, tels que l'INE
(identifiant unique), nom, prénom et le cursus auquel ils sont inscrits. L'attribut cursus_id est
une clé étrangère liée à l'identifiant unique des cursus dans la table Cursus.
Table Examens : La table Examens représente les différents examens planifiés dans chaque
cursus. Chaque examen a un identifiant unique (examen_id), une matière et est associé à un
cursus via l'attribut cursus_id. La contrainte curs_Examen_fk garantit que le cursus auquel
l'examen est associé existe dans la table Cursus.
Table Note : La table Note stocke les notes obtenues par les étudiants à chaque examen. Elle
utilise les identifiants des étudiants (etudiant_id) et des examens (examen_id) en tant que clés
primaires composées. La note est soumise à une contrainte CHECK pour s'assurer qu'elle est
comprise entre 0 et 20. Les clés étrangères et les contraintes etudiant_fk et examen_fk
garantissent que les références croisées aux tables Etudiant et Examens sont valides.
Table SalleExamen : La table SalleExamen contient des informations sur les salles d'examen,
comme leur identifiant (id), leur nom et leur capacité.
Table ExamenSalle : La table ExamenSalle associe des salles d'examen à des examens
spécifiques. Elle utilise les identifiants des examens (examen_id) et des salles (salle_id)
comme clés primaires composées. La contrainte examen_ES_fk garantit que l'examen auquel

A.Bakki 1/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

la salle est associée existe dans la table Examens, et la contrainte salle_fk assure que la salle
référencée existe dans la table SalleExamen.

Interrogations

1. Classer tous les étudiants dans l’ordre alphabétique (nom puis prénom).

SELECT * FROM Etudiant


ORDER BY nom, prenom ;
2. Noms des matières et du cursus dans lequel Bensaid Hassan est inscrit.

SELECT DISTINCT c.nom, Ex.matiere


FROM Etudiant AS e
JOIN Cursus AS c ON e.cursus_id = c.id
JOIN Examens AS Ex ON c.id = Ex.cursus_id
WHERE e.nom = 'Bensaid' AND e.prenom = 'Hassan';

3. Noms, Cursus et les Notes de tous les étudiants.

SELECT e.nom, e.prenom, c.nom AS cursus, Ex.matiere, N.note


FROM Etudiant AS e
JOIN Cursus AS c ON e.cursus_id = c.id
JOIN Examens AS Ex ON c.id = Ex.cursus_id
LEFT JOIN Note AS N ON e.ine = N.etudiant_id AND Ex.examen_id = N.examen_id;

4. calculer la moyenne obtenue par étudiant pour chaque cursus

SELECT e.nom, e.prenom, c.nom AS cursus, AVG(N.note) AS moyenne


FROM Etudiant AS e
JOIN Cursus AS c ON e.cursus_id = c.id
JOIN Note AS N ON e.ine = N.etudiant_id
GROUP BY e.ine, c.nom, e.nom, e.prenom;
5. Les noms et les notes des étudiants à l’examen de Bases de Données en Licence pro.

SELECT e.nom, e.prenom, N.note


FROM Etudiant AS e
JOIN Cursus AS c ON e.cursus_id = c.id
JOIN Examens AS Ex ON c.id = Ex.cursus_id
JOIN Note AS N ON Ex.examen_id = N.examen_id
WHERE c.nom = 'Licence Pro' AND Ex.matiere = 'BD';
6. Les noms étudiants dont toutes les notes sont au dessus de 10 - proposez 3 solutions.

SELECT nom

A.Bakki 2/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

FROM Etudiant
WHERE NOT EXISTS (
SELECT *
FROM Note
WHERE Note.etudiant_id = Etudiant.ine AND Note.note < 10
);

SELECT nom
FROM Etudiant
WHERE ine NOT IN (
SELECT etudiant_id
FROM Note
WHERE note < 10
);

SELECT nom
FROM Etudiant
WHERE 10 <= ALL (
SELECT note
FROM Note
WHERE etudiant_id = Etudiant.ine
);

7. La meilleure note obtenue, le nom de la matière dans laquelle elle a été obtenue, et le
nom de l’étudiant.

SELECT MAX(N.note) AS meilleure_note, Ex.matiere, E.nom AS nom_etudiant,


E.prenom AS prenom_etudiant
FROM Note AS N
JOIN Etudiant AS E ON N.etudiant_id = E.ine
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
GROUP BY Ex.matiere, E.nom, E.prenom
ORDER BY meilleure_note DESC
LIMIT 1;

8. Noms des étudiants suivant un cursus contenant la matière POO.

SELECT DISTINCT E.nom, E.prenom


FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
JOIN Examens AS Ex ON C.id = Ex.cursus_id
WHERE Ex.matiere = 'POO';

A.Bakki 3/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

9. Les noms des étudiants qui ont toutes leurs notes au dessous de 10.

SELECT DISTINCT E.nom, E.prenom


FROM Etudiant AS E
WHERE NOT EXISTS (
SELECT 1
FROM Note AS N
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
WHERE N.etudiant_id = E.ine AND N.note >= 10
);
10. Les noms et prénoms des étudiants qui ont 10 (ou plus) en BD et qui ont (au moins) une
note au dessous de 10.

SELECT DISTINCT E.nom, E.prenom


FROM Etudiant AS E
JOIN Note AS N1 ON E.ine = N1.etudiant_id
JOIN Examens AS Ex1 ON N1.examen_id = Ex1.examen_id
WHERE Ex1.matiere = 'BD'
AND N1.note >= 10
AND E.ine IN (
SELECT N2.etudiant_id
FROM Note AS N2
JOIN Examens AS Ex2 ON N2.examen_id = Ex2.examen_id
WHERE Ex2.matiere != 'BD' AND N2.note < 10 );

11. Les étudiants de Licence Pro ayant obtenu la note la plus élevé parmi tout les étudiants.

SELECT E.nom
FROM Etudiant AS E
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON Ex.examen_id = N.examen_id
JOIN Cursus AS C ON C.id = E.cursus_id
WHERE C.nom = 'Licence Pro'
AND N.note >= ALL (SELECT note FROM Note WHERE etudiant_id = E.ine);

12. Insérer dans la table Etudiant

INSERT INTO Etudiant (ine, nom, prenom, cursus_id)


VALUES (33, 'El Bakkali', 'Youssef', (SELECT id FROM Cursus WHERE nom = 'Licence
Pro'));

INSERT INTO Etudiant (ine, nom, prenom, cursus_id)


VALUES (29, 'El Khattab', 'Fatima', (SELECT id FROM Cursus WHERE nom = 'DUT'));

A.Bakki 4/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

13. Afficher les noms, et les prénoms de tous les étudiants, et pour ceux qui ont passé des
examens les notes obtenues et le numéro d’examen.

SELECT E.nom, E.prenom, N.note, Ex.examen_id


FROM Etudiant AS E
LEFT JOIN Note AS N ON E.ine = N.etudiant_id
LEFT JOIN Examens AS Ex ON N.examen_id = Ex.examen_id;
14. Modifier la requête précédente pour afficher les noms, et les prénoms de tous les
étudiants, et pour ceux qui ont passé des examens les notes > 10.

15. Afficher les nom des étudiants et la filière qui ont passé l’examen BD et qui ont obtenu
la moyenne.

SELECT E.nom, E.prenom, C.nom AS filiere


FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
WHERE Ex.matiere = 'BD'
GROUP BY E.nom, E.prenom, C.nom
HAVING AVG(N.note) >= 10;
16. Afficher les nom des étudiants et la filière qui ont passé l’examen BD et qui ont obtenu
la moyenne de la filière

SELECT E.nom, E.prenom, C.nom AS filiere


FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
WHERE Ex.matiere = 'BD'
AND N.note >= ALL (
SELECT AVG(N2.note)
FROM Note AS N2
JOIN Examens AS Ex2 ON N2.examen_id = Ex2.examen_id
JOIN Cursus AS C2 ON Ex2.cursus_id = C2.id
WHERE C2.id = C.id
GROUP BY C2.id
);
17. Les noms de matières et de cursus dans lesquels au moins 2 étudiants ont une note en-
dessous de la moyenne

SELECT Ex.matiere, C.nom AS cursus

A.Bakki 5/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

FROM Examens AS Ex
JOIN Cursus AS C ON Ex.cursus_id = C.id
JOIN Note AS N ON Ex.examen_id = N.examen_id
WHERE N.note < (
SELECT AVG(N2.note)
FROM Note AS N2
WHERE N2.examen_id = Ex.examen_id
)
GROUP BY Ex.matiere, C.nom
HAVING COUNT(DISTINCT N.etudiant_id) >= 2;
18. Nombre d’examens en DUT.

SELECT COUNT(*) AS nombre_examens_dut


FROM Examens AS Ex
JOIN Cursus AS C ON Ex.cursus_id = C.id
WHERE C.nom = 'DUT';
19. Classer les étudiants (afficher nom et note) dans l’ordre décroissant de leur note en BD.

SELECT E.nom, E.prenom, N.note


FROM Etudiant AS E
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
WHERE Ex.matiere = 'BD'
ORDER BY N.note DESC;
20. Les noms et prénoms des étudiants de Licence pro qui ont une note en BD supérieure
à la moyenne (de l’examen de BD de Licence pro).

SELECT E.nom, E.prenom


FROM Etudiant AS E
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
JOIN Cursus AS C ON E.cursus_id = C.id
WHERE C.nom = 'Licence Pro' AND Ex.matiere = 'BD' AND N.note > (
SELECT AVG(N2.note)
FROM Note AS N2
JOIN Examens AS Ex2 ON N2.examen_id = Ex2.examen_id
WHERE Ex2.matiere = 'BD' AND Ex2.cursus_id = C.id
);
21.

22. Pour chaque étudiant, son nom, sa filière le nombre d’examen passé et la moyenne
générale obtenue.

SELECT E.nom, E.prenom, C.nom AS filiere, COUNT(DISTINCT Ex.examen_id) AS


nombre_examens, AVG(N.note) AS moyenne_generale

A.Bakki 6/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
LEFT JOIN Note AS N ON E.ine = N.etudiant_id
LEFT JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
GROUP BY E.nom, E.prenom, C.nom;
23. En utilisant l’opérateur EXEPT, Afficher les étudiants en Licence Pro.

SELECT nom, prenom


FROM Etudiant
EXCEPT
SELECT E.nom, E.prenom
FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
WHERE C.nom = 'Licence Pro';

24. Afficher une phrase pour chaque examen indiquant le nom et le prénom de l'étudiant,
la matière de l'examen, et le nombre de jours écoulés depuis la date de l'examen jusqu'à
aujourd'hui.

SELECT concat(E.nom, " " ,E.prenom, " a passé l'examen de ", Ex.matiere, " il y a " ,
EXTRACT(DAY FROM CURRENT_DATE) - EXTRACT(DAY FROM ES.date_examen), "
jours")
FROM Etudiant AS E
JOIN Cursus AS C ON E.cursus_id = C.id
JOIN Note AS N ON E.ine = N.etudiant_id
JOIN Examens AS Ex ON N.examen_id = Ex.examen_id
JOIN ExamenSalle AS ES ON Ex.examen_id = ES.examen_id;

25. Afficher, pour chaque examen, la matière, le nom de la salle, la durée totale de l'examen
en heures, et le nombre d'étudiants distincts ayant passé l'examen.

SELECT
ExSalle.examen_id,
Ex.matiere,
SE.nom AS nom_salle,
EXTRACT(HOUR FROM ExSalle.heure_fin) - EXTRACT(HOUR FROM
ExSalle.heure_debut) AS duree_totale_heures,
COUNT(DISTINCT N.etudiant_id) AS nombre_etudiants_passes
FROM
Examens AS Ex
JOIN
ExamenSalle AS ExSalle ON Ex.examen_id = ExSalle.examen_id
JOIN
A.Bakki 7/8
Génie Informatique
2ème année - Semestre 3
2023 | 2024

Note AS N ON Ex.examen_id = N.examen_id


JOIN
SalleExamen AS SE ON ExSalle.salle_id = SE.id
GROUP BY
ExSalle.examen_id, Ex.matiere, nom_salle;

A.Bakki 8/8

Vous aimerez peut-être aussi