Vous êtes sur la page 1sur 25

TD Bases de Données -

Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

Exercices normalisation :
Exercice 1 :

Les problèmes que peuvent avoir une relation non normalisée sont :

 Problème de redondance des données


 Problème de mise à jour pour les insertions
 Problème lors des suppressions
 Problème de mise à jour des tuples.

Soit la relation Fournisseur (NumF, NomProduit, AdrFrs, TelFrs, Prix).

Cette relation n’est pas en 2FN. Décrire comment les problèmes cités ci-dessus peuvent survenir
sur cette relation ?

Corrigé :

Les problèmes que peuvent survenir sont :

 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)

Exercice d'application n°1


Soit le modèle relationnel suivant relatif à une base de données sur des représentations musicales :

REPRESENTATION (n°représentation, titre_représentation, lieu)


MUSICIEN (nom, n°représentation*)
PROGRAMMER (date, n°représentation*, tarif)

Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *

Questions :

1 - Donner la liste des titres des représentations.

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.

Exercice d'application n°2


Soit le modèle relationnel suivant relatif à la gestion des notes annuelles d'une promotion
d'étudiants :

ETUDIANT(N°Etudiant, Nom, Prénom)


MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(N°Etudiant*, CodeMat*, Date, Note)

Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par *

Questions :

1 - Quel est le nombre total d'étudiants ?

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 ?

4 - Quelles sont les moyennes par matière ?

5 - Quelle est la moyenne générale de chaque étudiant ?

6 - Quelle est la moyenne générale de la promotion ?


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la moyenne
générale de la promotion ?

Exercice d'application n°3


Soit le modèle relationnel suivant relatif à la gestion simplifiée des étapes du Tour de France 97,
dont une des étapes de type "contre la montre individuel" se déroula à Saint-Etienne :

EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)


COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays)
TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes, NuméroCoureur*)

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) ?

2 - Quel est le nombre de kilomètres total du Tour de France 97 ?

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

Médecin (Numed , Nom, Prénom, Grade)


Patient (Numpatient , Nom, Prénom, Age)
Médicament (Code , Libellé, Type)
Prescrit (Numed, Code, Numpatient, Date )

*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)

Correction de l'exercice d'application n°1


REPRESENTATION (n°représentation, titre_représentation, lieu)
MUSICIEN (nom, n°représentation*)
PROGRAMMER (date, n°représentation*, tarif)

1 - Donner la liste des titres des représentations.


R = PROJECTION(REPRESENTATION, titre_représentation)
Et en langage SQL...

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...

SELECT nom, titre_représentation


FROM MUSICIEN INNER JOIN REPRESENTATION ON
MUSICIEN.n°représentation = REPRESENTATION.n°représentation ;

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...

SELECT titre_représentation, lieu, tarif


FROM REPRESENTATION INNER JOIN PROGRAMMER ON
PROGRAMMER.n°représentation = REPRESENTATION.n°représentation
WHERE date='14/06/96' ;
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

Correction de l'exercice d'application n°2


ETUDIANT(N°Etudiant, Nom, Prénom)
MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(N°Etudiant*, CodeMat*, Date, Note)

1 - Quel est le nombre total d'étudiants ?


N=CALCULER(ETUDIANT, Comptage())
Et en langage SQL...

SELECT COUNT(*) FROM ETUDIANT ;

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...

SELECT MIN(Note), MAX(Note) FROM EVALUER ;

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...

CREATE VIEW MOYETUMAT AS


SELECT ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat, AVG(Note)
AS MoyEtuMat
FROM EVALUER INNER JOIN MATIERE ON EVALUER.CodeMat =
MATIERE.CodeMat
INNER JOIN ETUDIANT ON EVALUER.N°Etudiant = ETUDIANT.N°Etudiant
GROUP BY ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat;

Remarque : la commande CREATE VIEW va permettre de réutiliser le résultat de la


