Vous êtes sur la page 1sur 31

Algèbre relationnelle

Eléments de base

 Univers : ensemble fini d ’attributs, U


 Attribut : associé à un ensemble de
valeurs appelé domaine, dom(A)
 Schéma relationnel : sous-ensemble
non vide de l ’univers
 n-uplet sur le schéma R : application
de R dans l ’union des domaines des
attributs de R
Eléments de base
(exemple)

 U = {num_et, nom_et, adr_et,


num_p, nom_p, adr_p,
num_c, nom_c}
 R= {num_et, num_c}
t : R → dom(num_et) ∪ dom(num_c)
num_et → n1
num_c → n2
 Notation : t = (n1, n2)
Eléments de base (suite)

 Relation sur R : ensemble fini de n-


uplets définis sur R
 Base de données sur U : ensemble de
relations définies sur des schémas de U

 Remarque : plusieurs relations d ’une


même base peuvent avoir le même
schéma
Exemple
 BD = {etud, prof, cours, inscrit}
 Avec :
 etud[num_et, nom_et, adr_et]
 prof[num_p, nom_p, adr_p]
 cours[num_c, nom_c, num_p]
 inscrit[num_et, num_c]

 Remarque : on peut ajouter


 anc_etud[num_et, nom_et, adr_et]
Algèbre relationnelle

 Combine les relations pour exprimer les


requêtes
 Formalisme rigoureux dont le pouvoir
d ’expression est « fort » : ~ logique du
1er ordre
 Propriétés formelles pour optimiser le
calcul des réponses
Opérations de base

 Opérations ensemblistes :
 union, intersection, différence

 Opérations relationnelles :
 projection
 sélection
 jointure
 renommage
Projection

 r[R] et X sous-ensemble de R
 Projection de r sur X :
 relation définie sur X contenant les
restrictions sur X des n-uplets de r
 notation : ∏x(r)
 ∏x(r) = {u | ∃ t dans r tel que u=t.R}

 Remarque : attention à l ’écriture


 ∏x(r) = {t.R | t dans r}
Projection - Exemple

 etud[num_et, nom_et, adr_et]


 X = nom_et, adr_et
 ∏x(etud)
 liste des noms et adresses des étudiants

 Attention : si Y = nom_et, adr_p


 ∏y(etud) n ’est pas défini
Sélection
 r[R] relation définie sur R
 C condition de sélection de la forme
 C = (A comp a), ou C = (A comp B)
 C combinaison par les connecteurs logiques
 Sélection de r selon C
 relation définie sur R
 notation : σC(r)
 σC(r) est l ’ensemble des n-uplets de r qui
satisfont C
Sélection - Exemple
 etud[num_et, nom_et, adr_et]
 C = (adr_et = Casa ou num_et > 100)
 σC(etud)
 liste des étudiants dont l ’adresse est Casa ou
dont le numéro est supérieur à 100
 ∏nom_et(σC(etud))
 liste des noms de ces étudiants
 Attention : si C = (nom_p = nom_et)
 σC(etud) n ’est pas défini
Jointure
 r[R] et s[S] deux relations
 Jointure de r par s
 relation définie sur R ∪ S
 notation : r s
r s = {t | t.R ∈ r et t.S ∈ s}

 Remarques
 une jointure est toujours définie
 opération coûteuse à calculer
Jointure - Exemple

 etud[num_et, nom_et, adr_et]


inscrit[num_et, num_c]
 etud inscrit
 définie sur num_et, nom_et, adr_et, num_c
 liste des inscriptions des étudiants
 ∏nom_et,num_c(etud inscrit)
 liste des noms des étudiants et des numéros
des cours auxquels ils sont inscrits
Jointure - Exemple (suite)

 etud prof
 définie? Sur quel schéma?
 Signification intuitive?

 etud etud
 définie? Sur quel schéma?
 Signification intuitive?
Jointure - Propriétés

 ∏R(r s) = r ?

 ∏R(r s) ∏S(r s) = r s?

 r[RS], ∏R(r) ∏S(r) = r ?

 σC(r s) = σC(r) s?
Renommage
 r[R] , A attribut de R , A1 nouveau nom
pour A
 Renommage de A en A1 dans r
 relation définie sur (R - {A}) ∪ {A1}
 notation : ρA1←A(r)
 ρA1←A(r) contient les mêmes n-uplets que r

 Utilisation : avoir deux versions distinctes


d ’une même relation
Renommage - Exemple

 Numéros des étudiants inscrits à plus d ’un


cours ?
 inscrit[num_et, num_c] (1ère version)
 ρn←num_c(inscrit) (2ème version)

 ρn←num_c(inscrit) inscrit (jointure)

 σnum_c≠n(ρn←num_c(inscrit) inscrit) (sélection)

 ∏num_et(σnum_c≠n(ρn←num_c(inscrit) inscrit))
