Académique Documents
Professionnel Documents
Culture Documents
Exercices normalisation :
Exercice 1 :
Les problèmes que peuvent avoir une relation non normalisée sont :
Cette relation n’est pas en 2FN. Décrire comment les problèmes cités ci-dessus peuvent survenir
sur cette relation ?
Corrigé :
Problème de redondance des données : s’il existe 100 produits pour un même
fournisseur, on aura une redondance de 100 fois du nom, de l’adresse et du tél dy
fournisseur.
Problème de mise à jour pour les insertions : si on veut ajouter un nouveau produit il
faut ajouter une nouvelle occurrence de NumF.
Problème lors des suppressions : Si on supprime, momentanément, la liste des
produits d’un fournisseur, alors on supprime aussi les informations liées à ce
fournisseur.
Problème de mise à jour des tuples : si un fournisseur change d’adresse ou de
téléphone il faut faire cette m-à-j sur tous les n tuples.
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
Questions :
2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.
3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils
participent.
4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du
14/09/96.
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
Questions :
2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse ?
3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la moyenne
générale de la promotion ?
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *
Questions :
1 - Quelle est la composition de l'équipe Festina (Numéro, nom et pays des coureurs) ?
3 - Quel est le nombre de kilomètres total des étapes de type "Haute Montagne" ?
4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps des
coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été intégrées dans les
temps réalisés à chaque étape ?
Exercice 3
*Quels sont les médicaments (libellé) prescrits par des médecins généralistes ?
R1=Projection(Médecin,Numed,Grade)
R2=Jointure(Prescrit,R1,Prescrit.Numed=R1.Numed)
R=Projection[ Jointure(R2,Médicament,R2.Code=Médicament.Code) , Libellé ]
*Quels sont les Patients traités par des médecins généralistes et des médecins spécailistes?
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
1R1=Selection [ Projection(Médecin,Numed,Grade) , Grade = 'généraliste' ou Grade ='spécialiste' ]
2 R2=Jointure(Prescrit,R1,Prescrit.Numed=R1.Numed)
R=Projection[ Jointure(R2,Patient,R2.Numpatient=Patient.Numpatient) ,Numpatient ]
3
*Quels sont les médicaments qui n’ont jamais été prescrits?
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
1R1=Projection(Médicament,Code)
2 R2=Projection(Prescrit,Code)
R=Difference(R1,R2)
3
*Quels sont les médecins (Numed, Nom) qui ne prescrivent jamais d’antibiotiques?
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
1R1=Jointure(Prescrit,Médicament,Prescrit.Code=Médicament.Code)
2 R2=Jointure(R1,Médecin,R1.Numed= Médecin.Numed)
R3=Selection(R2,Type='antibiothique')
3 R=Difference[ Projection(Médecin,Numed,Nom) , Projection(R3,Numed,Nom) ]
4
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
SELECT titre_représentation
FROM REPRESENTATION ;
2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.
R1 = SELECTION(REPRESENTATION, lieu="Opéra Bastille")
R2 = PROJECTION(R1, titre_représentation)
Et en langage SQL...
SELECT titre_représentation
FROM REPRESENTATION
WHERE lieu="Opéra Bastille" ;
3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils
participent.
R1 = JOINTURE(MUSICIEN, REPRESENTATION,
Musicien.n°représentation=Représentation.n°représentation)
R2 = PROJECTION(R1, nom, titre_représentation)
Et en langage SQL...
4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du
14/09/96.
R1 = SELECTION(PROGRAMMER, date=14/09/96)
R2 = JOINTURE(R1, REPRESENTATION,
R1.n°représentation=Représentation.n°représentation)
R3 = PROJECTION(R2, titre_représentation, lieu, tarif)
Et en langage SQL...
2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse
?
R=CALCULER(EVALUER, Minimum(Note), Maximum(Note))
Et en langage SQL...
3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
R1=REGROUPER_ET_CALCULER(EVALUER, N°Etudiant, CodeMat, MoyEtuMat :
Moyenne(Note))
R2=JOINTURE(R1, MATIERE, MATIERE.CodeMat=R1.CodeMat)
R3=JOINTURE(R2, ETUDIANT, ETUDIANT.N°Etudiant=R2.N°Etudiant)
MOYETUMAT=PROJECTION(R3, N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat,
MoyEtuMat)
Et en langage SQL...
7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la
moyenne générale de la promotion ?
Idem question 5 et 6 puis :
R=SELECTION(MGETU, MgEtu>=MG)
Et en langage SQL...
1 - Quelle est la composition de l'équipe FESTINA (Numéro, nom et pays des coureurs)
?
R1=SELECTION(EQUIPE, NomEquipe="FESTINA")
R2=JOINTURE(R1, COUREUR, R1.CodeEquipe=COUREUR.CodeEquipe)
R3=JOINTURE(R2, PAYS, R2.CodePays=PAYS.CodePays)
R4=PROJECTION(R3, NuméroCoureur, NomCoureur, NomPays)
Et en langage SQL...
3 - Quel est le nombre de kilomètres total des étapes de type HAUTE MONTAGNE ?
R1=SELECTION(TYPE_ETAPE, LibelléType="HAUTE MONTAGNE")
R2=JOINTURE(R1, ETAPE, R1.CodeType=ETAPE.CodeType)
N=CALCULER(R2, SOMME(NbKm))
Et en langage SQL...
SELECT SUM(Nbkm)
FROM ETAPE A INNER JOIN TYPE_ETAPE B ON A.CodeType=B.CodeType
WHERE LibelléType="HAUTE MONTAGNE" ;
4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
R1=PROJECTION(COUREUR, NuméroCoureur)
R2=PROJECTION(ATTRIBUER_BONIFICATION, NuméroCoureur)
R3=DIFFERENCE(R1,R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)
Et en langage SQL...
SELECT NomCoureur
FROM COUREUR
WHERE NuméroCoureur NOT IN (SELECT NuméroCoureur FROM
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
ATTRIBUER_BONIFICATION) ;
ou
SELECT NomCoureur
FROM COUREUR C LEFT JOIN ATTRIBUER_BONIFICATION A ON
C.NuméroCoureur=A.NuméroCoureur
WHERE A.NuméroCoureur IS NULL ;
5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
R1=PROJECTION(PARTICIPER, NuméroCoureur, NuméroEtape)
R2=PROJECTION(ETAPE, NuméroEtape)
R3=DIVISION(R1, R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)
ou
N=CALCULER(ETAPE, Comptage())
R1=REGROUPER_ET_CALCULER(PARTICIPER, NuméroCoureur, Nb:Comptage())
R2=SELECTION(R1, Nb=N)
R3=JOINTURE(R2, COUREUR, R2.NuméroCoureur=COUREUR.NuméroCoureur)
R4=PROJECTION(R3, NomCoureur)
Et en langage SQL...
SELECT NomCoureur
FROM PARTICIPER A INNER JOIN COUREUR B ON
A.NuméroCoureur=B.NuméroCoureur
GROUP BY NuméroCoureur, NomCoureur
HAVING COUNT(*)=(SELECT COUNT(*) FROM ETAPE) ;
6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps
des coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été
intégrées dans les temps réalisés à chaque étape ?
R1=SELECTION(PARTICIPER, NuméroEtape=13)
R2=PROJECTION(R1, NuméroCoureur)
-> R2 représente l'ensemble des coureurs présents jusqu'à la 13ème étape (ce qui va permettre
de ne pas prendre en compte dans le classement ceux qui ont abandonné avant !)
R3=JOINTURE(R2, PARTICIPER, R2.NuméroCoureur=PARTICIPER.NuméroCoureur)
R4=SELECTION(R3, NuméroEtape<=13)
R5=REGROUPER_ET_CALCULER(R4, NuméroCoureur, Total:Somme(TempsRéalisé))
R6=JOINTURE(R5, COUREUR, R5.NuméroCoureur=COUREUR.NuméroCoureur)
R7=PROJECTION(R6, NomCoureur, CodeEquipe, CodePays, Total)
R8=TRI(R7, Totalé)
Et en langage SQL...
.
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
TD N° 3
Algèbre Relationnelle (Série 2)
Exercice 1 :
Acteurs (Titre*,Acteur*)
b)- Trouvez les acteurs qui ont tourné avec TRUFFAUT comme réalisateur ?
d)- Quels sont les acteurs qui jouent dans tous les films de ‘ TRUFFAUT’
e)- quels sont les réalisateurs qui ont réalisé plus que 10 films ?
f)- Quels sont les réalisateurs dont le nombre de films réalisé dépasse celui du réalisateur
TRUFFAUT ?
Exercice 2 :
Vu (Spectateur, Titre*)
Sachant que :
La relation Vu décrit les titres des films vus par les spectateurs. Evidemment un
spectateur peut voir plusieurs films
La relation Aime décrit les films appréciés par les spectateurs (amateurs).
Evidemment, un spectateur peut aimer plusieurs films.
b)- Quels sont les acteurs qui jouent dans tous les films ?
c)- Quels sont les spectateurs qui aiment tous les films qu’ils voient ?
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
Corrigé
Exercice 1 :
Acteurs (Titre*,Acteur*)
SQL :
SELECT *
FROM FILMS
WHERE Pays=’France’ ;
b)- Trouvez les acteurs qui ont tourné avec TRUFFAUT comme réalisateur ?
AR :
SQL
SELECT Acteur
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND réalisateur =’TRUFFAUT’ ;
AR :
R1= Jointure(FILMS, Acteurs, FILMS.Titre=Acteurs.Titre)
R2= selection(R1, acteur=réalisateur)
R3= projection (R2, Titre)
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
SQL :
SELECT Titre
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND Acteur=réalisateur;
d)- Quels sont les acteurs qui jouent dans tous les films de ‘ TRUFFAUT’
AR :
SQL :
SELECT Acteur
FROM Acteurs A
WHERE NOT EXISTS ( SELECT *
FROM FILMS B
WHERE réalisateur =’TRUFFAUT’
AND A.Titre=B.Titre)) ;
e)- quels sont les réalisateurs qui ont réalisé plus que 10 films ?
AR :
SQL :
f)- Quels sont les réalisateurs dont le nombre de films réalisé dépasse celui du réalisateur
TRUFFAUT ?
AR :
SQL :
SELECT réalisateur
FROM FILMS
GROUP BY réalisateur
HAVING COUNT(Titre) > (SELECT COUNT(Titre)
FROM FILMS
WHERE réalisateur =’TRUFFAUT’));
Exercice 2 :
Vu (Spectateur, Titre*)
Sachant que :
La relation Vu décrit les titres des films vus par les spectateurs. Evidemment un
spectateur peut voir plusieurs films
La relation Aime décrit les films appréciés par les spectateurs (amateurs).
Evidemment, un spectateur peut aimer plusieurs films.
AR :
SQL :
FROM Salle
b)- Quels sont les acteurs qui jouent dans tous les films ?
AR :
R3= Division(R2,R1)
SQL :
SELECT acteur
FROM Film
GROUP BY acteur
FROM Film);
c)- Quels sont les spectateurs qui aiment tous les films qu’ils voient ?
AR :
SQL:
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
SELECT spectateur
FROM Vu
GROUP BY spectateur
FROM Aime
GROUP BY Amateur)
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
R1=SELECTION(ARTICLES, STOCK<10)
R2=PROJECTION(R1, NOART, LIBELLE)
FROM ARTICLES
WHERE STOCK<10;
Question 2 : Liste des articles dont le prix d'inventaire est compris entre 100 et 300 ?
SELECT *
FROM ARTICLES
SELECT *
FROM FOURNISSEURS
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
SELECT *
FROM FOURNISSEURS
Question 5 : noms et adresses des fournisseurs qui proposent des articles pour lesquels le délai
d'approvisionnement est supérieur à 20 jours ?
R1=SELECTION(ACHETER, DELAI>20)
R2=JOINTURE(R1, FOURNISSEURS, NOFOUR)
R2=PROJECTION(R1, NOMFOUR, ADRFOUR, VILLEFOUR)
WHERE DELAI>20;
NbArticles=CALCULER(ARTICLES, Comptage())
FROM ARTICLES;
ValeurStock=CALCULER(ARTICLES, Somme(STOCK*PRIXINVENT))
FROM ARTICLES;
Question 8 : numéros et libellés des articles triés dans l'ordre décroissant des stocks ?
FROM ARTICLES
Question 9 : Liste pour chaque article (numéro et libellé) du prix d'achat maximum, minimum et
moyen ?
TD N°6 : PL/SQL
Exercice 1 :
Exercice 2 :
Ecrire un bloc PL/SQL permettant d’afficher les services de la table Service au format « Numéro
Service : intitulé (localisation) ».
Dans le cas où la table service est vide afficher un message d’erreur (EXCEPTION).
Ecrire un bloc PL/SQL permettant d’afficher le nombre de films réalisés par chaque réalisateur
sous la forme (Le réalisateur : Foulen à réalisé XX films) .
Traiter le cas où la table Film est vide comme une Exception. Dans ce cas afficher un message de
la forme « Pas de films disponibles !! »
c) Utiliser une boucle WHILE
d) Utiliser une boucle FOR
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
Corrigé
TD N°6 : PL/SQL
Exercice 1 :
DECLARE
Mess char(10) := « Coucou » ;
NB integer ;
Erreur EXCEPTION ;
BEGIN
DBMS_OUTPUT.PUT_LINE(mess) ;
SELECT COUNT(NOP) INTO NB FROM Pièce;
IF NB>1000 THEN
Raise Erreur;
Else
DBMS_OUTPUT.PUT_LINE(“Nombre de pieces =” ||NB);
ENDIF;
When Erreur
Then
DBMS_OUTPUT.PUT_LINE(“Stock plein”);
END;
Exercice 2:
DECLARE
CURSOR tous_services IS SELECT NOS, Intitulé, Localisation FROM Service ;
Numéro service.NOS %TYPE ;
Nom service. Intitulé%TYPE ;
Local service.Localisation%TYPE ;
--ou encore un_service tous_service%ROWTYPE ;
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
Vide EXCEPTION ;
N integer ;
BEGIN
SELECT COUNT(*) INTO N FROM SERVICE ;
IF N=0
Then
RISE vide;
Endif;
Open tous_services ;
Fetch tous_services INTO Numéro, Nom, Local;
While N<>0 --ou encore while tous_service%found
LOOP
Exercice 3 :
a) En utilisant WHILE
DECLARE
N integer ;
Film_vide EXCEPTION ;
CURSOR Film_Realisateur IS SELECT réalisateur, COUNT(Titre) AS NB FROM Film
GROUP BY réalisateur;
Un_enreg Film_Realisateur%ROWTYPE;
BEGIN
SELECT COUNT(Titre) INTO N FROM Film ;
If (N=0) THEN RAISE Film_vide;
End if;
Open Film_Realisateur;
FETCH Film_Realisateur INTO Un_enreg
WHILE Film_Realisateur%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(‘Le réalisateur’|| Un_enreg.réalisateur||’a realize’ ||
Un_enreg.NB || ‘films’);
FETCH Film_Realisateur INTO Un_enreg
End loop;
Close Film_Realisateur;
EXCEPTION
WHEN Film_vide THEN DBMS_OUTPUT.PUT_LINE(‘Pas de films disponibles !!’) ;
END ;
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)
b- Boucle FOR
DECLARE
N integer ;
Film_vide EXCEPTION ;
CURSOR Film_Realisateur IS SELECT réalisateur, COUNT(Titre) AS NB FROM Film
GROUP BY réalisateur;
Un_enreg Film_Realisateur%ROWTYPE;
BEGIN
SELECT COUNT(Titre) INTO N FROM Film ;
If (N=0) THEN RAISE Film_vide;
End if;
FOR Un_enreg IN Film_Realisateur
LOOP
DBMS_OUTPUT.PUT_LINE(‘Le réalisateur’|| Un_enreg.réalisateur||’a réalisé’ ||
Un_enreg.NB || ‘films’);
End loop;
EXCEPTION
WHEN Film_vide THEN DBMS_OUTPUT.PUT_LINE(‘Pas de films disponibles !!’) ;
END ;