requête (notamment aux deux questions suivantes) comme s'il s'agissait d'une nouvelle
table (bien qu'elle soit regénérée dynamiquement lors de son utilisation).
Sous Access, il ne faut pas utiliser la commande CREATE VIEW mais seulement
enregistrer la requête. Il est alors possible de s'en resservir comme une table.

4 - Quelles sont les moyennes par matière ?


Idem question 3 puis :
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

R4=REGROUPER_ET_CALCULER(MOYETUMAT, LibelléMat, Moyenne(MoyEtuMat))


Et en langage SQL...

Avec la vue MOYETUMAT de la question 3 :


SELECT LibelléMat, AVG(MoyEtuMat)
FROM MOYETUMAT
GROUP BY LibelléMat ;

5 - Quelle est la moyenne générale de chaque étudiant ?


Idem question 3 puis :
MGETU=REGROUPER_ET_CALCULER(MOYETUMAT, N°Etudiant, Nom, Prénom,
MgEtu : Somme(MoyEtuMat*CoeffMat)/Somme(CoeffMat))
Et en langage SQL...

Avec la vue MOYETUMAT de la question 3 :


CREATE VIEW MGETU AS
SELECT N°Etudiant, Nom, Prénom, SUM(MoyEtuMat*CoeffMat)/SUM(CoeffMat) AS
MgEtu
FROM MOYETUMAT
GROUP BY N°Etudiant, Nom, Prénom ;

6 - Quelle est la moyenne générale de la promotion ?


Idem question 5 puis :
MG=CALCULER(MGETU, Moyenne(MgEtu))
Et en langage SQL...

Avec la vue MGETU de la question 5 :


SELECT AVG(MgEtu) FROM MGETU ;

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...

Avec la vue MGETU de la question 5 :


SELECT N°Etudiant, Nom, Prénom, MgEtu
FROM MGETU
WHERE MgEtu >= (SELECT AVG(MgEtu) FROM MGETU) ;

Correction de l'exercice d'application n°3


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)


COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays)
TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes, NuméroCoureur*)

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...

SELECT NuméroCoureur, NomCoureur, NomPays


FROM EQUIPE A INNER JOIN COUREUR B ON A.CodeEquipe=B.CodeEquipe
INNER JOIN PAYS C ON B.CodePays=C.CodePays
WHERE NomEquipe="FESTINA" ;

2 - Quel est le nombre de kilomètres total du Tour de France 97 ?


N=CALCULER(ETAPE, SOMME(NbKm))
Et en langage SQL...

SELECT SUM(Nbkm) FROM ETAPE ;

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...

SELECT NomCoureur, CodeEquipe, CodePays, SUM(TempsRéalisé) AS Total


FROM PARTICIPER A INNER JOIN COUREUR B ON
A.NuméroCoureur=B.NuméroCoureur
WHERE NuméroEtape<=13 AND A.NuméroCoureur IN
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

(SELECT NuméroCoureur FROM PARTICIPER WHERE NuméroEtape=13)


GROUP BY A.NuméroCoureur, NomCoureur, CodeEquipe, CodePays ORDER BY 4 ;

.
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 :

Soit le modèle relationnel suivant :

FILMS (Titre, Pays, Année, Réalisateur, Durée)

Acteurs (Titre*,Acteur*)

1)- Exprimez les requêtes suivantes en Algèbre relationnelle

a)- Donnez la liste des films français

b)- Trouvez les acteurs qui ont tourné avec TRUFFAUT comme réalisateur ?

c)- Titre des films où le réalisateur est aussi acteur ?

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 :

Soit le schéma relationnel suivant :

Salle (NomS, Horaire, capacité, Titre*)

Film (Titre, réalisateur, durée, acteur)

Producteur (Producteur, Titre*)

Vu (Spectateur, Titre*)

Aime (Amateur, Titre*)


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

Sachant que :

 Un film peut être produit par plusieurs producteurs

 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.

1- Exprimez en Algèbre relationnelle les requêtes suivantes :

a)- Où et à quel horaire peut on voir le film « Ma belle Tunisie » ?

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 :

Soit le modèle relationnel suivant :

FILMS (Titre, Pays, Année, Réalisateur, Durée)

Acteurs (Titre*,Acteur*)

1)- Exprimez les requêtes suivantes en Algèbre relationnelle et en SQL

a)- Donnez la liste des films français


AR :

R1= Selection (FILMS, pays=’France’)

SQL :

SELECT *
FROM FILMS
WHERE Pays=’France’ ;

b)- Trouvez les acteurs qui ont tourné avec TRUFFAUT comme réalisateur ?

AR :

R1= selection (FILMS, réalisateur=’TRUFFAUT’)


R2= Jointure (R1, Acteurs, R1.Titre=Acteurs.Titre)
R3= Projection(R2, acteur)

SQL

SELECT Acteur
FROM FILMS A, Acteurs B
WHERE A.Titre=B.Titre
AND réalisateur =’TRUFFAUT’ ;

c)- Titre des films où le réalisateur est aussi acteur ?

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 :

R1 = selection (FILMS, réalisateur=’TRUFFAUT’)


