Bases de données relationnelles Calcul Relationnel 1 Sommaire Introduction Calcul de Tuple Quel Calcul de Domaines QBE Conclusion 2 1
Introduction Différentes langages ont été proposé pour manipuler des données relationnel; Deux modèle principaux: algébrique et prédicatif; 3 LMD relationnels algébriques (rappel) L algèbre relationnelle permet de spécifier quelles sont les opérations à exécuter pour calculer le résultat de la requête Exemple: π [code-j] ( σ [adresse = "Bienne"] Dépôt Livraison) SQL est une version orientée utilisateur de l algèbre relationnelle SELECT CODE-J FROM DEPOT, LIVRAISON WHERE DEPOT.NO-DEPOT = LIVRAISON.NO- DEPOT AND ADRESSE = 'Bienne'; 4 2
LMD prédicatifs Un langage prédicatif permet de ne spécifier que le résultat cherché (pas comment le calculer) spécification des prédicats qui doivent être vérifiés par les données pour former le résultat Ces langages sont dits prédicatifs car il sont basés sur le calcul de prédicats (logique 1 er ordre) Un langage prédicatif est donc plus simple qu une algèbre 5 Modèle général Requête BD R1 R2 6 3
LMD relationnels prédicatifs 7 Il existe deux types de langages prédicatifs relationnels Calcul de tuples : les variables dans les expressions logiques portent sur les tuples des relations (QUEL) x Etudiant Calcul de domaines : les variables dans les expressions logiques portent sur les valeurs des attributs des tuples (QBE) x Etudiant.nom Calcul de tuples 8 4
Format d'une requête 9 1) Déclaration des variables (tuples) sur des relations ou des unions de relations compatibles x1 R1, x2 R2, xi Ri Rj,.. xn Rn 2) Spécification du format du résultat 3) Spécification d une condition (prédicat) { x1.a, x1.b, xi.d / f x1,x2, xn } où : Format du résultat Prédicat f x1,x2, xn est une formule logique valide xi.d représente la valeur de l'attribut D dans le tuple xi Exemple de requête relation Étudiant (n, nom, prénom, année) Requête : nom et prénom des étudiants nés après 1980 π [nom, prénom] σ [année > 1980] Etudiant déclaration de variable e Etudiant { e.nom, e.prénom e.année > 1980 } 10 spécification du format du résultat prédicat à satisfaire par les tuples désignés par e 5
Requête multi-relation Etudiant (n, nom, prénom, année) Inscription (n o ét, nomc, note1, note2) Requête : n o, prénom, notes des étudiants de nom "Rochat" inscrits au cours "BD" e Etudiant, i Inscription { e.n o, e.prénom, i.note1, i.note2 e.nom = "Rochat" i.nomc = "BD" e.n o = i.n o ét } 11 : ET : OU : NON Algèbre / calcul π [n o, prénom, note1, note2] σ [nom = "Rochat" nomc = "BD"] ( Étudiant *[n o = n o ét] Inscription ) e Etudiant, i Inscription { e.n o, e.prénom, i.note1, i.note2 e.nom = "Rochat" i.nomc = "BD" e.n o = i.n o ét } Même puissance d'expression 12 6
Format d'une requête 1) déclaration des variables (tuples) x1 R1, x2 R2, xi Ri Rj,.. xn Rn 2) spécification du format du résultat 3) spécification du prédicat { x1.a, x2.b, xn.d / f x1,,x2,,,xn,xn+1,,xn+m } f x1,x2,,xn,xn+1,..,xn+m est une formule logique valide 13 ayant pour variables libres exactement x 1... x n (Les autres variables x n+1... x n+m doivent être liées) Formule valide 14 Formule élémentaire : x.a oper-comparaison constante x.a oper-comparaison y.b oper-comparaison : =,, <, >,, Exemples x.nom="rochat" x.nom = y.nom x et y sont des variables libres Pour lier x et y: ajout de ou de y (x.nom = y.nom) y est liée, x est libre 7
Formule valide (suite) Formule valide : formule élémentaire formule formule formule formule formule Si f x est une formule valide où x est une variable libre, alors : x f x est une formule valide où x est liée "il existe au moins un tuple x tel que fx soit vrai" x f x est une formule valide où x est liée "pour tous les tuples x, f x est vrai" 15 Formules valides - Exemples 16 Etudiant (n, nom, prénom, année) x Etudiant x (x.nom="rochat") est vrai s'il y a un étudiant de nom Rochat dans Etudiant x est une variable liée x (x.année>1980) est vrai si tous les étudiants sont nés après 1980 x est une variable liée 8
Quantificateur "il existe" Etudiant (n, nom, prénom, année) Inscription (n ét, nomc, note1, note2) Requête : nom, prénom des étudiants ayant réussi brillamment un cours e Etudiant, i Inscription { e.nom, e.prénom i (e.n o = i.n o ét i.note1 = 6 i.note2 = 6) } 17 Quantificateur "pour tous" Requête : nom, prénom des étudiants n'ayant aucune inscription e Etudiant, i Inscription { e.nom, e.prénom i (e.n o i.n o ét) } e Etudiant i Inscription 18 9
Sémantique d'une requête (1) x R, y S, z T { x.a, y.b fx,y,z } Faire le produit cartésien des relations à variables libres R x S Sélectionner les tuples du produit qui satisfont la formule fx,y,z Exemple: e Etudiant, i Inscription { e.nom, e.prénom i (e.no i.noét) } 19 Sémantique d'une requête (2) x R, y S, z T {x.a, y.b fx,y,z } Pour tout tuple, x, de R faire : Pour tout tuple, y, de S faire : Si fx,y,z est vrai alors ajouter <x.a,y.b> au résultat fin pour tout y de S fin pour tout x de R 20 NB Le test de fx,y,z implique pour chaque variable liée (ici z) le parcours de la relation correspondante (ici T) 10
Logique du 1er ordre - Rappels L'opérateur logique => (implique) ne fait pas partie des opérateurs du calcul f1 => f2 est équivalent à : f1 f2 x fx est équivalent à : x ( fx ) Quantificateurs sur un ensemble vide Soit x R si R est vide, alors x fx = Vrai x fx = Faux 21 Exemples - Bars à bières Bière (bière, degré, couleur, pays, goût) Bar (bar, quartier) Personne (nom, quartier, age, sexe) Sert (bar, bière) tel bar sert telle bière A bu (buveur, bière, bar, jour, mois, année, qté) tel jour, tel buveur a bu telle bière dans tel bar en telle quantité (qté) 22 11
Exemples (1) 23 Noms des bars fréquentés par Philippe ce mois ci u Abu { u.bar / u.buveur="philippe" u.mois=1 u.année=2005 } Noms des bars fréquentés par Philippe ce mois ci avec les bières bues et leur pays u Abu, i Bière { u.bar, u.bière, i.pays / u.buveur="philippe" u.mois=1 u.année=2005 u.bière=i.bière } Exemples (2) 24 Nom, âge et quartier des personnes qui ont fréquenté au moins un bar p Personne, u Abu { p.nom, p.age, p.quartier / u (p.nom=u.buveur)} Nom, âge et quartier des personnes qui ont fréquenté tous les bars p Personne, a Bar, u Abu { p.nom, p.age, p.quartier / u a (p.nom=u.buveur u.bar=a.bar) } 12
Exemples (3) Nom des personnes qui n'ont jamais fréquenté un bar p Personne, u Abu { p.nom / u (p.nom=u.buveur) } 25 Nom, âge et quartier des personnes qui ont fréquenté au moins un bar du quartier de la gare p Personne, u Abu, a Bar { p.nom, p.age, p.quartier / a u ( a.quartier="gare" u.bar=a.bar p.nom=u.buveur) } Exemples (4) 26 Nom des personnes qui ont bu une brune et une blonde le même jour dans le même bar u1 Abu, u2 Abu, b1 Bière, b2 Bière { u1.buveur / u2 (u1.bar=u2.bar u1.jour=u2.jour u1.mois=u2.mois u1.année=u2.année u1.buveur=u2.buveur b1 (u1.bière=b1.bière b1.couleur="blonde") b2 (u2.bière=b2.bière b2.couleur="brune") ) } 13
Sécurité d Expression Quantificateurs universel, existentiel où négation peuvent rendre des expressions sans sens: ex: e in étudiant {e.name not e} Le résultat comprend tous les tuples qui ne sont pas étudiant pour éviter L expression doit restreindre l univers p Personne, u Abu { p.nom / u ( Abu) or (p.nom=u.buveur) } 27 QUEL (INGRES puis PostGrès) RANGE OF e is Etudiant e Etudiant RANGE OF i is Inscription RETRIEVE [INTO nomrésultat] (e.nom, e.prénom) [WHERE e.n o =i.n o ét AND note1=6 AND note2=6] Range: définition des variables Retrieve: définition du résultat Where: formule bien formée (prédicats) Mais: pas de quantificateur! e Etudiant, i Inscription { e.nom, e.prénom / i (e.no = i.noét i.note1 = 6 i.note2 = 6) } 28 14
QUEL et les quantifieurs la formule en QUEL ne contient pas de quantificateurs implicite pour toutes les variables non citées dans la liste après le RETRIEVE est réalisé en utilisant la fonction COUNT: COUNT (x.a WHERE ƒ) = 0 x.a (ƒ) x ƒ? f ƒ? = 0 f x (ƒ) 29 RANGE of e is Etudiant, RANGE of i is Inscription RETRIEVE e.nom WHERE COUNT(i.n o ét WHERE e.n o =i.n o ét )= 0 e Etudiant, i Inscription { e.nom i(e.n o i.n o ét) Quel: ajout RANGE OF e is Etudiant RANGE OF en is Enseignant RETRIEVE INTO Et.Ens(e.nom, e.prénom) APPEND TO Et.Ens (en.nom, en.prénom) e en Et.Ens π [nom, prénom] Etudiant π [nom, prénom] Enseignant 30 15
QUEL: mise à jour APPEND TO... ajouter un tuple à une relation DELETE nomvariable [WHERE formule] supprimer un tuple d'une relation supprimer un ensemble de tuples d'une relation REPLACE nomvariable (nom attribut =...) WHERE [ƒ ] mettre à jour de la valeur de l attribut exemple: REPLACE dép (nomd = ISC ) WHERE nomd = DSC 31 Calcul de domaines 32 16
Calcul des domaines Similaire au calcul des tuples mais variables portent sur les valeurs d'un attribut et non sur les tuples 1) Déclaration des variables (tuples) sur des relations ou des unions de relations compatibles x1 R1.A, x2 R2.B,, xi Ri.C Rj.D,, xn Rn.S 2) Spécification du format du résultat 3) Spécification du prédicat { x1, x2, xi / fx1,x2, xn } 33 où : fx1,x2, xn est une formule logique valide ayant pour variables libres exactement x1... xi (Les autres variables xi+1... xn doivent être liées) 34 Calcul des domaines, formule Formule valide définie comme en calcul des tuples Formule de deux types: x.a op constante ou x.a op y.b (op: =,, <, >,, ) Formule d'appartenance: R(A:v1, B:v2,...) où A,B,... sont des attributs de la relation R, v1,v2,... sont soit des constantes, soit des variables. Une condition d'appartenance R(A:v1, B:v2,..., E:vi) est vraie ssi dans la relation R il existe au moins un tuple ayant v1 comme valeur pour l'attribut A, v2 comme valeur pour l'attribut B,..., et vi comme valeur pour l'attribut E. 17
Exemple (1) Etudiant (nom, prénom, année, no) Inscription (noét, nomc, note1, note2)} Requête: nom, prénom des étudiants n Etudiant.nom p Etudiant.prénom { n, p (Etudiant (nom: n, prénom: p)} 35 Requête: nom, prénom des étudiants nés en 1989 n Etudiant.nom p Etudiant.prénom { n, p (Etudiant (nom: n, prénom: p, année: 1989)} Exemple (2) Requête: nom, prénom des étudiants nés après 1986 n Etudiant.nom p Etudiant.prénom a Etudiant.année { n, p a (Etudiant (nom: n, prénom: p, année: a) a>1986 } 36 18
Exemple (3) Etudiant (nom, prénom, année, no) Inscription (noét, nomc, note1, note2)} Requête : numéro, prénom, notes des étudiants de nom Rochat inscrits en BD no Etudiant.no Inscription.noét p Etudiant.prénom n1 Inscription.note1 n2 Inscription.note2 37 {no, p, n1, n2 Etudiant (nom: 'Rochat', prénom: p, no: no) Inscription (noét: no, nomc: 'BD', note1: n1, note2: n2)} Calcul de domaines Etudiant (nom, prénom, année, no) Inscription (noét, nomc, note1, note2)} Requête: nom, prénom des étudiants ayant brillamment réussi un cours (2 notes = 6) n Etudiant.nom p Etudiant.prénom no Etudiant.no Inscription.n o ét {n, p no (Etudiant (nom: n, prénom: p, no: no) Inscription (n o ét: no, note1=6, note2=6)} 38 19
Calcul de domaines 39 Etudiant (nom, prénom, année, no) Inscription (noét, nomc, note1, note2)} Requête : nom, prénom des étudiants inscrites à tout les cours n Etudiant.nom p Etudiant.prénom no Etudiant.no Inscription.noét nc Inscription.nomC {n, p nc (Etudiant (nom: n, prénom: p, no: no) Inscription (noét: no,nomc:nc))} QBE (Query By Example) - 1977 Langage visuel Requêtes sont exprimées sous forme d'un exemple Correspondance avec calcul des domaines Requêtes sont exprimées en utilisant les squelettes des tables. Utilisateur sélectionne les squelettes de tables dont il a besoin Utilisateur entre des "valeurs exemple" dans colonnes 40 Implémenté en: PARADOX, ACCESS, IBM QMF 20
valeur exemple: variable Une valeur exemple est : soit une variable : soulignée soit une constante : "valeur" non soulignée Exemple calcul des domaines: Requête: nom, prénom des étudiants n Etudiant.nom e Etudiant.prénom { n, e (Etudiant (nom: n, prénom: e) } 41 Etudiant nom prénom année n o P.N P.E P: print Format du résultat Format du résultat spécifié en inscrivant P. dans colonne Équivaut à une projection π [nom, prénom] Étudiant Etudiant nom prénom année n o P. N P.E Étudiant P: print Etudiant nom prénom année n o 42 P. 21
Valeur exemple: constante Utilisées pour écrire des conditions de type nom-variable op constante spécifiées en écrivant op constante dans colonne Constante: pas soulignée Équivaut à une sélection Exemple: σ [année > 1986] Etudiant P. >1986 43 (op: =,, <, >,, ) QBE: sélection-projection π[nom, prénom] σ [année > 1986] Etudiant P.N P.E >1986 σ [prénom = André année > 1986] Etudiant 44 P. André >1986 22
QBE: sélection, projection π[nom, année] σ [prénom = André année > 1986] Etudiant P.N André P.>1986 45 QBE: ou/et Les conditions sur une même ligne sont liées par un et: π[nom, année] σ [prénom = André année > 1969] Etudiant P.N André P.>1986 46 23
QBE:ou Le OU est réalisé en écrivant 2 requêtes (union) π[nom, année] σ [prénom = André année > 1986] Etudiant P.N1 André P.A P.N2 P.>1986 47 QBE: ou (suite) 48 σ [prénom = André prénom = Jean] Etudiant P. André P. Jean π[nom, année] σ [année < 2000 année > 1986] Etudiant? 24
QBE: ou 49 π[nom] σ [prénom = André prénom = Jean] Etudiant P.N1 André P.N2 Jean π[nom] σ [année < 1990 année > 1969] Etudiant P.1 >1969 1 <1990 Conditions de type nom-variable op nom-variable Conditions de type nom-variable op nom-variable s'expriment en utilisant des "valeurs exemples" soulignées Equivaut à theta-jointure π[no, prénom] (Etudiant (σ [nomc = BD] Inscription)) no=noét Etudiant nom prénom année no P.E P. 123 Inscription noét nomc note1 note2 50 123 BD 25
Conditions de type nomvariable op nom-variable Les variables soulignées qui n'apparaissent qu'une seule fois peuvent être omises Etudiant nom prénom année no P.N P.E inutile Etudiant nom prénom année no 51 P. P. QBE: Ecriture des conditions Boîtes de condition : pour conditions difficiles P. 1 52 Condition 1 >1969 1 <1990 26
QBE: Ecriture des conditions Boîtes de condition : pour comparaison entre variables: Numéro des étudiants ayant eu une meilleure note à la deuxième session π[noét] σ [note2 note1] Inscription Inscription noét nomc note1 note2 P. 1 2 53 Condition 2 1 QBE - Résultat multirelation π[nom] (Etudiant (σ [nomc = BD] Inscription)) no=noét P. 123 Inscription noét nomc note1 note2 123 BD 54 27
QBE - Résultat multirelation QBE n'autorise pas d'écrire P. dans plusieurs relations : il faut créer une relation temporaire "Résultat" dont il définit la structure P uniquement dans cette table π[nom, note1, note2] (Etudiant (σ [nomc = BD] Inscription)) no=noét TOTO 123 Inscription noét nomc note1 note2 123 BD 1 2 Résultat 55 P. TOTO 1 2 QBE - négation Pour écrire une négation: Nom des étudiants n'ayant pas d'inscription en cours BD: P. 123 Inscription noét nomc note1 note2 123 BD 56 28
QBE: Ordonner l'affichage du résultat π[nom, prénom] σ [année > 1986] Etudiant P.AO P. >1986 π[nom, prénom] σ [année > 1986] Etudiant P.AO(1) P.DO(2) >1986 57 QBE: Doubles Par défaut, les doubles sont supprimés du résultat π[nom] σ [année > 1986] Etudiant 58 P. >1986 Si on veut les conserver: P.ALL >1986 Dupont Dupont Durant Dupont Dupont Durant 29
QBE - All ALL crée un multi-ensemble P. P.ALL Dupont Durant {Jean} {Paul, Pierre} 59 QBE - All ALL crée un multi-ensemble Exemple: nom des étudiants inscrits à tous les cours P. 1 60 Inscription noét nomc note1 note2 1 ALL.C Cours ALL.C =? nomc 30
QBE - Agrégation Opérateurs d'agrégation AVG, MAX, MIN, SUM, COUNT peuvent être utilisés avec ALL Nombre d'étudiants de 1980 Etudiant nom année no P.COUNT.ALL 1980 Nombre d'étudiants par année de naissance Etudiant nom année no 61 P.COUNT.ALL G. QBE - Agrégation Nombre d'étudiants (sans les doubles) par année de naissance Etudiant nom année no P.COUNT.UNQ.ALL G. 62 31
Mise à jour Trois opérateurs: Insert Update Delete Insert Etudiant nom prénom année n o I Martin André 1988 92 63 QBE - Mise à jour Etudiant nom prénom année n o Martin André 1988 92 U 1987 92 Etudiant nom prénom année n o Martin André 1987 92 Inscription n o et nomc note1 note2 123 BD 6<10 U 123 BD 6+0.5 64 32
QBE - Suppression Inscription n o et nomc D BD plusieurs tuples Inscription D n o et 92 nomc BD 0 ou 1 tuple 65 Conclusion Calcul de tuples et de domaines sont des langages déclaratives; Condition basé sur la logique du 1 er ordre; Quelques langages de requêtes ont été proposé: Quel, QBE; À nos jours, des versions de QBE sont utiliser en ACCESS et en IBM QMF; SQL dérive du calcul de tuple; 66 33