© Your Copyright
CREATE TABLE repas (
jour DATE,
personne VARCHAR(20)
);
CREATE TABLE menus (
jour DATE,
plat VARCHAR(50)
);
CREATE TABLE gouts (
personne VARCHAR(20),
plat VARCHAR(50)
);
INSERT INTO menus VALUES ('2017-01-01','choucroute');
INSERT INTO menus VALUES ('2017-01-01','raclette');
INSERT INTO menus VALUES ('2017-01-02','kig ha farz');
INSERT INTO menus VALUES ('2017-01-02','raclette');
INSERT INTO repas VALUES ('2017-01-01','Jojo');
INSERT INTO repas VALUES ('2017-01-02','Jojo');
INSERT INTO repas VALUES ('2017-01-02','Nono');
INSERT INTO repas VALUES ('2017-01-01','Bibi');
INSERT INTO gouts VALUES ('Jojo','kig ha farz');
INSERT INTO gouts VALUES ('Jojo','raclette');
INSERT INTO gouts VALUES ('Bibi','cassoulet');
INSERT INTO gouts VALUES ('Nono','raclette');
INSERT INTO gouts VALUES ('Nanard','pizza');
Calcul relationnel de domaine :
- \(R=\{ p \; | repas(jour='2017-01-01',p:personne)\}\)
Algèbre relationnelle :
- \(R=\Pi_{personne}(\sigma_{[jour='2017-01-01']}(repas))\)
Requête SQL :
SELECT personne FROM repas WHERE jour='2017-01-01';
Calcul relationnel de n-uplets
- \(R=\{ m.plat \; | \; m \in menus \land r \in repas \land m.jour=r.jour \land r.personne='Nono'\}\)
Algèbre relationnelle :
- \(R=\Pi_{plat}(\Join_{[menus.jour=repas.jour]}(menu,\sigma_{[personne='Nono']}(repas)) )\)
Requête SQL :
-- produit cartésien et restriction SELECT DISTINCT plat FROM repas r, menus m WHERE r.jour=m.jour AND personne='Nono'; -- jointure naturelle SELECT DISTINCT plat FROM repas r NATURAL JOIN menus m WHERE personne='Nono';
- \(R=\Pi_{personne}(\Join_{[repas.jour=menus.jour]}(repas,\Join_{[menus.plat=gouts.plat]}(menus,gouts)) )\)
Une formulation en langage naturel pourrait être :
- « Rechercher les personnes qui lors d’un repas ont eu au moins un de leur plat préféré. »
Ecrire la requête SQL correspondante
-- Jointure naturelle SELECT DISTINCT personne FROM repas NATURAL JOIN menus NATURAL JOIN gouts; -- Produit cartesien, restriction SELECT DISTINCT r.personne FROM repas r, menus m, gouts g WHERE r.jour=m.jour AND g.plat=m.plat AND r.personne=g.personne;
Ecrire la requête en calcul relationnel de n-uplets
- \(R=\{ r.personne \; | \; r \in repas \land m \in menus \land p \in gouts \land r.jour=m.jour \land m.plat=p.plat\}\)
Calcul relationnel de n-uplets
- \(R=\{ nom \; | \; (nom:g.personne, g \in gouts) \land \neg (nom:r.personne, r \in repas) \}\)
ou :
- \(R=\{ nom \; | \; (nom:g.personne, g \in gouts) \} \setminus \{ nom \; | \; (nom:r.personne, r \in repas) \}\)
Algèbre relationnelle :
- \(R_1=\Pi_{personne}(gouts)\)
- \(R_2=\Pi_{personne}(repas)\)
- \(R=\setminus(R_1,R_2)\)
ou :
- \(R=\setminus(\Pi_{personne}(gouts),\Pi_{personne}(repas))\)
Requête SQL :
SELECT personne FROM gouts EXCEPT SELECT personne FROM repas; -- ou : requete imbriquee avec IN SELECT personne FROM gouts WHERE personne NOT IN ( SELECT personne FROM repas ); -- ou : requete imbriquee avec EXISTS SELECT personne FROM gouts g WHERE NOT EXISTS ( SELECT * FROM repas r WHERE g.personne=r.personne );
\(R=\{ p \; | \; \forall j \; repas(j:jour,p:personne), menus(j,-) \}\)
Une formulation en langage naturel pourrait être :
- « Rechercher les personnes qui sont venues à tous les repas. »
Ecrire la requête SQL correspondante
-- Double NOT EXISTS SELECT DISTINCT personne FROM repas re WHERE NOT EXISTS ( SELECT * FROM menus m WHERE NOT EXISTS ( SELECT * FROM repas ri WHERE m.jour=ri.jour AND ri.personne=re.personne ) ); -- NOT EXISTS, EXCEPT SELECT DISTINCT personne FROM repas re WHERE NOT EXISTS (SELECT jour FROM menus EXCEPT SELECT jour FROM repas ri WHERE ri.personne=re.personne); -- GROUP BY HAVING, COUNT SELECT personne FROM repas GROUP BY personne HAVING COUNT(DISTINCT jour) = ( SELECT COUNT(DISTINCT jour) FROM menus );
Ecrire la requête en algèbre relationnelle.
- \(R=\div(repas,\Pi_{jour}(menus))\)
SELECT *
FROM menus me
WHERE
(
SELECT plat
FROM gouts
WHERE personne='Jojo'
EXCEPT
SELECT plat
FROM menus mi
WHERE me.jour = mi.jour
) IS NULL;
Trouvez les formulations :
En langage naturel :
- Rechercher les menus dont les plats correspondront à tous les goûts de “Jojo”
En calcul relationnel de n-uplets :
- \(R=\{ m \; | \; m \in menus \land \forall ('Jojo',plat) \in gouts, (m.jour,plat) \in menus\}\)
En algèbre relationnelle :
- \(R=\div(menus,\Pi_{plat}(\sigma_{[personne='Jojo']}(gouts)))\)
TablesOpérateurs unairesOpérateurs binaires |
Vue d'ensemble | |
---|---|
|