R2= projection (R1,Titre) /* tous les films de ’TRUFFAUT
R3= division(Acteurs , R2)

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 :

R1= regrouper_et_calculer(FILMS, réalisateur, N : comptage(Titre))


R2= selection(R1, N>10)
R3= projection (R2, réalisateur)

SQL :

SELECT réalisateur , COUNT(Titre) AS ‘Nombre de films’


FROM FILMS
GROUP BY réalisateur
HAVING COUNT(Titre)>10 ;

f)- Quels sont les réalisateurs dont le nombre de films réalisé dépasse celui du réalisateur
TRUFFAUT ?
AR :

R1= regrouper_et_calculer(FILMS, réalisateur, N1: comptage(Titre)) /* le nombre de films


réalisé pour chaque réalisateur */
R2= selection (FILMS, réalisateur=’TRUFFAUT’)
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

N2 = Calculer (R2, comptage(Titre))


R3 = selection (R1, N1>N2)
R4 = projection (R3, réalisateur)

SQL :

SELECT réalisateur
FROM FILMS
GROUP BY réalisateur
HAVING COUNT(Titre) > (SELECT COUNT(Titre)
FROM FILMS
WHERE réalisateur =’TRUFFAUT’));

Exercice 2 :

Soit le schéma relationnel suivant :

Salle (NomS, Horaire, capacité, Titre*)

Film (Titre, réalisateur, durée, acteur)

Producteur (Producteur, Titre*)

Vu (Spectateur, Titre*)

Aime (Amateur, Titre*)

Sachant que :

 Un film peut être produit par plusieurs producteurs

 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.

1- Exprimez en Algèbre relationnelle ET en SQL les requêtes suivantes :

a)- Où et à quel horaire peut on voir le film « Ma belle Tunisie » ?

AR :

R1= Selection(Salle, Titre=’Ma belle Tunisie’


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

R2= Projection (R1, Horaire, NomS)

SQL :

SELECT NomS, Horaire

FROM Salle

WHERE Titre=’Ma belle Tunisie’ ;

b)- Quels sont les acteurs qui jouent dans tous les films ?

AR :

R1= Projection(Film, Titre)

R2= Projection(Film, Titre, acteur)

R3= Division(R2,R1)

SQL :

SELECT acteur

FROM Film

GROUP BY acteur

HAVING COUNT(Titre)=(SELECT COUNT(*)

FROM Film);

c)- Quels sont les spectateurs qui aiment tous les films qu’ils voient ?

AR :

R1= Regrouper_et_calculer(Vu, Spectateur, N1=comptage(Titre))

R2= Regrouper_et_calculer(Aime, Amateur, N2=comptage(Titre))

R3= jointure(R1,R2, Spectateur=Amateur)

R4= selection (R3, N1=N2)

R5= projection(R4, Spectateur)

SQL:
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

SELECT spectateur

FROM Vu

GROUP BY spectateur

HAVING COUNT(Titre)=(SELECT COUNT(Titre)

FROM Aime

GROUP BY Amateur)
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

Exercices Algèbre relationnelle et SQL

Soit le modèle relationnelle suivant :

ARTICLES (NOART, LIBELLE, STOCK, PRIXINVENT)


FOURNISSEURS (NOFOUR, NOMFOUR, ADRFOUR, VILLEFOUR)
ACHETER (NOFOUR*, NOART*, PRIXACHAT, DELAI)

Question 1 : numéros et libellés des articles dont le stock est inférieur à 10 ?

R1=SELECTION(ARTICLES, STOCK<10)
R2=PROJECTION(R1, NOART, LIBELLE)

SELECT NOART, LIBELLE

FROM ARTICLES

WHERE STOCK<10;

Question 2 : Liste des articles dont le prix d'inventaire est compris entre 100 et 300 ?

R1=SELECTION(ARTICLES, PRIXINVENT>=100 et PRIXINVENT<=300)


R2=PROJECTION(R1, NOART, LIBELLE, STOCK, PRIXINVENT)

SELECT *

FROM ARTICLES

WHERE PRIXINVENT BETWEEN 100 AND 300;

Question 3 : Liste des fournisseurs dont on ne connaît pas l'adresse ?

R1=SELECTION(FOURNISSEURS, ADRFOUR est "non renseigné")


R2=PROJECTION(R1, NOFOUR, NOMFOUR, ADRFOUR, VILLEFOUR)

SELECT *

FROM FOURNISSEURS
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

WHERE ADRFOUR IS NULL;

