Tutoriel de Bases de Données Relationnelles

Tutoriel de Bases de Données Relationnelles

Accueil  > Supports pédagogiques > Exercices > Algèbre relationnelle > La base des invitations

Exercices illustrant les différents langages relationnels et SQL

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

[fil RSS du site]
Dernière mise à jour : 21/09/2014