Exemple de la base 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

PREFERENCE(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))}