Question 4 : Liste des fournisseurs dont le nom commence par "STE" ?

R1=SELECTION(FOURNISSEURS, NOMFOUR comme "STE%")


R2=PROJECTION(R1, NOFOUR, NOMFOUR, ADRFOUR, VILLEFOUR)

SELECT *

FROM FOURNISSEURS

WHERE NOMFOUR LIKE 'STE%';

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)

SELECT NOMFOUR, ADRFOUR, VILLEFOUR

FROM FOURNISSEURS F INNER JOIN ACHETER A ON F.NOFOUR=A.NOFOUR

WHERE DELAI>20;

Question 6 : Nombre d'articles référencés ?

NbArticles=CALCULER(ARTICLES, Comptage())

SELECT COUNT(*) AS NbArticles

FROM ARTICLES;

Question 7 : Valeur du stock ?


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

ValeurStock=CALCULER(ARTICLES, Somme(STOCK*PRIXINVENT))

SELECT SUM(STOCK*PRIXINVENT) AS ValeurStock

FROM ARTICLES;

Question 8 : numéros et libellés des articles triés dans l'ordre décroissant des stocks ?

R1=PROJECTION(ARTICLES, NOART, LIBELLE, STOCK)


R2=TRI(R1, STOCK décroissant)

SELECT NOART, LIBELLE, STOCK

FROM ARTICLES

ORDER BY STOCK DESC ;

Question 9 : Liste pour chaque article (numéro et libellé) du prix d'achat maximum, minimum et
moyen ?

R1=REGROUPER_ET_CALCULER(ACHETER, NOART, PAMAX : MAX(PRIXACHAT),


PAMIN : MIN(PRIXACHAT), PAMOY : MOYENNE(PRIXACHAT))
R2=JOINTURE(R1, ARTICLES, NOART)
R3=PROJECTION(R2, NOART, LIBELLE, PAMAX, PAMIN, PAMOY)

SELECT A.NOART, LIBELLE, MAX(PRIXACHAT) AS PMAX, MIN(PRIXACHAT) AS PMIN,


AVG(PRIXACHAT) AS PMOY

FROM ACHETER A INNER JOIN ARTICLES B ON A.NOART = B.NOART

GROUP BY A.NOART, LIBELLE;

Question 10 : Délai moyen pour chaque fournisseur proposant au moins 2 articles ?

R1=REGROUPER_ET_CALCULER(ACHETER, NOFOUR, Nb : Comptage(), DelaiMoyen :


MOYENNE(DELAI))
R2=SELECTION(R1, Nb>=2)
R3=JOINTURE(R2, FOURNISSEURS, NOFOUR)
R4=PROJECTION(R3, NOFOUR, NOMFOUR, DelaiMoyen)
TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

SELECT A.NOFOUR, NOMFOUR, AVG(DELAI) AS DelaiMoyen

FROM ACHETER A INNER JOIN FOURNISSEURS F ON A.NOFOUR = F.NOFOUR

GROUP BY A.NOFOUR, NOMFOUR

HAVING COUNT(*) >=2;


TD Bases de Données -
Responsable : F. Chaker-Kharrat – 2ème ESSAI (2011-2012)

TD N°6 : PL/SQL

Exercice 1 :

1- Ecrire un programme PL/SQL peremttant d’afficher un message à l’écran. Le message


devra être contenu dans une variable chaîne de caractère qui aura été préalablement
initialisée à « Coucou !! ».
2- Dans le même bloc PL/SQL, définir une variable entière, puis lui affecter le nombre toal
de pièces enregistrées dans la table Pièce (NOP, Libelle, prix). Afficher le contenu de
cette variable dans un message de la forme « Nombre de pièces = XX »
3- Dans le cas où le nombre de pièces est > à 1000, déclencher une EXCEPTION qui
permet d’afficher le message suivant « Trop de pièces pour tenir dans l’entrepôt »

Exercice 2 :

Soit la table Service (NOS, intitulé, localisation).

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).

a) Utiliser une boucle WHILE


b) Utiliser une boucle FOR

Exercice 3 (Examen 2010/2011)

Soit la table Film (Titre, réalisateur, durée, acteur)

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)

Ecole Supérieure de la Statistique et de l’Analyse de l’Information

‫اﻟﻣدرﺳﺔ اﻟﻌﻠﯾﺎ ﻟﻺﺣﺻﺎء وﺗﺣﻠﯾل اﻟﻣﻌﻠوﻣﺎت ﺑﺗوﻧس‬

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 ;

Vous aimerez peut-être aussi