ExosSQL 2 3 Correction
ExosSQL 2 3 Correction
ExosSQL 2 3 Correction
Corrigé TP SQL N° 2 et 3
R11)) Quelles sont les personnes, les cafés qu'ils fréquentent, et les boissons servies par ces cafés.
R
+----------+----------+----------+
| personne | cafe | boisson |
+----------+----------+----------+
| ali | atlas | 7up |
| ali | atlas | oulmes |
| ali | rif | coca |
| amine | commerce | coca |
| amine | commerce | oulmes |
| amine | commerce | 7up |
| amine | commerce | orangina |
| aziz | atlas | 7up |
| aziz | atlas | oulmes |
| aziz | commerce | orangina |
| aziz | commerce | coca |
| aziz | commerce | oulmes |
| aziz | commerce | 7up |
| aziz | rif | coca |
| said | atlas | 7up |
| said | atlas | oulmes |
+----------+----------+----------+
R22)) Quelles sont les personnes qui fréquentent des cafés qui servent des boissons qu'ils aiment.
R
+----------+----------+---------+
| personne | cafe | boisson |
+----------+----------+---------+
| ali | atlas | 7up |
| ali | atlas | oulmes |
| ali | rif | coca |
| amine | commerce | oulmes |
| amine | commerce | coca |
| aziz | atlas | oulmes |
| aziz | atlas | 7up |
| aziz | commerce | 7up |
| aziz | commerce | oulmes |
+----------+----------+---------+
9 rows in set (0.00 sec)
Question subsidiaire:
R22'')) Quelles sont les personnes qui fréquentent des cafés (au moins un) qui servent des boissons qu'ils n'aiment pas.
R
R
R22'' -- aa)) Créer la relation aimePas.
Expression
DIFF ( CART (PROJECT (aime, personne), PROJECT (aime, boisson)), aime)
algébrique :
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 1 of 7
Corrigé TP SQL 2 et 3
+----------+----------+
| personne | boisson |
+----------+----------+
| ali | orangina |
| amine | orangina |
| amine | 7up |
| aziz | coca |
| aziz | orangina |
| said | 7up |
| said | oulmes |
+----------+----------+
R22'' -- bb)) Résultat : on crée une relation X qui répond à la requête « Quelles sont les personnes qui fréquentent des cafés (au moins un) qui
R
servent des boissons qu'ils n'aiment pas ».
create view X as select f.personne, f.cafe, s.boisson
from frequente f, sert s, aimePas a
where f.cafe = s.cafe
and f.personne = a.personne
and s.boisson = a.boisson;
select * from X;
+----------+----------+----------+
| personne | cafe | boisson |
+----------+----------+----------+
| amine | commerce | orangina |
| amine | commerce | 7up |
| aziz | commerce | coca |
| aziz | rif | coca |
| aziz | commerce | orangina |
| said | atlas | 7up |
| said | atlas | oulmes |
+----------+----------+----------+
Où on voit que, par rapport à la requête RR22, Ali n'appartient pas à X (ne fréquente que les cafés qui servent des boissons qu'il aime :-)), et
Said appartient à X mais pas à RR22 (ne fréquente que les cafés qui servent des boissons qu'il n'aime pas :-( )
+----------+
| cafe |
+----------+
| commerce |
+----------+
1 row in set (0.00 sec)
R44)) Quelles sont les personnes qui ne fréquentent que les cafés qui servent des boissons qu'ils aiment (Ali).
R
Soit:
X = Personnes fréquentant un café servant au moins une boisson qu'elles n'aiment pas (R2') et
Y = Personnes fréquentant un café servant au moins une boisson qu'elles aiment (R2)
+----------+
| personne |
+----------+
| ali |
+----------+
R55)) Quelles sont les personnes qui ne fréquentent que les cafés qui servent des boissons qu'ils n'aiment pas (Said).
R
réponse = X - Y
select distinct personne
from X
where not exists (select *
from Y
where X.personne = Y.personne)
+----------+
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 2 of 7
Corrigé TP SQL 2 et 3
| personne |
+----------+
| said |
+----------+
/fin
Corrigé TP SQL N° 3
R
Reellaattiioonn parent iinniittiiaallee
parent
+--------+--------+
| parent | enfant |
+--------+--------+
| Ali | Fatima |
| Ali | Kacem |
| Fatima | Amina |
| Fatima | Aziz |
| Kacem | Aziza |
| Aziz | Saida |
| Saida | Farid |
+--------+--------+
L
Laa rreellaattiioonn ffrreerree
+-------+--------+
| f1 | f2 |
+-------+--------+
| Kacem | Fatima |
| Aziz | Amina |
+-------+--------+
R
Reellaattiioonn ccoouussiinn
+-------+-------+
| c1 | c2 |
+-------+-------+
| Amina | Aziza |
| Aziz | Aziza |
+-------+-------+
R
Reellaattiioonn oonnccllee ((oouu ttaannttee))
+--------+-------+
| o | n |
+--------+-------+
| Kacem | Amina |
| Kacem | Aziz |
| Fatima | Aziza |
+--------+-------+
Pour avoir les oncles rajouter dans la clause where "and a.parent in (select * from male);"
create view oncle (o, n) as
select a.parent, b.enfant
from parent a, parent b, frere f
where (b.parent = f.f2
and a.parent = f.f1)
or (b.parent = f.f1
and a.parent = f.f2)
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 3 of 7
Corrigé TP SQL 2 et 3
R
Reellaattiioonn G
Grraanndd ppaarreenntt GP
+--------+-------+
| gp | pf |
+--------+-------+
| Ali | Amina |
| Ali | Aziz |
| Ali | Aziza |
| Fatima | Saida |
| Aziz | Farid |
+--------+-------+
R
Reellaattiioonn aannccêêttrree
Ici, nous avons affaire à une relation obtenue par fermeture transitive. un ancêtre est un parent ou un grand-parent ou un arrière grand-
parent à un niveau quelconque. C'est ce niveau quelconque qui est indéfini à l'avance.
M
Méétthhooddee ddee ccaallccuullee
Le calcul consiste donc à progresser, chercher le grand-parent, ensuite le parent du grand-parent, le parent de ce dernier, etc. Jusqu'à ne
plus rien obtenir quand on a atteint le dernier ancêtre connu qui n'a donc pas de parent (connu) dans la base.
Reprenons la table parent ci-dessus et cherchons un à un les ancêtres, en commençant par le parent.
Cela donne :
+--------+--------+
| anc | des |
+--------+--------+
| Ali | Fatima |
| Ali | Kacem |
| Aziz | Saida |
| Fatima | Amina |
| Fatima | Aziz |
| Kacem | Aziza |
| Saida | Farid |
+--------+--------+
7 rows in set (0.00 sec)
+--------+-------+
| anc | des |
+--------+-------+
| Ali | Amina |
| Ali | Aziz |
| Ali | Aziza |
| Aziz | Farid |
| Fatima | Saida |
+--------+-------+
5 rows in set (0.00 sec)
+--------+-------+
| anc | des |
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 4 of 7
Corrigé TP SQL 2 et 3
+--------+-------+
| Ali | Saida |
| Fatima | Farid |
+--------+-------+
2 rows in set (0.00 sec)
+-----+-------+
| anc | des |
+-----+-------+
| Ali | Farid |
+-----+-------+
1 row in set (0.00 sec)
+--------+--------+
| anc | des |
+--------+--------+
| Ali | Fatima |
| Ali | Saida |
| Ali | Kacem |
| Ali | Amina |
| Ali | Aziz |
| Ali | Farid |
| Ali | Aziza |
| Aziz | Saida |
| Aziz | Farid |
| Fatima | Farid |
| Fatima | Amina |
| Fatima | Aziz |
| Fatima | Saida |
| Kacem | Aziza |
| Saida | Farid |
+--------+--------+
15 rows in set (0.00 sec)
jusqu'à ce qu'on obtienne une relation vide, i.e. on a atteint le dernier ancêtre connu.
F
Foorrm
mee A
Allggéébbrriiqquuee
Soit aannccêêttrreei (anc, desc) la table mettant en relation an ancêtre avec un descendant.
aannccêêttrree00 = parent
aannccêêttrree11 = project ( join (parent a, parent b, a.enfant = b.parent), a.parent, b.enfant)
aannccêêttrree22 = project ( join (aannccêêttrree11 a, parent b, a.enfant = b.parent), a.parent, b.enfant)
...
aannccêêttrreenn = Project ( join (aannccêêttrreenn--11 a, parent b, a.enfant = b.parent), a.parent, b.enfant)
P
Prrooggrraam
mmmaattiioonn aavveecc S
SQQL
L
Il faut faire un programme (e.g. PLSQL, ESQL ou php-MySQL) pour calculer cette relation, par récursion ou boucle while.
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 5 of 7
Corrigé TP SQL 2 et 3
(U) |
| v
| anc_i+1
| |
<---------------
On va initialement créer la table finale ancetre (ancetre, descendant), qui sera alimentée au fur et à mesure par les tuples de anci
calculés à chaque itération. Représenté par (U) sur la figure.
Voici un programme PHP-MySQL qui calcule cette table ancêtre. Dans ce listing, last_anc et new_anc sont respectivement les deux table
"variables de contrôle" anc_i et anc_i+1 de la figure ci-dessus.
<?php
//
// On se connecte au serveur
//
//
// On choisit la base
//
$c = mysql_select_db("Famille",$link);
//
// On Traite
//
if ($n > 0) {
/** il y a résultat **/
/*** On cumule sur ancetres ***/
mysql_query("insert into ancetres select * from new_anc;", $link);
//
// On interroge
//
echo "<b>$table</b>";
$result = mysql_query("SELECT * FROM $table order by 1",$link);
//
// On presente le resultat en table
// Usage de fetch_row et de row[n° colonne]
//
printf( "</table>");
return;
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 6 of 7
Corrigé TP SQL 2 et 3
}
?>
Dans ce programme, le résultat est affiché dans une page HTML. Seule la partie <table>...</table> est considérée.
https://www.emi.ma/ntounsi/COURS/DB/Polys/SQL/Exer... 7 of 7