SID
http://www.tofgarion.net/lectures/IN306
Ce document est un ensemble dexercices permettant de vous exercer `a la manipulation de lalg`ebre relationnelle
et de SQL.
N oCA
SELECT noArticle
FROM Commande NATURAL JOIN LigneCommande
WHERE ((dateCommande >= 2000-06-01) AND (noClient = 10));
SELECT noCommande
FROM Commande JOIN (SELECT * FROM Commande WHERE (noCommande = 2)) ON dateCommande;
la derni`ere requete est la plus compliquee. . . On peut la reformuler de la facon suivante : on cherche
les numeros darticles n tels quil nexiste pas de commande c telle que :
c est une commande du client 10 ;
il nexiste pas de ligne de commande correspondant `
a c telle que n apparaisse dans la ligne de
commande (ouf !)
Ce qui sexprime par :
SELECT noArticle
FROM Article
WHERE NOT EXISTS
(SELECT noCommande
FROM Commande
WHERE ((noClient = 10) AND NOT EXISTS
(SELECT *
FROM LigneCommande
WHERE (LigneCommande.noArticle = Article.noArticle) AND
(LigneCommande.noCommande = Commande.noCommande)
))
);
Considerons une base de donnees relationnelle contenant des informations sur des employes. Elle
poss`ede plusieurs tables :
2
Lattribut Superieur dans la relation Employe contient le numero de securite sociale du superieur
direct de lemploye. Chaque employe appartient `a un departement et travaille sur un ou plusieurs projets.
Chaque projet est rattache `a un departement qui peut etre different de celui des employes travaillant sur
ce projet.
Considerons les requetes suivantes :
1. date de naissance et adresse de Juliette Rochat ;
2. nom et adresse des employes qui travaillent au departement de recherche ;
3. nom des employes qui travaillent plus de 10 heures sur un projet `a Gen`eve ;
4. nom des projets sur lesquels travaillent Jean Muller et Annie Grandjean ;
5. nom et prenom des employes qui ne travaillent sur aucun projet ;
6. numero des projets qui ont au moins un participant de chaque departement ;
7. nom des employes qui ne travaillent pas sur un projet `a Gen`eve ;
8. pour chaque projet, lister le nombre demployes de sexe feminin ;
9. nom des employes qui ne travaillent que sur des projets `a Gen`eve.
Questions :
1. ecrire en alg`ebre relationnelle les requetes 1, 2, 3 et 5 ;
Voici les requetes demandees :
DateNaissance, Adresse (Prenom=Juliette AND Nom=Rochat (Employe))
Nom, Adresse (NomD=Recherche (Employe 1 Departement))
Nom (Heures>10 AND Lieu=Gen`eve ((Projet 1 Travaille) 1NSS = Employe.NSS Employe))
Nom, Prenom (Nom, Prenom, NSS (Employe) Nom, Prenom, NSS (Travaille 1 Employe))
2. ecrire en SQL toutes les requetes precedentes.
Voici les requetes demandees :
SELECT DateNaissance, Adresse FROM Employe
WHERE ((Nom = Rochat) AND (Prenom = Juliette));
la question pouvait presenter des ambiguites. On pouvait considerer que la requete portaient sur
les projets impliquant Jean Muller ou Annie Grandjean (le et portant alors sur les projets).
Dans ce cas :
SELECT NomP
FROM Employe JOIN (Projet NATURAL JOIN Travaille) USING NSS
WHERE (((Nom = Muller) AND (Prenom = Jean)) OR
((Nom = Grandjean) AND (Prenom = Annie)));
On pouvait egalement considerer que lon cherchait les projets impliquant `a la fois Annie Grandjean
et Jean Muller. Dans ce cas :
SELECT NPro, NomP
FROM Employe JOIN (Projet NATURAL JOIN Travaille) USING NSS
WHERE ((Nom = Grandjean) AND (Prenom = Annie))
INTERSECT (
SELECT NPro, NomP
FROM Employe JOIN (Projet NATURAL JOIN Travaille) USING NSS
WHERE ((Nom = Muller) AND (Prenom = Jean))
);
Dans ce cas, on utilise NPro pour pouvoir verifier que les projets sont bien identiques. On peut
ensuite refaire une projection pour nobtenir que les noms.
SELECT Nom
FROM (
SELECT NSS, Nom FROM Employe
EXCEPT (
SELECT NSS, Nom
FROM Employe JOIN (Projet NATURAL JOIN Travaille) USING NSS
)
);
SELECT Nom
FROM (
SELECT NSS, Nom FROM Employe
EXCEPT (
SELECT NSS
FROM Employe JOIN (Projet NATURAL JOIN Travaille) USING NSS
Il faut egalement enlever les employes qui ne travaillent sur aucun projet.
Corrig
e question e de lexercice 1
Je vous propose de regarder plus en detail le corrige de la question e de lexercice 1. La question est :
quels sont les numeros des articles qui apparaissent dans toutes les commandes du client 10 ? . Jai
tourne un peu en rond avant de trouver une solution propre.
La question nest pas evidente `a formuler en alg`ebre relationnelle. . . On va donc dans un premier temps
proposer une solution en SQL, car laspect declaratif du langage permet de lexprimer plus facilement.
Pour cela, je vais reformuler la question. On cherche les numeros darticles na tels que ces numeros
apparaissent dans toutes les commandes du client 10. On cherche donc les numeros darticles na tels quil
nexiste pas de commande du client 10 dans laquelle na napparat pas. Et hop, on a la solution :)
Je vais construire la solution pas `
a pas, en me permettant dutiliser la variable na dans les etapes
intermediaires. Tout dabord, on va travailler sur les numeros de commandes du client 10. Voici la requete
permettant davoir les numeros de commande du client 10 (facile) :
SELECT noCommande
FROM Commande
WHERE (noClient = 10);
On peut remarquer ensuite que si lon connat un numero de commande nc du client 10, on peut trouver
les tuples de LigneCommande correspondant `a cette commande et tels que le numero de larticle soit na :
SELECT *
FROM LigneCommande
WHERE (LigneCommande.noArticle = na) AND
(LigneCommande.noCommande = nc);
Ensuite, on utilise cette requete pour obtenir les numeros de commande du client 10 tels que larticle
na napparaisse pas dans la commande :
SELECT noCommande
FROM Commande
WHERE ((noClient = 10) AND NOT EXISTS
(SELECT *
FROM LigneCommande
WHERE (LigneCommande.noArticle = na) AND
(LigneCommande.noCommande = Commande.noCommande)
));
Important : Il ne faut pas oublier que la clause WHERE est evaluee pour chaque
tuple des relations considerees, ce qui permet dutiliser Article.noArticle par
exemple.
Reste `a exprimer cette requete en alg`ebre relationnelle. . . Le plus gros probl`eme qui se pose est le fait
que nous navons pas le droit dutiliser des variables intermediaires (on est en math, donc pas deffet de
bord).
Dans un premier temps, on peut trouver les numeros de commande du client 10 :
noCommande (noClient=10 (Commande)). Appelons la relation obtenue N oC. On peut ensuite trouver pour
chaque commande du client 10 les articles correspondants : noCommande,noArticle (LigneCommande 1
NoC ). Appelons la relation obtenue NoCA.
Prenons un exemple. Voici une instance de NoC :
noCommande
1
2
3
Voici une instance de NoCA :
6
noCommande
1
1
2
2
2
3
3
3
noArticle
100
101
100
101
105
100
101
106
Dans ce cas, on voit que les articles 100 et 101 apparaissent dans toutes les commandes du client 10.
On devrait donc obtenir pour solution une table Sol de la forme suivante :
noArticle
100
101
Cest l`a o`
u ca devient difficile. Quelle est la propriete verifiee par Sol ? En fait, Sol est la table maximale
(au sens du nombre de tuples contenus) telle que :
N oC Sol N oCA
Linclusion est ici `
a prendre au sens de linclusion des ensembles de tuples des relations. Sil ny a
pas darticles apparaissant dans toutes les commandes, Sol ne poss`ede pas de tuples. La condition de
maximalite est necessaire, car sinon Sol pourrait ne contenir que le premier tuple et ca marcherait.
Il nous reste donc `
a definir une operation permettant d inverser 1 loperation pour trouver Sol.
On va y aller doucement, en detaillant les etapes. . .
Tout dabord, on remarque que (noArticle (N oCA)) N oC nous donne une table reliant les numeros
de commande `
a tous les articles commandes par le client 10 (dans notre exemple, on aurait ainsi un
tuple (1, 106) dans cette table). Donc ((noArticle (N oCA)) N oC) N oCA nous donne une table dont les
tuples (noCommande, noArticle) qui representent le fait quun article napparat pas dans une commande
particuli`ere. Donc noArticle (((noArticle (N oCA)) N oC) N oCA) nous donne les numeros darticles qui
napparaissent pas dans au moins une commande. La solution est donc donnee (ouf !) par :
noArticle (N oCA) noArticle (((noArticle (N oCA)) N oC) N oCA)
Remarque importante : Promis, il ny aura plus de questions comme ca `
a
lexamen :)
1. Cest bien s
ur une fausse inversion car on a une inclusion et non pas une
egalit
e.