Langages de manipulation des données
Transcription
Langages de manipulation des données
Le modèle relationnel Langages de manipulation des données : algèbre relationelle et SQL V. Benzaken K. Nguy˜ên Département d’ informatique LRI UMR 8623 CNRS Université Paris Sud Master FIIL U. Paris Saclay 1 / 56 Langage de manipulation des données • langage d’interrogation • langage de mise à jour (algèbre , SQL) (SQL) interroger revient à extraire des données langage procédural : quoi ? et comment ? Python, Pascal, C, Java langage déclaratif : quoi ? logiques ou algèbres Prolog, SQL, ... modèle relationnel ⇐⇒ théorie des ensembles modèle relationnel ⇐⇒ logique SQL ↔ algèbre relationelle SQL ↔ logique 2 / 56 Algèbre relationnelle • 2 opérateurs unaires : projection, sélection • 3 opérateurs binaires : jointure, union, différence • opérateurs dérivés : produit cartésien, intersection, division, ... • Chaque opérateur définit une application de l’ensemble des instances d’un schéma de base de données (la source) dans l’ensemble des instances d’un schéma de relation (la cible). • le schéma cible (la structure du résultat) est déterminé par la donnée du schéma source et de l’opérateur. 3 / 56 Projection opération unaire, verticale , restriction de fonction au sens mathématique : supprimer des colonnes d’une table. Étant donné le schéma source : R(V) Soit W un ens. d’attributs tel que W ⊆ V. • Syntaxe : L’opérateur de projection πW est une application de l’ensemble des instances du schéma source R(V) dans l’ensemble des instances du schéma cible Cible(W) • Sémantique : πW (r)= { u|W ; u ∈ r } 4 / 56 Projection : exemple Extraire les titres de tous les films : πtitre (film) film titre Speed 2 Speed 2 Speed 2 Marion Marion réalisateur Jan de Bont Jan de Bont Jan de Bont M. Poirier M. Poirier πtitre (film) acteur S. Bullock J. Patric W. Dafoe C. Tetard M-F Pisier titre Speed 2 Marion 5 / 56 Projection : exemple suite Extraire les titres des films à l’affiche : πtitre (prog) prog nomciné Français Français Français Français Trainon πtitre (prog) titre Speed 2 Speed 2 Speed 2 Marion Marion horaire 18h00 20h00 22h00 16h00 18h00 titre Speed2 Marion 6 / 56 Sélection opération unaire et horizontale : supprimer/filtrer des lignes d’une table en utilisant certains critères (condition). Soit V un ens. d’attributs. Une condition élémentaire sur V est un formule de la forme : A comp a ou A comp B avec A, B∈ V, a∈Dom(A), Dom(A)=Dom(B) et comp est un symbole de comparaison (=, ≤, ...) Une condition sur V est : une condition élémentaire ou une formule de la forme C1 ∧ C2 (C1 et C2 ) C1 ∨ C2 (C1 ou C2 ) ¬C1 (non C1 ) où Ci est une condition. De manière plus concise : c ::= A comp a | A comp B | c ∧ c | c ∨ c | ¬c 7 / 56 Sélection Soit R(V). schéma source et C une condition sur V. • Syntaxe : L’opérateur de sélection σC est une application de l’ensemble des instances du schéma source R(V) dans l’ensemble des instances du schéma cible Cible(V) • Sémantique : σC (r)= { u; u ∈ r et C (u)} C (u) : u satisfait C (défini de façon standard, u vérifie la condition C ). 8 / 56 Sélection : exemple Extraire les informations des films dont le titre est “Speed2”. σtitre=Speed2 film titre Speed 2 Speed 2 Speed 2 Marion Marion Marion σtitre=Speed2 (film) réalisateur Jan de Bont Jan de Bont Jan de Bont M. Poirier M. Poirier M. Poirier titre Speed 2 Speed 2 Speed 2 acteur S. Bullock J. Patric W. Dafoe C. Tetard M-F Pisier M. Poirier réalisateur Jan de Bont Jan de Bont Jan de Bont acteur S. Bullock J. Patric W. Dafoe 9 / 56 Sélection : exemple Extraire les films dont un acteur est le metteur en scène de ce film. σrealisateur =acteur film titre Speed 2 Speed 2 Speed 2 Marion Marion Marion σrealisateur =acteur (film) réalisateur Jan de Bont Jan de Bont Jan de Bont M. Poirier M. Poirier M. Poirier titre Marion acteur S. Bullock J. Patric W. Dafoe C. Tetard M-F Pisier M. Poirier réalisateur M. Poirier acteur M. Poirier 10 / 56 Sélection : exemple Les informations concernant la programmation après 20h00 du film “Marion”. σtitre=Marion∧horaire≥20 prog nomciné Français Français UGC Français Trianon Trianon titre Speed 2 Speed 2 Speed 2 Marion Marion Marion horaire 18h00 20h00 22h00 16h00 18h00 22h00 σtitre=Marion∧horaire≥20 (prog) nomciné Trianon titre Marion horaire 22h00 11 / 56 Composition de la projection et de la sélection Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi que l’horaire exact de la projection. 12 / 56 Composition de la projection et de la sélection Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi que l’horaire exact de la projection. prog 12 / 56 Composition de la projection et de la sélection Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi que l’horaire exact de la projection. σtitre=Marion∧horaire≥20 (prog) σ nomciné Trianon titre Marion horaire 22h00 12 / 56 Composition de la projection et de la sélection Obtenir les cinémas qui projètent le film Marion après 20h00 ainsi que l’horaire exact de la projection. πhoraire,nomcine (σtitre=Marion∧horaire≥20 (prog)) σ nomciné Trianon π(σ...) titre Marion nomciné Trianon horaire 22h00 horaire 22h00 12 / 56 Introduction à SQL SQL = Structured Query Language SEQUEL = Structured English as a QUEry Language standard ISO depuis 87. Avantages : implanté + ou - complètement sur principaux SGBDs portabilité des applications interopérabilité Inconvénients : évolution du langage par ”extensions” (SQL2, SQL3 ...) suivre l’évolution des systèmes, des architectures frein à l’émergence d’un nouveau langage 13 / 56 SQL : Structured Query Language SQL est bien plus qu’un langage de requêtes langage de définition de données (create, alter, drop) langage de manipulation de données interrogations (select) mises à jour (update, insert, delete) contrôle d’accès aux données (grant, revoke) SQL est un langage utilisable en mode interactif associé à une interface graphique immergé dans des langages de programmation (C, Java, ...) 14 / 56 SQL : langage de requêtes - requêtes simples Syntaxe générale (cas simple) : bloc select-from-where select from where Clause Clause Clause < liste d’attributs > < liste de relations > < condition > attributs du schéma cible les relation(s) source(s) conditions de sélection : les relations utiles à la requête : les attributs constituant le schéma du résultat where : les conditions d’extraction des n-uplets from select 15 / 56 SQL : requêtes simples (mono relations) select * from film where acteur=’Adjani’ * : liste de tous les attributs σacteur=0 Adjani0 (film) select titre from film where acteur=’Adjani’ πtitre (σacteur=0 Adjani0 (film)) Sémantique formelle – cas mono-relation : select from where B1 ... Bk R C projection accès sélection πB1 ...Bk (σC (R)) 16 / 56 Jointure opération binaire permettant de combiner le contenu de deux instances en se servant des valeurs dans les colonnes communes • Syntaxe : L’opérateur de jointure ./ est une application de l’ensemble des couples d’instances de R(V) et S(W) dans l’ensemble des instances de Cible(V ∪ W) • Sémantique : r ./ s = {u ; u|V ∈ r et u|W ∈ s} 17 / 56 Jointure : illustration r R A a1 a2 a2 a3 s B b1 b1 b2 b2 C c1 c1 c2 c3 S B b1 b2 b4 C c1 c3 c2 D d1 d3 d1 r ./ s Cible A a1 a2 a3 B b1 b1 b2 C c1 c1 c3 D d1 d1 d3 18 / 56 Jointure : exemple de programmation Les cinémas qui projettent un film dans lequel joue M.F Pisier (pour chaque cinéma donner le titre du film et l’horaire) 19 / 56 Jointure : exemple de programmation Les cinémas qui projettent un film dans lequel joue M.F Pisier (pour chaque cinéma donner le titre du film et l’horaire) les films dans lesquels joue M.F Pisier : (q) : σacteur=M−F.Pisier (film) 19 / 56 Jointure : exemple de programmation Les cinémas qui projettent un film dans lequel joue M.F Pisier (pour chaque cinéma donner le titre du film et l’horaire) les films dans lesquels joue M.F Pisier : (q) : σacteur=M−F.Pisier (film) schéma source : Film schéma cible : Cibleσ (titre, realisateur, acteur) 19 / 56 Jointure : exemple de programmation Les cinémas qui projettent un film dans lequel joue M.F Pisier (pour chaque cinéma donner le titre du film et l’horaire) les films dans lesquels joue M.F Pisier : (q) : σacteur=M−F.Pisier (film) schéma source : Film schéma cible : Cibleσ (titre, realisateur, acteur) Les cinémas qui projettent ces films : (q) ./ prog 19 / 56 Jointure : exemple de programmation Les cinémas qui projettent un film dans lequel joue M.F Pisier (pour chaque cinéma donner le titre du film et l’horaire) les films dans lesquels joue M.F Pisier : (q) : σacteur=M−F.Pisier (film) schéma source : Film schéma cible : Cibleσ (titre, realisateur, acteur) Les cinémas qui projettent ces films : (q) ./ prog schémas sources : Cibleσ (titre, realisateur, acteur) et Prog schéma cible Cible./ (titre, realisateur, acteur, nomcine, horaire) 19 / 56 Exemple programmation : fin L’expression algébrique : πnomcine,titre,horaire (σacteur=M−F.Pisier (film) ./ prog) Autre expression équivalente : πtitre (σacteur=M−F.Pisier (film)) ./ prog 20 / 56 Jointure : autres exemples 1. les films avec leur réalisateurs et acteurs dans lesquels joue M-F. Pisier. La sous-requête πtitre (σacteur=M−F.Pisier (film)) extrait les titres des films dans lesquels joue M-F. Pisier. Il faut ensuite combiner ces titres afin de collecter les autres acteurs et réalisateurs : πtitre (σacteur=M−F.Pisier (film)) ./ film 2. Les titres des films dans lesquels joue M-F. Pisier et qui sont à l’affiche πtitre (σacteur=M−F.Pisier (film)) ./ prog ou de façon équivalente : πtitre (σacteur=M−F.Pisier (film) ./ prog) 21 / 56 Jointure : intersection et produit cartésien Soient R(V) et S(W) deux schémas tels que V=W alors Pour toutes instances r, s de R(V) et S(W) : r ./ s est équivalent à r∩s Ainsi l’intersection ensembliste est un opérateur dérivé de la jointure (sous la condition que V=W). Désormais nous l’incluerons dans la syntaxe de l’algèbre ∩. Les titres des films dans lesquels joue M-F. Pisier et qui sont à l’affiche πtitre (σacteur=M−F.Pisier (film)) ∩ πtitre (prog) 22 / 56 Jointure : intersection et produit cartésien (fin) Soient R(V) et S(W) deux schémas tels que V ∩ W = ∅ alors Pour toutes instances r, s de R(V) et S(W) : r ./ s est équivalent à r×s Ainsi le produit cartésien ensembliste est un opérateur dérivé de la jointure (sous la condition que V ∩ W = ∅). Désormais nous l’incluerons dans la syntaxe de l’algèbre ×. 23 / 56 Jointure et produit cartésien : illustration une instance r une instance s R S A a a B b1 b2 A’ a a’2 B’ b’1 b’2 l’instance r ./ s Cibler./s A a a a a B b1 b2 b1 b2 A’ a a a’2 a’2 B’ b’1 b’1 b’2 b’2 24 / 56 Renommage quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas nécessairement joué dans un film qu’ils ont mis en scène). 25 / 56 Renommage quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas nécessairement joué dans un film qu’ils ont mis en scène). 1. projeter film sur realisateur πrealisateur (film) 25 / 56 Renommage quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas nécessairement joué dans un film qu’ils ont mis en scène). 1. projeter film sur realisateur 2. projeter film sur acteur πrealisateur (film) πacteur (film) 25 / 56 Renommage quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas nécessairement joué dans un film qu’ils ont mis en scène). 1. projeter film sur realisateur πrealisateur (film) 2. projeter film sur acteur πacteur (film) 3. prendre l’intersection πacteur (film) ∩ πrealisateur (film) 25 / 56 Renommage quels sont les réalisateurs qui sont aussi acteurs (mais qui n’ont pas nécessairement joué dans un film qu’ils ont mis en scène). 1. projeter film sur realisateur πrealisateur (film) 2. projeter film sur acteur πacteur (film) 3. prendre l’intersection πacteur (film) ∩ πrealisateur (film) L’intersection ne peut pas être exprimée car l’hypothèse que realisateur = acteur n’est pas satisfaite Ceci justifie l’introduction de l’opérateur de renommage des attributs 25 / 56 Renommage Le renommage peut servir à donner le même nom à des attributs distincts donner des noms distincts Le renommage de (ABCD) en (AKLD) est défini par ρren avec ren : {A → A, B → K , C → L, D → D} En pratique, ren, est spécifié uniquement pour les attributs qui changent de nom. Les realisateurs qui sont aussi acteurs πrealisateur (film) ./ ρacteur→realisateur (πacteur (film)) 26 / 56 Renommage : illustration Les films mis en scène par au moins deux réalisateurs. ? ? ? ? pas d’opération pour compter ? ? ? 1. projection de sur titre, realisateur de film πtitre,realisateur (film) 2. renommage ρrealisateur→r1 (πtitre,realisateur (film)) 3. renommage ρrealisateur→r2 (πtitre,realisateur (film)) 27 / 56 Renommage : illustration (suite et fin) 4. (q) : ρrealisateur→r1 (πtitre,realisateur (film)) ./ ρrealisateur→r2 (πtitre,realisateur (film)) schéma cible de (q) : Cible(titre, r1, r2). 5. sélection utilisant la condition r1 6= r2 (q’) : σr16=r2 ((q)) schéma cible de l’expression q’ Cible(titre, r1, r2). 6. la projection sur titre donne le résultat : πtitre (q0 ) 28 / 56 Union ensembliste (opération binaire) Soient r1 et r2 deux instances de même schéma R(V). Syntaxe : r1 ∪ r2 Sémantique : {u; u ∈ r1} ∪ {u; u ∈ r2} toutes les personnes ayant travaillé sur le tournage du film Marion ρrealisateur→personne (πrealisateur (σtitre=Marion (film))) ∪ ρacteur→personne (πacteur (σtitre=Marion (film))) Le schéma cible de l’expression se réduit à l’attribut personne. 29 / 56 La différence ensembliste (opération binaire) Soient r1 et r2 deux instances de même schéma R(V). Syntaxe : r1 \ r2 Sémantique : {u; u ∈ r1 et u 6∈ r2} les acteurs qui ne sont pas realisateurs πacteur (film) \ ρrealisateur→acteur (πrealisateur (film)) 30 / 56 SQL : un peu plus compliqué renommage des attributs du schéma cible select titre as adjani’s movies from film where acteur=’Adjani’ ρtitre→adjani0 s movies (πtitre (σacteur=0 Adjani0 (film))) On suppose que l’on a une relation film-duree de schéma avec Dom(duree)= float et que les durées sont exprimées en mn. Film-duree(titre, duree) valeur des attributs = expression arithmétique select titre, duree*0.016667 as duree-en-heure from film-duree introduire une valeur (’heure’) dans une colonne select titre, duree*0.016667 as duree-en-heure, ’heure’ as unite from film-duree 31 / 56 SQL : conditions de sélection, chaines de caractères • condition de la clause select : comparateurs habituels, arithmétique, concaténation (||), ... connecteurs : or, and et not select titre from film where acteur=’Adjani’ or realisateur=’Poirier’ • motifs pour recherche de cha^ ınes de caractères : % : une chaı̂ne qcq , : 1 caractère select titre from film where titre like ’Star permettra la sélection de chaı̂nes telles que : ’ Star Wars, Star Trek, ... select titre from film where titre like ’%retour%’ permettra la sélection de : Le retour à Sarajevo, Aliens le retour, ... 32 / 56 SQL : chaı̂nes de caractères Attention ... • chaı̂nes de caractères : chaı̂nes de longueur fixe / chaı̂nes de longueur variable chaı̂nes de longueur fixe complétées par des blancs. majuscules / minuscules pas de distinction pour les mots clés distinction pour les valeurs des conditions • divers ... les motifs comme les valeurs sont écrits entre ’ ’ négation possible : not like condition d’intervalle : attribut between val. and val. 33 / 56 SQL : langage de requêtes date Différents formats de dates sont disponibles • manipulation de dates utiliser le type DATE – format : aaaa-mm-jj – BETWEEN DATE ’2003-09-25’ and DATE ’2004-02-15’ 34 / 56 SQL : langage de requêtes requête multi-relation Sémantique formelle – cas multi-relation : select from where B1 ... Bk r1 ... rp C πB1 ...Bk (σC (r1 × . . . × rp )) Les cinémas qui projettent un film dans lequel M.F. Pisier est actrice (pour chaque cinéma donner le titre du film et l’horaire) select nomcine, film.titre, horaire from film, prog where film.titre=prog.titre and acteur=‘M-F. Pisier’ πnomcine,titre,horaire (σacteur=M−F.Pisier (film) ./ prog) πnomcine,film.titre,horaire (σfilm.titre=prog .titre ( σacteur =M−F .Pisier (ρtitre→film.titre (film)) ./ ρtitre→prog .titre (prog)))) 35 / 56 SQL : Introduction de variables requête multi-relation Les films avec leur réalisateurs et leurs acteurs dans lesquels joue M-F Pisier πtitre (σacteur=M−F.Pisier (film) ./ film) select F2.titre , F2.realisateur, F2.acteur from film as F1, film as F2 where F1.titre = F2.titre and F1.acteur=‘M-F. Pisier’ Selon le contexte : F1 et F2 sont des copies virtuelles de film soit F1 et F2 sont des variables qui désigneront n’importe quel n-uplet de film respectivement. 36 / 56 SQL : Union, Intersection, Différence Les titres des films dans lesquels joue M-F. Pisier et à l’affiche. select titre from film where acteur=‘M-F. Pisier’ intersect select titre from prog Les titres des films qui ne sont pas à l’affiche select titre from film except select titre from prog toutes les personnes ayant participé au tournage du film “Marion” select acteur as personne from film where titre = ’Marion’ union select realisateur as personne from film where titre = ’Marion’ 37 / 56 SQL : ensembles et multi-ensembles { 1, 2, 1, 3 } est un multi-ensemble opération select-from-where union, except, intersect mode ensembliste distinct par défaut mode multi-ensemble par défaut all Elimination des dupliqués select distinct titre from film 38 / 56 Une requête difficile les cinémas qui projettent tous les films de Poirier. instance film de Film titre Marion Marion Western Speed2 Speed2 realisateur Poirier Poirier Poirier J. Bont J. Bont acteur Tetard Pisier Pisier Bullock Patric instance prog de Prog nomcine Trianon Trianon Trianon UGC Français Français Français Français titre Marion Marion Speed2 Speed2 Marion Western Marion Speed2 horaire 20h00 22h00 18h00 20h00 18h00 20h00 22h00 16h00 39 / 56 Une requête difficile les films réalisés par Poirier. (q1) : πtitre (σrealisateur=Poirier (film)) q1 titre Marion Western 40 / 56 Une requête difficile les cinémas et les films (quelconques) projetés. (q2) : πnomcine CibleE2 titre (prog) E2 nomcine Trianon Trianon UGC Français Français Français titre Marion Speed2 Speed2 Marion Western Speed2 41 / 56 Une requête difficile créer une relation où tous les films de Poirier sont projetés dans tous les cinémas. (q3) : πnomcine (prog) ./ πtitre (q1) q3 nomcine Trianon Trianon UGC UGC Français Français titre Marion Western Marion Western Marion Western q3 \ q2 donne pour chaque ciné les fims de Poirier qu’il ne projette pas ! 42 / 56 Une requête difficile Les cinémas projettant tous les films de Poirier sont obtenus par : πnomcine (prog) \ πnomcine (q3 \ q2) nomcine Français 43 / 56 Syntaxe q ::= r | πW (q) | σC (q) | q ./ q | ρren (q) | q ∪ q | q \ q 44 / 56 SQL : Sous-Requêtes et Imbrication Utilisation du résultat d’un select-from-where film-deb(titre,acteur) stocke le titre du premier film de chaque acteur. Les acteurs du premier film joué par M-F. Pisier ? select acteur from film where titre = (select titre from film-deb where acteur=‘M-F. Pisier’) le résultat de la sous-requ^ ete doit ^ etre un singleton S’exprime de manière non imbriquée select film.acteur from film, film-deb where film.titre=film-deb.titre and film-deb.acteur=’M-F. Pisier’ 45 / 56 SQL : Sous-requête avec l’opérateur IN Les titres des films dont les réalisateurs sont acteurs (pas forcément dans le m^ eme film). select titre from film where realisateur in (select acteur from film ) Le résultat de la sous-requ^ ete est un ens. de n-uplets sur titre. S’exprime sans imbrication select f1.titre from film as f1, film as f2 where f1.realisateur = f2.acteur 46 / 56 SQL : Sous-requête avec l’opérateur EXISTS Les films dirigés par au moins deux metteurs en scène select f1.titre from film as f1 where exists (select f2.realisateur from film as f2 where f1.titre = f2.titre and not (f1.realisateur=f2.realisateur )) exists teste si le résultat de la sous-requ^ ete est vide Une autre formulation est possible sans sous-requête (exercice) 47 / 56 SQL : Sous-requête avec l’opérateur EXISTS Les films dont au moins un acteur a joué dans un autre film select f1.titre from film as f1 where exists (select f2.acteur from film as f2 where f1.titre = f2.titre and exists (select f3.acteur from film as f3 where f2.acteur=f3.acteur and not (f3.titre=f1.titre) ) ) autre formulation sans sous-requête (exercice) 48 / 56 SQL : Sous-requête avec l’opérateur IN et EXISTS Soient 2 schémas de relation R(ABC) et S(BCD) et deux instances r et s respectivement de R et S -- Voici deux façons d’exprimer πA (r ./ s) select A from r where (r.B r.C) in (select B, C from s ) select A from r as r1 where exists (select s2.B, s2.C from s where r1.B = s.B and r1.C = s2.C) Attention : EVITEZ l’usage de sous-requ^ etes car elles sont difficeliemnt optimisées 49 / 56 SQL : Sous-requête avec la construction comp ALL ou comp ANY Les films projetés à l’UGC plus tard que tous les films projetés au Trianon select titre from prog where nomcine =’UGC’ and horaire > ALL (select horaire from prog where nomcine=‘Trianon’) > ALL teste si la valeur de horaire est supérieure à tous les élts du résultat de la sous-requ^ ete 50 / 56 SQL : Sous-requête avec la construction comp ALL ou comp ANY Le téléphone des cinémas qui proposent une programmation après 23h select telephone from cine as c1 where 23 < any (select horaire from prog where c1.nomcine = prog.nomcine) < any teste si la valeur 23 est strictement inférieure à au moins UN des éléments du résultat de la sous-requ^ ete ou de facon équivalente : < any teste s’il existe un élément du résultat de la sous-requ^ ete dont la valeur soit strictement supérieure à 23 51 / 56 SQL : Aggregats sum() : somme avg() : moyenne min() : minimum max() : maximum count() : cardinalité d’un multi-ensemble Le nombre de films dirigés par Bergman select count (titre) from prog where realisateur = ’Bergman’ Eliminer les dupliqués : select count ( DISTINCT titre) from prog where realisateur = ’Bergman’ 52 / 56 SQL : Groupement Nombre d’acteurs par film select titre count(acteur) from film group by titre titre t1 t1 t1 t1 t1 t1 t2 réalisateur m1 m1 m1 m2 m2 m2 m4 acteur a1 a2 a3 a1 a2 a3 a2 titre t1 t1 t1 t1 t1 t1 t2 calcul de l’aggrégat (multi-ensemble) titre t1 t2 projection acteur a1 a2 a3 a1 a2 a3 a2 titre t1 regroupement acteur t2 a1 a2 a3 a1 a2 a3 a2 6 1 select titre count(distinct acteur) from film group by titre 53 / 56 SQL : Groupement et aggrégat Ajout d’un schéma cinephile(nom, nomcine) : select nom count(distinct titre) from cinephile, prog where cinephile.nomcine = prog.nomcine group by nom (1) jointure naturelle de cinephile et prog (2) projection (3) regroupement, et (4) calcul de l’aggrégat clause select en présence d’aggrégat select listeatt1 agg(listeatt2) from liste-relations where condition group by listeatt1 54 / 56 SQL : la clause HAVING Les films et le nombre d’acteurs de ces films à condition qu’il y ait plus de 3 acteurs. select titre count( DISTINCT acteur) from film group by titre havingcount(*) >= 3 (* Elimination des groupes ne satisfaisant pas la condition *) Les films dirigés pas deux metteurs en scène. select titre from film group by titre having count(realisateur) > 2 55 / 56 SQL : Valeurs nulles Une valeur nulle remplace une valeur d’un attribut. valeur inconnue, attribut inapproprié, valeur incertaine, valeur cachée ... Comparaison avec une valeur nulle vrai=1 - faux=0 - inconnu=1/2 x AND y est évalué à min(x,y), y OR y à max(x,y) et NOT x à 1-x Attention : la loi du tiers exclu n’est plus valide p OR (NOT p) pour p=1/2 (max(1/2, 1/2) = 1/2 différent de 1) 56 / 56