Opérations ensemblistes

 r[R] et s[R] définies sur le même


schéma R
r ∪ s , r ∩ s , r - s
 définies sur R
 sémantique habituelle

 Remarque : r ∩ s = r s
Opérations ensemblistes -
Exemples

 Liste de tous les noms, prof et étudiants


 ∏nom_p(prof) ∪ ∏nom_et(etud) non défini
 ρn←nom_p(∏nom_p(prof)) ∪ ρn←nom_et(∏nom_et(etud))

 Numéros des étudiants inscrits à un seul


cours
 ∏num_et(inscrit) -
∏num_et(σnum_c≠n(ρn←num_c(inscrit) inscrit))
Opérations ensemblistes -
Propriétés

 Sélection
 σC(r θ s) = σC(r) θ σC(s) ?
 Projection
 ∏x(r ∪ s) = ∏x(r) ∪ ∏x(s) ?
 ∏x(r ∩ s) = ∏x(r) ∩ ∏x(s) ?
 ∏x(r - s) = ∏x(r) - ∏x(s) ?
 Jointure
 (r θ r’) s = (r θ s) (r’ θ s) ?
Extension : quotient
relationnel
 Liste des numéros des étudiants inscrits à
tous les cours ?
 n est dans la réponse si pour tout n_c
dans cours, (n, n_c) est dans inscrit

 D ’où la formule pour la réponse :


 {n | (∀ (n_c,x) ∈ cours), (n, n_c) ∈ inscrit}
 Ecriture algébrique :
 inscrit ÷ ∏num_c(cours)
Extension : quotient
relationnel

 r[R] et s[S] telles que S ⊆ R


 Quotient de r par s
 relation définie sur R - S
 notation : r ÷ s
 r ÷ s = {t | (∀u∈s)(∃v ∈r)(v.R=t et v.S=u)}

 Propriété :
 r ÷ s = ∏R-S(r) - ∏R-S ((∏R-S(r) s) - r)
Algèbre relationnelle et
SQL

 Projection, sélection, jointure :


 SELECT <attributs de la projection>
 FROM <relations de l ’expression>
 WHERE <condition de sélection>
AND <conditions de jointure>
 Renommage :
 au niveau des attributs
 au niveau des relations
Algèbre relationnelle et
SQL - Exemples

 ∏nom_et,adr_et(σnum_c≠123(etud inscrit))

 SELECT nom_et, adr_et


 FROM etud, inscrit
 WHERE num_c ≠ 123
AND etud.num_et = inscrit.num_et
Algèbre relationnelle et
SQL - Exemples

 ∏num_et(σnum_c≠n(ρn←num_c(inscrit) inscrit))

 SELECT inscrit.num_et
 FROM inscrit, inscrit inscr
 WHERE inscrit.num_c ≠ inscr.num_c
AND inscrit.num_et = inscr.num_et
Algèbre relationnelle et
SQL
 Opérations ensemblistes
 union, intersect, minus
 entre deux clauses SELECT FROM WHERE

 Liste des noms et adresses des étudiants


inscrits seulement au cours de numéro
123
 Algèbre relationnelle ?
 SQL ?
Quotient relationnel et SQL
 r[A, B] , s[B]
 r ÷ s défini sur A par

 SELECT distinct A FROM r


WHERE NOT EXISTS
((SELECT r’.A, s.B
FROM r r’ , s
WHERE r.A = r’.A)
MINUS
(SELECT * FROM r))
Quotient relationnel et SQL
 Utilisation des vues
 CREATE VIEW <nom_de_vue> AS
(<requête SQL>)

 Liste des noms des étudiants habitant


Casa et inscrits à tous les cours assurés
par un prof habitant Tours
 Créer une vue pour chaque relation r et s
 Appliquer la requête précédente
Fonctions en SQL
 Fonctions classiques :
 min, max, avg, count, sum

 Exemple : inscrit[num_et, num_c]


 Nombre de cours où l ’etudiant de num 123
est inscrit
 SELECT count(distinct num_c)
FROM inscrit
WHERE num_et = 123
Fonctions en SQL et
groupements

 Généraliser la requête précédente pour


chaque étudiant

 Utilisation de GROUP BY
 SELECT num_et, count(distinct num_c)
FROM inscrit
GROUP BY num_et
Fonctions en SQL et
groupements - Exemple
 result[num_et, num_c, note]
 Liste des numéros des étudiants inscrits à
plus de 3 cours, avec leur moyenne
générale

 SELECT num_et, avg(note)


FROM result
GROUP BY num_et
HAVING count(distinct num_c) > 3