Vous êtes sur la page 1sur 3

EFREI - L3/L’3/L3A Année : 2009/2010 2.

Modèle Logique de Données relationnel (MLD-R) :


A. Lahlou TD Bases de Données Le schéma relationnel (MLD) correspondant au MCD précédent est représenté par les tables ci-
dessous :
TD-3 : Gestion Ecole
ELEVES(NUM_ELEVE, NOM, PRENOM, DATE_NAISSANCE, POIDS, ANNEE)
Soit l'exemple de gestion d'une école dont le schéma conceptuel de données (Modèle Conceptuel COURS(NUM_COURS, NOM, NBHEURES, ANNEE)
de Données : MCD), selon le modèle Entité-Association (EA), est le suivant : PROFESSEURS(NUM_PROF, NOM, SPECIALITE, DATE_ENTREE, DER_PROM, SALAIRE_BASE,
SALAIRE_ACTUEL)
ELEVES ACTIVITES (NIVEAU,NOM , EQUIPE)
num_eleve COURS
nom num_cours RESULTATS(NUM_ELEVE, NUM_COURS, POINTS )
0,n RESULTATS
prenom nom CHARGE(NUM_PROF, NUM_COURS)
points 0,n nbheures ACTIVITES_PRATIQUEES(NUM_ELEVE, NIVEAU, NOM)
date_naissance
poids annee
annee
0,n
Schéma relationnel de la BD Ecole
0,n

ACTIVITES_PRATIQUEES CHARGE Le script SQL, généré automatiquement par un outil d’aide tel que PowerAMC Designer,
correspondant à ce schéma conceptuel est donné ci-dessous :

0,n
 Les tables qui correspondent aux types d’entités dans le schéma conceptuel EA sont :
0,n
ACTIVITES PROFESSEURS
CREATE TABLE ELEVES
nom num_prof
( NUM_ELEVE NUMBER(6) NOT NULL,
niveau nom
NOM VARCHAR2(25) NOT NULL,
equipe specialite
date_entree PRENOM VARCHAR2(25) NOT NULL,
der_prom DATE_NAISSANCE DATE NOT NULL,
salaire_base POIDS NUMBER(5,2),
salaire_actuel ANNEE NUMBER(1),
CONSTRAINT PK_ELEVES PRIMARY KEY (NUM_ELEVE) );
Schéma Conceptuel de Données EA de la BD Ecole CREATE TABLE COURS
( NUM_COURS NUMBER(2) NOT NULL,
NOM VARCHAR2(20) NOT NULL,
1. Traduisez ce schéma conceptuel EA en diagramme de classes UML. NBHEURES NUMBER(2),
Entity Relationship Entity Relationship ANNEE NUMBER(1),
⇒ UML ⇒ UML
CONSTRAINT PK_COURS PRIMARY KEY (NUM_COURS) );
Entity Object Domain Domain constraint
Entity type Class Key Key constraint
CREATE TABLE PROFESSEURS
Relationship Object Constraint Constraint
( NUM_PROF NUMBER(4) NOT NULL,
Relationship type Class Cardinality Multiplicity/Cardinality
NOM VARCHAR2(25) NOT NULL,
Attribute/Property Property 0,1 1,1 0,n 1,n a,b a,a 0..1 1 0..* 1..* a..b a
SPECIALITE VARCHAR2(20),
Role / Label Role ER diagram UML Class diagram
DATE_ENTREE DATE,
Method
DER_PROM DATE,
Researcher Laboratory SALAIRE_BASE NUMBER(6,2),
Team
RNum Affected Belongs LNum SALAIRE_ACTUEL NUMBER(6,2),
TNum
RName 1,1 1,n TName 1,1 1,n LName CONSTRAINT PK_PROFESSEURS PRIMARY KEY (NUM_PROF) );
Speciality LUniversity

CREATE TABLE ACTIVITES


Figure 1 : Modèle Conceptuel de Données (MCD) ( NIVEAU NUMBER(1) NOT NULL,
NOM VARCHAR2(20) NOT NULL,
EQUIPE VARCHAR2(30),
Researcher Team Laboratory
1..* 1 1..* 1 CONSTRAINT PK_ACTIVITES PRIMARY KEY (NIVEAU, NOM) );
RNum TNum LNum
RName TName LName
Speciality Affected Belongs LUniversity

Figure 2 : Diagramme de classes UML


1/5 2/5
 Les tables qui correspondent aux types d’associations dans le schéma conceptuel EA sont : 2.3. Créer une nouvelle table AGGLOMERATION dont le schéma est le suivant :

