Base de données des invitations
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 date
MENU(date,plat) donne le menu servi à chaque date
PREFERENCES(personne,plat) donne pour chaque personne ses plats préférés
N.B : les attributs "personne" et "invité" ont même domaine.
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))}