TD avec solution Manipulation de données Le langage SQL - Mo

Ce document de Travaux Dirigés est spécifiquement conçu pour les étudiants de niveau Licence. Il a pour objectif de développer et de consolider leurs compétences en manipulation de données en utilisant le langage SQL, dans le cadre d'un système de gestion de la scolarité universitaire.

Il aborde, au travers d'exercices pratiques, les concepts clés de SQL, notamment :

  • La sélection et le filtrage de données.
  • Les jointures entre tables et les fonctions d'agrégation.
  • Le regroupement de données et les sous-requêtes.
TD avec solution Manipulation de données Le langage SQL - Mo

Modélisation Merise : TD avec solution Manipulation de données Le langage SQL

Télécharger PDF

Gestion de la Scolarité Universitaire : Exercices Pratiques en SQL

Ce document présente une série d'exercices pratiques visant à manipuler des données universitaires à l'aide du langage SQL. Le niveau de difficulté correspond à celui d'une licence, idéal pour renforcer la compréhension des concepts fondamentaux des bases de données relationnelles et des requêtes SQL.

Contexte : Schéma Relationnel de la Scolarité

Nous travaillons avec le schéma relationnel suivant, représentant une base de données simplifiée pour la gestion de la scolarité universitaire :

  • Etudiant (CNE, Nom, DateNaiss, Niveau, Adresse, Ville)

    Clé primaire : CNE (Code National de l'Étudiant)

  • Enseignant (NomEns, Fonction)

    Clé primaire : NomEns

  • Module (CodeMod, Titre, NomEns_Responsable)

    Clé primaire : CodeMod. NomEns_Responsable est une clé étrangère vers Enseignant(NomEns).

  • FiliereModule (Filiere, CodeMod)

    Clé primaire composée : (Filiere, CodeMod). CodeMod est une clé étrangère vers Module(CodeMod).

  • Intervient (CodeMod, NomEns)

    Clé primaire composée : (CodeMod, NomEns). Indique qu'un enseignant enseigne un module. CodeMod est une clé étrangère vers Module(CodeMod). NomEns est une clé étrangère vers Enseignant(NomEns).

  • Exam (CNE, CodeMod, Note1)

    Clé primaire composée : (CNE, CodeMod). Enregistre les notes d'examen pour les étudiants. CNE est une clé étrangère vers Etudiant(CNE). CodeMod est une clé étrangère vers Module(CodeMod).

  • Oral (CNE, CodeMod, Note2)

    Clé primaire composée : (CNE, CodeMod). Enregistre les notes d'oral pour les étudiants. CNE est une clé étrangère vers Etudiant(CNE). CodeMod est une clé étrangère vers Module(CodeMod).

  • Seance (CodeMod, Jour, Heure, Salle)

    Clé primaire composée : (CodeMod, Jour, Heure, Salle). Décrit les séances de cours. CodeMod est une clé étrangère vers Module(CodeMod).

  • OccupationSalle (NomEns, Jour, Heure, Salle)

    Clé primaire composée : (NomEns, Jour, Heure, Salle). Décrit les occupations de salles par les enseignants. NomEns est une clé étrangère vers Enseignant(NomEns).

Travaux Pratiques : Requêtes SQL

Répondez aux questions suivantes en écrivant les requêtes SQL appropriées. Les solutions sont fournies à titre indicatif et expliquées pour faciliter la compréhension.

Question 1 : Étudiants de niveau 3

Donnez la liste de tous les étudiants inscrits au niveau 3.

SELECT *
FROM Etudiant
WHERE Niveau = 3;

Question 2 : Étudiants résidant dans une ville spécifique

Donnez le nom des étudiants qui habitent à Casablanca.

SELECT Nom
FROM Etudiant
WHERE Ville = "Casablanca";

Note : Remplacez "Casablanca" par la ville de votre choix.

Question 3 : Enseignants occupant une salle un jour donné

Donnez le nom des enseignants distincts qui occupent la salle 4 le lundi.

SELECT DISTINCT NomEns
FROM OccupationSalle
WHERE (Salle = 4) AND (Jour = "Lundi");

Question 4 : Salles avec cours les lundis ou jeudis

Donnez les salles où il y a des cours le lundi ou le jeudi.

SELECT Salle
FROM Seance
WHERE (Jour = "Lundi") OR (Jour = "Jeudi");

Question 5 : Étudiants ayant passé un examen spécifique

Donnez le nom des étudiants ayant passé l'examen en "Programmation" ou dans le module de code 6.

SELECT E.Nom
FROM Etudiant E, Exam X, Module M
WHERE (E.CNE = X.CNE)
  AND (X.CodeMod = M.CodeMod)
  AND ((M.CodeMod = 6) OR (M.Titre = "Programmation"));

Note : Cette requête sélectionne les étudiants ayant passé un examen dans le module identifié par le code 6 OU dans un module dont le titre est "Programmation".

Question 6 : Filière associée à un module spécifique

Donnez le nom de la filière comportant le module de code 8.

SELECT Filiere
FROM FiliereModule
WHERE CodeMod = 8;

Correction : Le code module 8 est utilisé ici, conformément à la question.

Question 7 : Filière associée à un module par titre

Donnez le nom de la filière comportant le module de titre "Informatique de gestion".

SELECT FM.Filiere
FROM FiliereModule FM, Module M
WHERE FM.CodeMod = M.CodeMod
  AND M.Titre = "Informatique de gestion";

Correction : Les alias de table ont été utilisés pour plus de clarté et les guillemets manquants ajoutés.

Question 8 : Étudiants avec une bonne note dans un module

Donnez le nom des étudiants ayant obtenu une note supérieure à 12 dans le module de titre "Informatique de gestion".

SELECT E.Nom
FROM Etudiant E, Exam X, Module M
WHERE (E.CNE = X.CNE)
  AND (X.CodeMod = M.CodeMod)
  AND (X.Note1 > 12)
  AND (M.Titre = "Informatique de gestion");

Correction : L'opérateur de comparaison `>` a été rétabli et les guillemets manquants autour du titre du module ont été ajoutés.

Question 9 : Nombre d'étudiants ayant passé un oral

Donnez le nombre d'étudiants distincts qui ont passé un oral.

SELECT COUNT(DISTINCT CNE)
FROM Oral;

Question 10 : Meilleure note à un examen de module

Donnez la meilleure note de l'examen du module 2.

SELECT MAX(Note1)
FROM Exam
WHERE CodeMod = 2;

Question 11 : Étudiants ayant la meilleure note à un examen de module

Donnez le nom des étudiants qui ont obtenu la meilleure note à l'examen du module 2.

SELECT E.Nom
FROM Etudiant E, Exam X
WHERE (E.CNE = X.CNE)
  AND (X.CodeMod = 2)
  AND X.Note1 = (SELECT MAX(Note1)
                 FROM Exam
                 WHERE CodeMod = 2);

Note : Cette requête utilise une sous-requête pour d'abord trouver la note maximale du module 2, puis sélectionne les étudiants dont la note correspond à cette valeur.

Question 12 : Filières avec plus de 4 modules

Donnez la liste des filières comprenant plus de 4 modules.

SELECT Filiere
FROM FiliereModule
GROUP BY Filiere
HAVING COUNT(*) > 4;

Note : La clause `GROUP BY` regroupe les modules par filière, et `HAVING` filtre ces groupes pour ne retenir que ceux qui contiennent plus de 4 modules.

Question 13 : Nombre de salles avec plus de 4 séances

Donnez le nombre de salles comportant plus de 4 séances.

-- Étape 1 : Identifier les salles ayant plus de 4 séances
-- (Ceci peut impliquer une table temporaire ou une vue selon le SGBD)
/* CREATE TEMPORARY TABLE SallesPlusDe4Seances AS
SELECT Salle
FROM Seance
GROUP BY Salle
HAVING COUNT(*) > 4; */

-- Étape 2 : Compter le nombre de ces salles
SELECT COUNT(DISTINCT Salle)
FROM Seance
GROUP BY Salle
HAVING COUNT(*) > 4;

Note : L'approche originale en deux étapes est condensée ici en une seule requête pour obtenir le nombre de salles directement, ce qui est généralement plus efficace. Si une table temporaire était requise par l'environnement d'origine, la syntaxe pourrait varier.

Question 14 : Moyenne générale des étudiants aux examens

Donnez la moyenne générale de chaque étudiant à l'examen.

SELECT E.CNE, E.Nom, AVG(X.Note1) AS MoyenneGenerale
FROM Etudiant E, Exam X
WHERE E.CNE = X.CNE
GROUP BY E.CNE, E.Nom;

Correction : Le mot clé `SELECT` a été corrigé. La clause `GROUP BY` est essentielle ici pour calculer la moyenne par étudiant.

FAQ sur la Manipulation de Données SQL

Q1 : Pourquoi utiliser DISTINCT dans une requête SQL ?

R1 : Le mot-clé DISTINCT est utilisé pour éliminer les lignes dupliquées d'un ensemble de résultats. Par exemple, si plusieurs enseignants occupent la même salle le même jour, SELECT DISTINCT NomEns ne retournera le nom de l'enseignant qu'une seule fois, assurant l'unicité des résultats.

Q2 : Quelle est la différence entre WHERE et HAVING ?

R2 : La clause WHERE est utilisée pour filtrer les lignes individuelles d'une table avant que toute agrégation (comme COUNT ou AVG) ne soit effectuée et avant le regroupement par GROUP BY. La clause HAVING, en revanche, est utilisée pour filtrer des groupes de lignes après qu'ils ont été créés par GROUP BY et que les fonctions d'agrégat ont été calculées. Elle agit comme un WHERE pour les groupes.

Q3 : Quand doit-on utiliser les alias de table (par exemple, E pour Etudiant) ?

R3 : Les alias de table sont recommandés lorsque vous travaillez avec plusieurs tables dans une requête (lors de jointures) ou lorsque le nom de la table est long. Ils améliorent la lisibilité de la requête et sont essentiels pour distinguer les colonnes de même nom provenant de différentes tables (par exemple, E.CNE vs X.CNE) pour éviter toute ambiguïté.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne