Vous êtes sur la page 1sur 10

Ecole Supérieure en Informatique de Sidi Bel Abbes (ESI)

Correction TD3 BDD (Exercices 3 et


4)
1ère année Seconde Cycle

Groupes 2, 3, 4 et 5

Mohammed BEKKOUCHE
Docteur en Informatique
Enseignant vacataire à l’ESI
Exercice 3
Soit le schéma relationnel suivant:
Employé (Nom, Prénom, DateNaissance, Adresse, Matricule, Salaire, N°Dep, Supérieur)
Département (NomD, N°Dep, Directeur)
Projet (NomP, N°Pro, Lieu, N°Dep)
Travaille (Matricule, N°Pro, Heures)
Précisions: L’attribut "Supérieur" dans la relation "Employé" contient le Matricule du
supérieur direct de l’employé. Chaque employé appartient à un département et
travaille sur zéro, un ou plusieurs projets.
Chaque projet est rattaché à un département qui – attention – peut être différent
de celui des employés travaillant sur ce projet.
Exprimer dans les différents langages relationnels les requêtes suivantes :
1. Date de naissance et adresse de Makhlouf Ali.
2. Nom et adresse des employés qui travaillent au département de recherche.
3. Nom et prénom des employés dont le supérieur est Makhlouf ALI.
4. Nom des employés qui travaillent plus de 10 heures sur un projet à Oran.
5. Nom des projets sur lesquels travaillent Said Mohamed et moufak Bachir
Attention le "et" du français signifie ici que l’un ou l’autre, ou les deux, doivent travailler au
projet.
6. Nom et prénom des employés qui ne travaillent sur aucun projet.
7. Numéro des projets qui ont au moins un participant de chaque département.
8. Nom des employés qui ne travaillent pas sur un projet à Tlemcen.
Solution
1. Date de naissance et adresse de Makhlouf Ali.
Algèbre:
π (DateNaissance, Adresse) (δ (Prénom=‘Ali’ Ʌ Nom=‘Makhlouf’) Employé)
Calcul des tuples:
E Employe
{E.DateNaissance, E.Adresse | E.Prénom=‘Ali’ Ʌ E.Nom=‘Makhlouf’}
SQL:
SELECT DateNaissance, Adresse
FROM Employe
WHERE Nom=‘Makhlouf’ AND Prénom=‘Ali’;
2. Nom et adresse des employés qui travaillent au département de recherche.
Algèbre:
π (Nom, Adresse) (Employe δ (NomD=‘Recherche’) Departement)
Calcul des tuples:
E Employe
{E.Nom, E.Adresse | D Departement(E.N°Dep=D.N°Dep Ʌ D.Nom=‘Recherche’)}
SQL:
SELECT Nom, Adresse
FROM Employe
WHERE N°Dep IN (SELECT N°Dep
FROM Departement
WHERE NomD=‘Recherche’);
Autre solution :
SELECT Nom, Adresse
FROM Employe, Departement
WHERE Employe.N°Dep=Departement.N°Dep AND NomD=‘Recherche’;
Solution
3. Nom et prénom des employés dont le supérieur est Makhlouf ALI.
Algèbre:
π (Nom, Prénom) (Employe π (Matricule) (δ (Prénom=‘Ali’ Ʌ Nom=‘Makhlouf’) Employe)
Supérieur=Matricule
Calcul des tuples:
E1 Employe
{E1.Nom, E1.Prénom | E2 Employe(E1.Supérieur=E2.Matricule Ʌ E2.Prénom=‘Ali’ Ʌ
E2.Nom=‘Makhlouf’)}
SQL:
SELECT E.Nom, E.Prénom
FROM Employe E, Employe JR
WHERE JR.Nom=‘Makhlouf’ AND JR.Prénom=‘Ali’ AND E.Supérieur=JR.Matricule;
4. Nom des employés qui travaillent plus de 10 heures sur un projet à Oran.
Algèbre:
π (Nom) (Employe (δ (Heures>10) Travaille) δ (Lieu=‘Oran’) (π (N°Pro, Lieu) Projet))
Calcul des tuples:
E Employe
{E.Nom | T Travaille P Projet (T.Matricule=E.Matricule Ʌ T.N°Pro = P.N°Pro Ʌ T.Heures>10 Ʌ
P.Lieu=‘Oran’)}
SQL:
SELECT Nom
FROM Employe, Travaille, Projet
WHERE Employe.Matricule=Travaille.Matricule AND Travaille.N°Pro=Projet.N°Pro AND
Solution
5. Nom des projets sur lesquels travaillent Said Mohamed et moufak Bachir (attention le "et" du français signifie ici que l’un ou l’autre,
ou les deux, doivent travailler au projet).
Algèbre:
π (Nom) (Projet Travaille π (Matricule) (δ [(Prénom=‘Mohamed’ Ʌ Nom=‘Said’) V (Prénom=‘moufak’ Ʌ Nom=‘Bachir’)] Employe))
Calcul des tuples:
P Projet
{P.NomP | E Employe T Travaille(((E.Prénom=‘Mohamed’ Ʌ E.Nom=‘Said’) V (E.Prénom=‘moufak’ Ʌ E.Nom=‘Bachir’)) Ʌ
E.Matricule=T.Matricule Ʌ T.N°Pro =P.N°Pro)}
SQL:
SELECT NomP
FROM Employe, Travaille, Projet
WHERE Employe.Matricule=Travaille.Matricule AND Travaille.N°Pro=Projet.N°Pro AND ((Prénom=‘Mohamed’ AND Nom=‘Said’) OR
(Prénom=‘moufak’ AND Nom=‘Bachir’));
6. Nom et prénom des employés qui ne travaillent sur aucun projet.
Algèbre:
π (Nom, Prénom) (Employe – (Employe π (Matricule) Travaille))
Calcul des tuples:
E Employe
{E.Nom, E.Prénom | T Travaille (T.Matricule ≠ E.Matricule)}
SQL:
SELECT Nom, Prénom
FROM Employe
WHERE Not Exists (SELECT *
FROM Travaille
WHERE Employe.Matricule=Travaille.Matricule);
Autre solution :
SELECT Nom, Prénom
FROM Employe
WHERE Employe.Matricule Not In (SELECT Travaille.Matricule
Solution
7. Numéro des projets qui ont au moins un participant de chaque département.
Algèbre:
ProDept= π (N°Pro, N°Dep)(Travaille Employe)
Resultat=ProDept ÷ π (N°Dep) Departement
Autre formulation, sans la division. Dans ce cas, il faut calculer l’inverse, à savoir : les projets
qui n’ont pas de participant de chaque département. La relation P contient les couples
(N°Pro, N°Dep) tels que le projet n’a pas de participant du département N°Dep:
P=((π (N°Pro) (Projet) × π (N°Dep) (Departement)) - π (N°Pro, N°Dep) (Travaille Employe))
Resultat=(π (N°Pro) (Projet))-(π (N°Pro) (P))
Calcul des tuples:
P Projet
{P.N°Pro | ( D Departement => E Employe T Travaille(D.N°Dep=E.N°Dep Ʌ
E.Matricule=T.Matricule Ʌ T.N°Pro=P.N°Pro))}
SQL:
SELECT N°Pro
FROM Projet
WHERE NOT EXISTS (SELECT *
FROM Departement
WHERE NOT EXISTS (SELECT *
FROM Employe, Travaille
Solution
8. Nom des employés qui ne travaillent pas sur un projet à Tlemcen.
Algèbre:
On calcule d’abord les employés qui travaillent sur au moins un projet à Tlemcen (EmpG).
EmpG=π (Nom, Matricule) (Employe Travaille ) π (N°Pro) (δ (Lieu=‘Tlemcen’) Projet)
(On conserve le Matricule, bien qu’il ne soit pas demandé dans le résultat, au cas où il y ait des homonymes parmi les
employés)
Resultat=π (Nom) ((π (Nom, Matricule) Employe) - EmpG)
Calcul des tuples:
E Employe
{E.Nom | T Travaille P Projet (T.Matricule=E.Matricule Ʌ T.NPro=P.NPro Ʌ P.Lieu=‘Tlemcen’)}
SQL:
SELECT Nom
FROM Employe
WHERE NOT EXISTS (SELECT *
FROM Travaille, Projet
WHERE Employe.Matricule=Travaille.Matricule AND Travaille.NPro=Projet.NPro AND
Lieu=‘Tlemcen’ );
9. Nom des employés qui ne travaillent que sur des projets à Tlemcen.
Algèbre:
On calcule d’abord les employés qui travaillent sur au moins un projet qui n’est pas à Tlemcen (EmpNG).
EmpNG=π (Nom, Matricule) (Employe Travaille π (N°Pro) (δ (Lieu≠Tlemcen) Projet))
Resultat=π (Nom)(EmpG - EmpNG)
Calcul des tuples:
E Employe
{E.Nom | T Travaille P Projet(T.Matricule=E.Matricule Ʌ T.NPro=P.NPro Ʌ P.Lieu≠‘Tlemcen’) Ʌ T Travaille
(T.Matricule=E.Matricule)}
Solution
9. Nom des employés qui ne travaillent que sur des projets à Tlemcen (suite).
SQL:
SELECT Nom
FROM Employe
WHERE NOT EXISTS (SELECT *
FROM Travaille, Projet
WHERE Employe.Matricule = Travaille.Matricule AND Travaille.N°Pro
= Projet.N°Pro AND Lieu ≠ Tlemcen)
AND EXISTS (SELECT *
FROM Travaille
WHERE Employe.Matricule=Travaille.Matricule);
Autre solution :
SELECT Nom
FROM Employe
WHERE ‘Tlemcen’ = ALL (SELECT Lieu
FROM Travaille, Projet
WHERE Employe.Matricule=Travaille.Matricule AND
Travaille.N°Pro = Projet.N°Pro);
Exercice 4
La base de données de la compagnie aérienne TASSALAT est composée des 4 tables :
avion (IdAvion, TypeAvion, Portee)
calendrier(Jour, CodeVol, IdPilote, IdAvion)
pilote(IdPilote, Nompilote)
vol(CodeVol, VilleDepart, VilleArrivee, Distance, HeureDepart, HeureArrivee)
qualification (IdPilote, TypeAvion)
– La table avion indique pour chaque avion de la compagnie: son identifiant, son type et sa portée (c’est dire la
distance maximale qu’il peut effectuer sans escale).
– La table pilote indique pour chaque pilote de la compagnie: son identifiant et son nom.
– La table vol spécifie pour chaque numéro de vol : sa ville de départ, sa ville d’arrivée, la distance du vol,
l’heure de départ et l’heure d’arrivée.
– Le calendrier de la compagnie est hebdomadaire. La table calendrier précise quel vol a lieu quel jour, qui
pilote ce jour-là et quel avion est utilisé. Cette compagnie n’assure que des vols courts: tous les vols arrivent le
jour où ils partent. Il y a des vols tous les jours.
– la table qualification indique quel type d’avion un pilote peut piloter. Chaque pilote est autorisé à piloter au
moins un type d’avion. Certains pilotes sont qualifiés pour plusieurs types d’avion.
Exprimer en algèbre relationnelle les requêtes suivantes (i.e., construire la formule algébrique qui définit la
table correspondante ou qui fournit une procédure de décision pour la question). Si la réponse vous semble
impossible à exprimer en algèbre relationnelle, expliquez pourquoi.
1. Quels sont les numéros d’identification des pilotes qualifiés pour un avion de type A300 et qui ne
volent pas le dimanche?
2. Quels sont les identifiants des avions qui ne sont utilisés que pour des vols d’une distance supérieure à 1000
kms?
3. Quels sont les vols qui ont lieu tous les Jours?
4. Quelles sont les villes desquelles partent et arrivent au moins un vol par Jour ?
Solution
1. Quels sont les numéros d’identification des pilotes qualifiés pour un avion de type
A300 et qui ne volent pas le dimanche?
π (IdPilote) ( Calendrier π (IdPilote) (δ (TypeAvion=‘A300’) (qualification))) – π (IdPilote) (δ
(Jour=‘dimanche’) (Calendrier))

2. Quels sont les identifiants des avions qui ne sont utilisés que pour des vols d’une
distance supérieure à 1000 kms?
π (IdAvion) (Calendrier) – π (IdAvion) (Calendrier δ (Distance<1000) (Vol))
3. Quels sont les vols qui ont lieu tous les Jours?
π (Jour, CodeVol) (Calendrier) ÷ π (Jour) (Calendrier)
4. Quelles sont les villes desquelles partent et arrivent au moins un vol par Jour ?
Ƿ(V1, Vol)
V1.CodeVol≠V2.CodeVol
Ƿ(V2, Vol)
π (Jour, VilleDepart) (δ (V1.VilleDepart=V2.VilleArrivee)(V1 V2) Calendrier) ÷ π (Jour) (Calendrier)

5. Quel est le type d’avion ayant la plus grande portée ?


Il est impossible d’exprimer cette requête avec les opérateurs de l’algèbre relationnelle
classique. Pour la traiter, il faut d’autres opérateurs :
Porteel=maxPortee

On peut seulement utiliser la fonction d’agrégation MAX :


π (TypeAvion, Portee) (Avion (MAX (Portee)  maxPortee) (Avion))

Vous aimerez peut-être aussi