Une maitresse de maison s'est constitué une base de données sur les personnes qu'elle invite et les plats qu'elle leur sert. Cette base de données est composée de trois relations :
REPAS(date,invité) donne la liste des invités qui ont été reçus et à quelle dateN.B : les attributs "personne" et "invité" ont même domaine.MENU(date,plat) donne le menu servi à chaque date
PREFERENCE(personne,plat) donne pour chaque personne ses plats préférés
Q1 : Quels sont les invités du repas du 010597.en algèbre :
R1 <- SELECTION date=010597 (REPAS)
PROJECTION invité (R1)
ou bien sous forme fonctionnelle :
PROJECTION invité ( SELECTION date=010597 (REPAS))
en SQL :
SELECT distinct invité FROM REPAS
WHERE date=010597
en calcul nuplet :
{r[invité] / REPAS(r) ET r[date]=010597}
en calcul domaine :
{i / REPAS(i, 010597)}
Q2 : Quels sont les plats qui ont été servis à Alice ?
en algèbre :
PROJECTION plat ( SELECTION invité=Alice(REPAS) * MENU)
en SQL :
SELECT distinct plat
FROM REPAS R, MENU M
WHERE R.date=M.date AND invité='Alice'
en calcul nuplet :
{m[plat] / ILEXISTE r (MENU(m) ET REPAS(r) ET m[date]=r[date] ET r[invité]=Alice)}
en calcul domaine :
{p / ILEXISTE d (MENU(d, p) ET REPAS(d, Alice))}
la "jointure" est représentée par le fait d'utiliser la même variable d dans MENU et REPAS.
Q3 : Quels sont les invités qui lors d'un repas ont eu au moins un de leur plat préféré
en algèbre :
PREFERENCES1(personne1, plat1) <- PREFERENCES
PREFERENCES est renommée pour pouvoir faire une theta-jointure avec MENU (sinon un attribut est commun et la theta-jointure est alors impossible).
PROJECTION invité ((MENU * REPAS)*(invité=personne1 ET plat=plat1) PREFERENCES1)
en SQL :
SELECT distinct invité
FROM REPAS R, PREFERENCES P, MENU m
WHERE R.invité=P.personne AND
R.date=M.date AND P.plat=M.plat
en calcul nuplet :
{r[invité] / ILEXISTE m ILEXISTE p (REPAS(r) ET MENU(m) ET PREFERENCES(p) ET r[date]=m[date] ET m[plat]=p[plat] ET r[invité]=p[personne])}
en calcul domaine :
{i / ILEXISTE d ILEXISTE pl (REPAS(i, d) ET MENU(d, pl) ET PREFERENCES(i, pl))}
Q4 : Quel est le produit cartésien entre REPAS et PREFERENCES ?
en algèbre :
REPAS X PREFERENCES
en SQL :
SELECT R.*, P.*
FROM REPAS R, PREFERENCES P
en calcul nuplet :
{r, p / REPAS(r) ET PREFERENCES(p)}
en calcul domaine :
{d, i, pe, pl / REPAS(d, i) ET PREFERENCES(pe, pl)}
Q5 : Quelles sont les personnes qui n'ont jamais été invités ?
en algèbre :
PROJECTION personne (PREFERENCES) -
PROJECTION invité (REPAS)
en SQL :
SELECT personne FROM PREFERENCES
EXCEPT (MINUS avec Oracle)
SELECT invité FROM REPAS
en calcul nuplet :
{p[personne] / QQSOIT r (PREFERENCES(p) ET REPAS(r) ET r[invité] != p[personne]) }
en calcul domaine :
{pe / ILEXISTE pl ILEXISTE d (PREFERENCES(pe, pl) ET REPAS(pe,d))}
Q6 : Quels sont les invités qui sont venus à tous les repas ?
en algèbre :
REPAS / PROJECTION date (REPAS)
en SQL :
SELECT invité FROM REPAS
GROUP BY invité
HAVING count(*) =
(SELECT count(distinct date)
FROM REPAS)
en calcul nuplet :
EDATE <- {r[date] / REPAS(r)}
{r[invité] / QQSOIT e (REPAS(r) ET EDATE(e) ET r[date]=e[date])}
en calcul domaine :
{i / QQSOIT d (REPAS(i, d))}