CREATE TABLE RESULTATS AGGLOMERATION(CP, VILLE)


( NUM_ELEVE NUMBER(6) NOT NULL, Définissez la contrainte « Le nom de la ville devra être en MAJUSCULE ».
NUM_COURS NUMBER(2) NOT NULL,
POINTS NUMBER(4,2), 2.4. Remplacer cette nouvelle table AGGLOMERATION avec des données correctes :
CONSTRAINT PK_RESULTATS PRIMARY KEY (NUM_ELEVE, NUM_COURS) ); Attention : EPINAY / seine est une chaîne de caractères différente de EPINAY SUR SEINE
CREATE TABLE CHARGE CP Ville
( NUM_PROF NUMBER(4) NOT NULL, 75001 PARIS
NUM_COURS NUMBER(2) NOT NULL,
75013 PARIS
CONSTRAINT PK_CHARGE PRIMARY KEY (NUM_COURS, NUM_PROF) );
93800 EPINAY SUR SEINE
CREATE TABLE ACTIVITES_PRATIQUEES 93430 Villetaneuse
( NUM_ELEVE NUMBER(6) NOT NULL, 91000 EPINAY SUR ORGE
NIVEAU NUMBER(1) NOT NULL, Etc…
NOM VARCHAR2(20) NOT NULL,
CONSTRAINT PK_ACTIVITES_PRATIQUEES PRIMARY KEY (NUM_ELEVE, NIVEAU, NOM) ); INSERT INTO AGGLOMERATION (CODEPOSTAL, VILLE)
VALUES (75001, ‘PARIS’) ;
INSERT INTO AGGLOMERATION (CODEPOSTAL, VILLE)
 Attention : Il faut penser aux clés étrangères !!! VALUES (75013, ‘PARIS’) ;
ALTER TABLE RESULTATS 2.5. Mettre à jour la table des élèves. Utilisez une seule requête. Afficher son contenu corrigé.
ADD CONSTRAINT FK_RESULTAT_ELEVES FOREIGN KEY (NUM_ELEVE)
REFERENCES ELEVES (NUM_ELEVE) ; UPDATE Table1
SET AttributAMettreAJour = (SELECT Attribut FROM Table2
ALTER TABLE RESULTATS WHERE ConditionDeJointure);
ADD CONSTRAINT FK_RESULTAT_COURS FOREIGN KEY (NUM_COURS)
REFERENCES COURS (NUM_COURS) ; 3. Quelques fonctions SQL sous Oracle :
ALTER TABLE CHARGE  A la redécouverte de quelques fonctions SQL/Oracle
ADD CONSTRAINT FK_CHARGE_COURS FOREIGN KEY (NUM_COURS)
SELECT RPAD('Soleil',17,'bla') "RPAD exemple" FROM DUAL;
REFERENCES COURS (NUM_COURS) ;
SELECT LPAD('DESS EID',15,'*.') "LPAD exemple" FROM DUAL;
ALTER TABLE CHARGE
ADD CONSTRAINT FK_CHARGE_PROFESSEURS FOREIGN KEY (NUM_PROF) SELECT SUBSTR('DESS EID',6,3) "SUBSTR exemple" FROM DUAL;
REFERENCES PROFESSEURS (NUM_PROF) ; SELECT SUBSTR('ABCDEFGHIJ',-5,4) "SUBSTR exemple" FROM DUAL;
SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Now" FROM DUAL;
ALTER TABLE ACTIVITES_PRATIQUEES
ADD CONSTRAINT FK_ACTIVITESPR_ELEVES FOREIGN KEY (NUM_ELEVE) SELECT LENGTH('WEB WAREHOUSE') "Longueur en caractères" FROM DUAL;
REFERENCES ELEVES (NUM_ELEVE) ;
SELECT DECODE(ANNEE, 1, 'Première', 2, 'Seconde', 'Valeur différente de 1 et de 2 !!')
AS ANETUDE FROM ELEVES;
ALTER TABLE ACTIVITES_PRATIQUEES
ADD CONSTRAINT FK_ACTIVITESPR_ACTIVITE FOREIGN KEY (NOM, NIVEAU) SELECT NVL(SPECIALITE, 'Valeur NON renseignée') FROM PROFESSEURS;
REFERENCES ACTIVITES (NOM, NIVEAU) ; SELECT NVL(SPECIALITE, 'Valeur NON renseignée') AS SPEC_PROF FROM PROFESSEURS;

L’insertion des données se fera comme suit : SELECT ROUND(17.0958,1) "ROUND exemple" FROM DUAL;
INSERT INTO matable (attributs) VALUES (valeurs) ; SELECT ROUND(17.58,2) "ROUND exemple" FROM DUAL;

