Série 3 : Exercices sur les langages de manipulation de données relationnelles
I. Corrigé de l'algèbre relationnelle
1.
π
[DateNaissance, Adresse]σ
[Prénom = “Juliette” ∧ Nom = “Rochat”] Employé 2.π
[Nom, Adresse] ( Employé∗ σ
[NomD = “Recherche”] Département )3.
π
[Nom, Adresse] ( Employé∗ α
[N°Avs->Supérieur]π
[N°Avs]σ
[Prénom = “Juliette” ∧ Nom =“Rochat”] Employé )
4.
π
[Nom] ( Employé∗ σ
[Heures>10] Travaille *σ
[Lieu="Genève"]π
[N°Pro, Lieu] Projet ) 5.π
[NomP] (Projet *Travaille *π
[N°Avs]σ
[(Nom=“Muller” ∧ Prénom="Jean") ∨(Nom=“Grandjean” ∧ Prénom="Annie")] Employé )
6.
π
[NomP] (Projet *Travaille *π
[N°Avs]σ
[Nom=“Muller” ∧ Prénom="Jean"] Employé )∩
π
[NomP] (Projet *Travaille *π
[N°Avs]σ
[Nom=“Grandjean” ∧ Prénom="Annie"] Employé ) 7.π
[Nom, Prénom] ( Employé – ( Employé *π
[N°Avs] Travaille) )8. ProDept =
π
[N°Pro, N°Dep] (Travaille * Employé) Résultat = ProDept /π
[N°Dep] DépartementAutre formulation, sans la division. Dans ce cas, il faut calculer l'inverse, à savoir: les projets qui n'ont pas de participant dans chaque département. La relation P contient les couples (N°Pro, N°Dep) tels que le projet N°Pro n'a pas de participant du département N°Dep:
P = ((
π
[N°Pro] Projet) x (π
[N°Dep] Département)) -π
[N°Pro, N°Dep] ( Travaille * Employé ) Résultat = (π
[N°Pro] Projet) - (π
[N°Pro] P)9. On calcule d'abord les employés qui travaillent sur au moins un projet de Genève (EmpG).
EmpG =
π
[Nom, N°Avs] (Employé * Travaille *π
[N°Pro] σ
[Lieu="Genève"] Projet ) (On conserve le N°Avs, bien qu'il ne soit pas demandé dans le résultat, au cas où il y ait des homonymes parmi les employés)Résultat =
π
[Nom] ( (π
[Nom, N°Avs] Employé) – EmpG )10. On calcule d'abord les employés qui travaillent sur au moins un projet qui n'est pas à Genève (EmpNG).
EmpNG =
π
[Nom, N°Avs] ( Employé * Travaille *π
[N°Pro] σ
[Lieu≠"Genève"] Projet ) Résultat = (π
[Nom] ( EmpG – EmpNG )II Traduction en français:
1. Noms et prénoms des employés qui gagnent plus que leur supérieur immédiat.
2. Noms des projets sur lesquels ne travaille aucun employé du département du projet.
II. Corrigé en calcul relationnel des tuples
1. e ∈ Employé
{ e.DateNaissance, e.Adresse / e.Prénom = “Juliette” ∧ e.Nom = “Rochat” } 2. e ∈ Employé, d ∈ Département
{ e.Nom, e.Adresse / ∃d (e.N°Dep = d.N°Dep ∧ d.NomD = “Recherche”) } 3. e1, e2 ∈ Employé
{e1.Nom, e1.Prénom / ∃e2 (e1.Supérieur = e2.N°Avs ∧ e2.Prénom = “Juliette” ∧ e2.Nom =
“Rochat”) }
4. e ∈ Employé, t ∈ Travaille, p ∈ Projet
{ e.Nom / ∃t ∃p (t.N°Avs = e.N°Avs ∧ t.N°Pro = p.N°Pro ∧ t.Heures > 10 ∧ p.Lieu = “Genève” ) } 5. e ∈ Employé, t ∈ Travaille, p ∈ Projet
{p.nomP / ∃e ∃t ( ((e.Nom=“Muller” ∧ e.Prénom="Jean") ∨ (e.Nom=“Grandjean” ∧ e.Prénom="Annie")) ∧ e.N°Avs=t.N°Avs ∧ t.N°Pro=p.N°Pro ) }
6. e1, e2 ∈ Employé, t1, t2 ∈ Travaille, p ∈ Projet
{p.nomP / ∃e1 ∃e2 ∃t1 ∃t2 ( e1.Nom=“Muller” ∧ e1.Prénom="Jean"∧ e1.N°Avs=t1.N°Avs ∧ t1.N°Pro=p.N°Pro ∧ e2.Nom=“Grandjean” ∧ e2.Prénom="Annie"∧ e2.N°Avs=t2.N°Avs ∧ t2.N°Pro=p.N°Pro ) }
7. e ∈ Employé, t ∈ Travaille
{ e.Nom / ∀t (t.N°Avs ≠ e.N°Avs) }
8. e ∈ Employé, t ∈ Travaille, p ∈ Projet, d ∈ Département
{ p.N°Pro / ∀d ∃e ∃t (d.N°Dep = e.N°Dep ∧ e.N°Avs = t.N°Avs ∧ t.N°Pro = p.N°Pro) } 9. e ∈ Employé, t ∈ Travaille, p ∈ Projet
{ e.Nom / ¬∃t ∃p ( t.N°Avs = e.N°Avs ∧ t.N°Pro = p.N°Pro ∧ p.Lieu = “Genève” ) } 10. e ∈ Employé, t ∈ Travaille, p ∈ Projet
{ e.Nom / ∀t ( t.N°Avs ≠ e.N°Avs ∨ ∃p ( t.N°Pro = p.N°Pro ∧ p.Lieu = “Genève” )) ∧
∃t ( t.N°Avs = e.N°Avs ) } ou
{ e.Nom / ¬∃t ∃p ( t.N°Avs = e.N°Avs ∧ t.N°Pro = p.N°Pro ∧ p.Lieu = “Genève” ) ∧
∃t ( t.N°Avs = e.N°Avs ) }
Dans ces deux requêtes, la dernière partie de la formule : ∃t ( t.N°Avs = e.N°Avs ) }
sert à éliminer les employés qui ne travaillent sur aucun projet.
II Traduction en français:
1. Noms et prénoms des employés qui travaillent sur un même projet que Juliette Rochat.
2. Noms et prénoms des employés qui travaillent sur tous les projets de leur département.
III. Corrigé du SQL
Question I
1. SELECT DateNaissance, Adresse FROM Employé
WHERE Nom='Rochat' AND Prénom='Juliette' ; 2. SELECT Nom, Adresse
FROM Employé WHERE N°Dep IN
(SELECT N°Dep FROM Département
WHERE NomD='Recherche' ) ;
2. (autre solution) SELECT Nom, Adresse FROM Employé, Département
WHERE Employé.N°Dep=Département.N°Dep AND NomD='Recherche' ; 3. SELECT E.Nom, E.Prénom
FROM Employé E, Employé JR
WHERE JR.Nom='Rochat' AND JR.Prénom='Juliette' AND E.Supérieur=JR.N°AVS;
4. SELECT Nom
FROM Employé, Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Lieu='Genève' AND Heures>10;
5. SELECT NomP
FROM Employé, Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND ((Nom='Muller' AND Prénom='Jean') OR (Nom='Greanjean' AND Prénom='Annie')) ; 6. ( SELECT NomP
FROM Employé, Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Nom='Muller' AND Prénom='Jean' )
INTERSECT ( SELECT NomP
FROM Employé, Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Nom='Greanjean' AND Prénom='Annie') ;
7. SELECT Nom, Prénom FROM Employé
WHERE NOT EXISTS
( SELECT * FROM Travaille
WHERE Employé.N°AVS=Travaille.N°AVS ) ;
7. (autre solution) SELECT Nom, Prénom FROM Employé
WHERE N°AVS NOT IN
( SELECT N°AVS FROM Travaille ) ; 8. SELECT N°Pro
FROM Projet
WHERE NOT EXISTS
( SELECT * FROM Département WHERE NOT EXISTS
( SELECT * FROM Employé, Travaille
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Employé.N°Dep=Département.N°Dep ) ) ;
9. SELECT Nom FROM Employé WHERE NOT EXISTS
( SELECT *
FROM Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Lieu='Genève' ) ;
10. SELECT Nom FROM Employé WHERE NOT EXISTS
( SELECT *
FROM Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro AND Lieu≠'Genève' )
AND EXISTS ( SELECT * FROM Travaille
WHERE Employé.N°AVS=Travaille.N°AVS ) ; 10. (autre solution) SELECT Nom
FROM Employé WHERE
'Genève' = ALL ( SELECT Lieu
FROM Travaille, Projet
WHERE Employé.N°AVS=Travaille.N°AVS AND Travaille.N°Pro=Projet.N°Pro ) ;
Question IV
π
SELECT NomD, COUNT(N°AVS) FROM Employé, DépartementWHERE Employé.N°Dep=Département.N°Dep GROUP BY NomD ;
π
CREATE VIEW DepPro (N°Dep, NbPro) AS SELECT N°Dep, COUNT(N°Pro)FROM Projet
GROUP BY N°Dep ; SELECT N°Dep FROM Projet GROUP BY N°Dep
HAVING COUNT(N°Pro) <
( SELECT AVG(NbPro) FROM DepPro ) ;