2.1. Modifier la structure de la table ELEVES. SELECT TRUNC(1958.0917,1) "TRUNC exemple" FROM DUAL;
SELECT TRUNC(1958.0917,2) "TRUNC exemple" FROM DUAL;
Ajoutez les attributs : SELECT ROUND(TO_DATE('17-SEP-2002'), 'YEAR') "New Year" FROM DUAL;
CodePostal de type numérique sur 5 positions, et
Ville de type caractère sur 20 positions SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;
SELECT ADD_MONTHS(SYSDATE,7) FROM DUAL;
2.2. Mettre à jour les adresses des ELEVES de N° 1, 2, 5 et 7 (respectivement) avec les
données suivantes : SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('19-JUN-2001'))) AS AGEBB FROM DUAL;

75013 ; paris SELECT TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))FROM DUAL;


93800 ; EPINAY / seine
93800 ; EPINAY SUR SEINE
91000 ; EPINAY / ORGE

3/5 4/5
4. Répondre aux requêtes ci-dessous :
1- Obtenir la liste des nom, prénom et date de naissance de tous les élèves.
2- Obtenir tous les renseignements sur toutes les activités.
3- Obtenir la liste des spécialités des professeurs.
4- Obtenir le nom et prénom des élèves pesant moins de 45 kilos et inscrits en 1ère année ou des
élèves inscrits en 2ème année.
5- Obtenir le nom des élèves dont le poids est compris entre 60 et 80 kilos.
6- Obtenir le nom des élèves dont le nom commence par L.
7- Obtenir le nom des professeurs dont la spécialité est inconnue.
8- Obtenir, pour chaque professeur, son nom et sa spécialité. Si cette dernière est inconnue, on
souhaite afficher la chaîne de caractères : ‘****’.
9- Quels sont les noms et prénoms des élèves qui pratiquent du surf au niveau 1.
10- Obtenir les paires de noms de professeurs qui ont la même spécialité.
11- Afficher les points de Tsuno obtenus dans chaque cours sur 100 plutôt que sur 20.
12- Obtenir le poids moyen des élèves de 1ère année.
13- Obtenir le total des points de l’élève numéro 3.
14- Obtenir la plus petite et la plus grande note de l’élève Brisefer.
15- Obtenir le nombre d’élèves inscrits en deuxième année.
16- Afficher l’âge moyen des élèves. Cet âge moyen sera exprimé en année.
17- Obtenir une liste des élèves classés par année et par ordre alphabétique.
18- Obtenir pour chaque élève de 1ère année son nom et sa moyenne.
19- Obtenir la moyenne des points de chaque élève de 1ère année dont le total des points est
supérieur à 40.
20- Quels sont les élèves de 1ère année dont la moyenne est supérieure à la moyenne de la 1ère
année ?
21- Obtenir le nom et le poids des élèves de 1ère année plus lourds que n’importe quel élève de 2ème
année.
22- Obtenir le nom et le poids des élèves de 1ère année plus lourds qu’un élève quelconque de 2ème
année.
23- Obtenir le nom, le poids et l’année des élèves dont le poids est supérieur au poids moyen des
élèves étant dans la même année d’études.
24- Obtenir le nom des professeurs qui ne donnent pas le cours numéro 1.
25- Obtenir le nom des élèves de 1ère année qui ont obtenu plus de 60 % et qui jouent au tennis.
26- Professeurs qui prennent en charge TOUS les cours de deuxième année ; on demande le
Numéro et le nom (Opération de Division).
TTITLE ' Profs prenant en charges TOUS les cours de 2 Années '
SELECT NUM_PROF, NOM
FROM PROFESSEURS
WHERE NOT EXISTS
(SELECT * FROM COURS WHERE ANNEE = 2
AND NOT EXISTS
(SELECT * FROM CHARGE
WHERE PROFESSEURS.NUM_PROF = CHARGE.NUM_PROF
AND CHARGE.NUM_COURS = COURS.NUM_COURS));

27- Elèves qui pratiquent TOUTES les activités ; on demande le Numéro et le nom.
5. Les vues :
La création d’objets Vues sous SQL se fait par la commande :
CREATE VIEW <nomvue> [(col_alias[col_alias] ...)] as SQL_QUERY;
5.1- Créer la vue ElevesAnnee1 contenant la liste des élèves de 1ère année.
5.2- Donner le classement des élèves de 1ère année par ordre de mérite
5.3- Donner la liste des activités pratiquées que par des élèves de 1ère année

5/5

Vous aimerez peut-être aussi