Vous êtes sur la page 1sur 114

Base de Donnes et langage SQL

(IUT, dpartement informatique, 1re anne)

Laurent AUDIBERT

Institut Universitaire de Technologie de Villetaneuse Dpartement Informatique Avenue Jean-Baptiste Clment 93430 Villetaneuse Adresse lectronique : laurent[dot]audibert[at]iutv[dot]univ-paris13[dot]fr

Avant-propos
Aujourdhui, la disponibilit de systmes de gestion de base de donnes ables permet aux organisations de toutes tailles de grer des donnes ecacement, de dployer des applications utilisant ces donnes et de les stocker. Les bases de donnes sont actuellement au cur du systme dinformation des entreprises. Les bases de donnes relationnelles constituent lobjet de ce cours. Ces bases sont conues suivant le modle relationnel, dont les fondations thoriques sont solides, et manipules en utilisant lalgbre relationnelle. Il sagit, ce jour, de la mthode la plus courante pour organiser et accder des ensembles de donnes. Nous dcrivons le modle relationnel, le passage du modle entits-associations au modle relationnel et enn lalgbre relationnelle dans le chapitre 3. Le chapitre 4 est entirement consacr au langage SQL (Structured Query Language) qui peut tre considr comme le langage daccs normalis aux bases de donnes relationnelles. Ce langage est support par la plupart des systmes de gestion de bases de donnes commerciaux (comme Oracle) et du domaine libre (comme PostgreSQL). Nous dtaillons dans ce chapitre les instructions du langage de dnition de donnes et celles du langage de manipulation de donnes. Dirents exercices de travaux dirigs et de travaux pratiques ponctuent ce cours. Des exemples de corrections de certains des exercices sont regroups dans la dernire partie du document (chapitre 5). Ce document constitue le support du cours Base de Donnes et langage SQL dispens aux tudiants du dpartement dinformatique de linstitut universitaire de technologie de Villetaneuse en semestre dcal. Ce support a t ralis en utilisant les ouvrages cits en bibliographie. Vous trouverez ce document en ligne (pour avoir la dernire version par exemple) ladresse suivante : http://www-lipn.univ-paris13.fr/~audibert/pages/enseignement/cours.htm

Table des matires


1 Introduction aux bases de donnes {S1} 1.1 Quest-ce quune base de donnes ? . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Notion de base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Modle de base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Systme de gestion de base de donnes (SGBD) . . . . . . . . . . . . . . . . . . . 1.2.1 Principes de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 Niveaux de description des donnes ANSI/SPARC . . . . . . . . . . . . 1.2.4 Quelques SGBD connus et utiliss . . . . . . . . . . . . . . . . . . . . . . 1.3 Travaux Dirigs Sensibilisation la problmatique des bases de donnes {S1} 1.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2 Approche nave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Anement de la solution . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.4 Que retenir de ce TD ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conception des bases de donnes (modle E-A) {S2-3} 2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Pourquoi une modlisation pralable ? . . . . . . . . . . . . . . 2.1.2 Merise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 lments constitutifs du modle entits-associations . . . . . . . . . . . 2.2.1 Entit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 Attribut ou proprit, valeur . . . . . . . . . . . . . . . . . . . . 2.2.3 Identiant ou cl . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4 Association ou relation . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5 Cardinalit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Complments sur les associations . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Associations plurielles . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 Association rexive . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.3 Association n-aire (n > 2) . . . . . . . . . . . . . . . . . . . . . . 2.4 Travaux Dirigs Modle entits-associations {S2} . . . . . . . . . . . . 2.4.1 Attention aux attributs multiples . . . . . . . . . . . . . . . . . . 2.4.2 tudiants, cours, enseignants, salles, . . . . . . . . . . . . . . . . . 2.4.3 Deux associations ne peuvent lier un mme ensemble dentits 2.4.4 Comprenez-vous les type-associations n-aire ? . . . . . . . . . . 2.4.5 Cas dune bibliothque (1re partie) . . . . . . . . . . . . . . . . . 2.5 Rgles de bonne formation dun modle entits-associations . . . . . . 2.5.1 Rgles portant sur les noms . . . . . . . . . . . . . . . . . . . . . 2.5.2 Rgles de normalisation des attributs . . . . . . . . . . . . . . . 2.5.3 Rgles de fusion/suppression dentits/associations . . . . . . . 2.5.4 Normalisation des type-entits et type-associations . . . . . . . 2.6 laboration dun modle entits-associations . . . . . . . . . . . . . . . 2.6.1 tapes de conceptions dun modle entits-associations . . . . . 2.6.2 Conseils divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 10 11 11 11 12 12 14 14 14 15 16 17 17 17 17 18 18 19 19 20 21 22 22 22 23 27 27 27 27 28 29 30 30 31 32 36 38 38 39

TABLE DES MATIRES

2.7

Travaux Dirigs Modle entits-associations {S3} 2.7.1 Mais qui a fait cette modlisation ? . . . . . 2.7.2 Cas dune bibliothque (2e partie) . . . . . 2.7.3 Cas dune entreprise de dpannage . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41 41 41 42 43 43 43 43 45 47 47 47 48 48 49 50 53 54 54 54 57 57 57 57 58 58 59 59 60 61 62 62 64 65 65 65 66 67 68 68 68 69 71 71 71 71 72 72 73 73 74 76 76

Bases de donnes relationnelles {S4-5} 3.1 Introduction au modle relationnel . . . . . . . . . . . . . . . . . . . . 3.1.1 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 lments du modle relationnel . . . . . . . . . . . . . . . . . 3.1.3 Passage du modle entits-associations au modle relationnel 3.2 Normalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Dpendance fonctionnelle (DF) . . . . . . . . . . . . . . . . . . 3.2.3 Premire et deuxime forme normale . . . . . . . . . . . . . . 3.2.4 Troisime forme normale . . . . . . . . . . . . . . . . . . . . . 3.2.5 Forme normale de BOYCE-CODD . . . . . . . . . . . . . . . . 3.2.6 Quatrime et cinquime forme normale . . . . . . . . . . . . . 3.2.7 Remarques au sujet de la normalisation . . . . . . . . . . . . . 3.3 Travaux Dirigs Modle relationnel {S4} . . . . . . . . . . . . . . . . 3.3.1 Passage du modle entits-associations au modle relationnel 3.3.2 Normalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Algbre relationnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.2 Slection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.3 Projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.4 Union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.5 Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.6 Dirence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.7 Produit cartsien . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.8 Jointure, theta-jointure, equi-jointure, jointure naturelle . . . . 3.4.9 Division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Travaux Dirigs Algbre relationnelle {S5} . . . . . . . . . . . . . . 3.5.1 Exercices de comprhension de requtes . . . . . . . . . . . . 3.5.2 Trouver la bonne requte . . . . . . . . . . . . . . . . . . . . .

Langage SQL 4.1 Introduction {S6} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Prsentation gnrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Catgories dinstructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Dnir une base Langage de dnition de donnes (LDD) . . . . . . . . . . . . . . 4.2.1 Introduction aux contraintes dintgrit . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Crer une table : CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Contraintes dintgrit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4 Supprimer une table : DROP TABLE . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.5 Modier une table : ALTER TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Modier une base Langage de manipulation de donnes (LMD) . . . . . . . . . . . 4.3.1 Insertion de n-uplets : INSERT INTO . . . . . . . . . . . . . . . . . . . . . . . . 4.3.2 Modication de n-uplets : UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 Suppression de n-uplets : DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Travaux Pratiques SQL : Premire base de donnes {S6} . . . . . . . . . . . . . . . . 4.4.1 Informations pratiques concernant PostgreSQL . . . . . . . . . . . . . . . . . 4.4.2 Premire base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Interroger une base Langage de manipulation de donnes : SELECT (1re partie) {S7} 4.5.1 Introduction la commande SELECT . . . . . . . . . . . . . . . . . . . . . . . .

TABLE DES MATIRES

4.5.2 Traduction des oprateurs de lalgbre relationnelle (1re partie) . . . . . . . . 4.5.3 Syntaxe gnrale de la commande SELECT . . . . . . . . . . . . . . . . . . . . . 4.5.4 La clause SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.5 La clause FROM (1re partie) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.6 La clause ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.7 La clause WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.8 Les expressions rgulires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Travaux Pratiques SQL : Premires requtes {S7} . . . . . . . . . . . . . . . . . . . . 4.6.1 Premires requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.2 Requtes dj rsolues en utilisant lalgbre relationnelle . . . . . . . . . . . . 4.6.3 Utilisation des expressions rgulires . . . . . . . . . . . . . . . . . . . . . . . 4.7 Interroger une base Langage de manipulation de donnes : SELECT (2e partie) {S8} 4.7.1 La clause FROM (2e partie) : les jointures . . . . . . . . . . . . . . . . . . . . . . 4.7.2 Les clauses GROUP BY et HAVING et les fonctions dagrgation . . . . . . . . . . 4.7.3 Oprateurs ensemblistes : UNION, INTERSECT et EXCEPT . . . . . . . . . . . . . 4.7.4 Traduction des oprateurs de lalgbre relationnelle (2e partie) . . . . . . . . . 4.8 Travaux Pratiques SQL : Requtes avances {S8} . . . . . . . . . . . . . . . . . . . . 4.8.1 Prix de GROUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8.2 Requtes dj rsolues en utilisant lalgbre relationnelle . . . . . . . . . . . . 4.8.3 GROUP toujours ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 Nouveaux objets Langage de dnition de donnes (LDD) {S9} . . . . . . . . . . . 4.9.1 Squences (CREATE SEQUENCE) et type SERIAL . . . . . . . . . . . . . . . . . . 4.9.2 Rgles (CREATE RULE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9.3 Vues (CREATE VIEW) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9.4 Schmas (CREATE SCHEMA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10 Travaux Pratiques SQL : Nouveaux objets {S9} . . . . . . . . . . . . . . . . . . . . . 4.10.1 Squences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.2 Schma et vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.3 Rgles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10.4 Toujours des requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11 SQL intgr {S10} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.2 Connexion au serveur de bases de donnes . . . . . . . . . . . . . . . . . . . . 4.11.3 Excuter des commandes SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.4 Les variables htes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.5 Variables indicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.6 Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.7 Curseurs pour rsultats lignes multiples . . . . . . . . . . . . . . . . . . . . 4.11.8 Prcompilation et compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11.9 Exemple complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Corrections

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77 77 78 79 79 80 81 84 84 84 85 86 86 90 92 92 95 95 95 95 96 96 97 98 100 101 101 101 101 101 102 102 102 103 103 105 106 107 108 109 111 113

Bibliographie

TABLE DES MATIRES

Chapitre 1

Introduction aux bases de donnes


1.1
1.1.1

Quest-ce quune base de donnes ?


Notion de base de donnes

Description gnrale Il est dicile de donner une dnition exacte de la notion de base de donnes. Une dnition trs gnrale pourrait tre : Dnition 1.1 -Base de donnes- Un ensemble organis dinformations avec un objectif commun. Peu importe le support utilis pour rassembler et stocker les donnes (papier, chiers, etc.), ds lors que des donnes sont rassembles et stockes dune manire organise dans un but spcique, on parle de base de donnes. Plus prcisment, on appelle base de donnes un ensemble structur et organis permettant le stockage de grandes quantits dinformations an den faciliter lexploitation (ajout, mise jour, recherche de donnes). Bien entendu, dans le cadre de ce cours, nous nous intressons aux bases de donnes informatises. Base de donnes informatise Dnition 1.2 -Base de donnes informatise- Une base de donnes informatise est un ensemble structur de donnes enregistres sur des supports accessibles par lordinateur, reprsentant des informations du monde rel et pouvant tre interroges et mises jour par une communaut dutilisateurs. Le rsultat de la conception dune base de donnes informatise est une description des donnes. Par description on entend dnir les proprits densembles dobjets modliss dans la base de donnes et non pas dobjets particuliers. Les objets particuliers sont crs par des programmes dapplications ou des langages de manipulation lors des insertions et des mises jour des donnes. Cette description des donnes est ralise en utilisant un modle de donnes1 . Ce dernier est un outil formel utilis pour comprendre lorganisation logique des donnes. La gestion et laccs une base de donnes sont assurs par un ensemble de programmes qui constituent le Systme de gestion de base de donnes (SGBD). Nous y reviendrons dans la section 1.2. Un SGBD est caractris par le modle de description des donnes quil supporte (hirarchique, rseau, relationnel, objet : cf. section 1.1.2). Les donnes sont dcrites sous la forme de ce modle, grce un Langage de Description des Donnes (LDD). Cette description est appele schma. Une fois la base de donnes spcie, on peut y insrer des donnes, les rcuprer, les modier et les dtruire. Cest ce quon appelle manipuler les donnes. Les donnes peuvent tre manipules non seulement par un Langage spcique de Manipulation des Donnes (LMD) mais aussi par des langages de programmation classiques.
1 cf. section 1.1.2 pour une prsentation gnrale de plusieurs modles de donnes. Le modle entits-associations est prsent dans la section 2 et le modle relationnel dans la section 3.1

10

CHAPITRE 1. INTRODUCTION AUX BASES DE DONNES {S1}

Enjeux Les bases de donnes ont pris une place importante en informatique, et particulirement dans le domaine de la gestion. Ltude des bases de donnes conduit au dveloppement de concepts, mthodes et algorithmes spciques, notamment pour grer les donnes en mmoire secondaire (i.e. disques durs)2 . En eet, ds lorigine de la discipline, les informaticiens ont observ que la taille de la RAM ne permettait pas de charger lensemble dune base de donnes en mmoire. Cette hypothse est toujours vrie car le volume des donnes ne cesse de saccrotre sous la pousse des nouvelles technologies du WEB. Ainsi, les bases de donnes de demain devront tre capables de grer plusieurs dizaines de traoctets de donnes, gographiquement distribues lchelle dInternet, par plusieurs dizaines de milliers dutilisateurs dans un contexte dexploitation changeant (on ne sait pas trs bien matriser ou prdire les dbits de communication entre sites) voire sur des nuds volatiles. En physique des hautes nergies, on prdit quune seule exprience produira de lordre du pta-octets de donnes par an. Comme il est peu probable de disposer dune technologie de disque permettant de stocker sur un unique disque cette quantit dinformations, les bases de donnes se sont orientes vers des architectures distribues ce qui permet, par exemple, dexcuter potentiellement plusieurs instructions dentre/sortie en mme temps sur des disques dirents et donc de diviser le temps total dexcution par un ordre de grandeur.

1.1.2

Modle de base de donnes

Modle hirarchique Une base de donnes hirarchique est une forme de systme de gestion de base de donnes qui lie des enregistrements dans une structure arborescente de faon ce que chaque enregistrement nait quun seul possesseur (par exemple, une paire de chaussures nappartient qu une seule personne). Les structures de donnes hirarchiques ont t largement utilises dans les premiers systmes de gestion de bases de donnes conus pour la gestion des donnes du programme Apollo de la NASA. Cependant, cause de leurs limitations internes, elles ne peuvent pas souvent tre utilises pour dcrire des structures existantes dans le monde rel. Les liens hirarchiques entre les dirents types de donnes peuvent rendre trs simple la rponse certaines questions, mais trs dicile la rponse dautres formes de questions. Si le principe de relation 1 vers N nest pas respect (par exemple, un malade peut avoir plusieurs mdecins et un mdecin a, a priori, plusieurs patients), alors la hirarchie se transforme en un rseau. Modle rseau Le modle rseau est en mesure de lever de nombreuses dicults du modle hirarchique grce la possibilit dtablir des liaisons de type n-n, les liens entre objets pouvant exister sans restriction. Pour retrouver une donne dans une telle modlisation, il faut connatre le chemin daccs (les liens) ce qui rend les programmes dpendants de la structure de donnes Ce modle de bases de donnes a t invent par C.W. Bachman. Pour son modle, il reut en 1973 le prix Turing. Modle relationnel Une base de donnes relationnelle est une base de donnes structure suivant les principes de lalgbre relationnelle. Le pre des bases de donnes relationnelles est Edgar Frank Codd. Chercheur chez IBM la n des anne 1960, il tudiait alors de nouvelles mthodes pour grer de grandes quantits de donnes car les modles et les logiciels de lpoque ne le satisfaisait pas. Mathmaticien de formation, il tait persuad quil pourrait utiliser des branches spciques des mathmatiques (la thorie des ensembles
2 Il faut savoir que les temps daccs des disques durs sont dun ordre de grandeur suprieur (disons 1000 fois suprieur) aux temps daccs la mmoire RAM. Tout gestionnaire de base de donnes doit donc traiter de manire particulire les accs aux disques.

1.2. SYSTME DE GESTION DE BASE DE DONNES (SGBD)

11

et la logique des prdicats du premier ordre) pour rsoudre des dicults telles que la redondance des donnes, lintgrit des donnes ou lindpendance de la structure de la base de donnes avec sa mise en uvre physique. En 1970, Codd (1970) publia un article o il proposait de stocker des donnes htrognes dans des tables, permettant dtablir des relations entre elles. De nos jours, ce modle est extrmement rpandu, mais en 1970, cette ide tait considre comme une curiosit intellectuelle. On doutait que les tables puissent tre jamais gres de manire ecace par un ordinateur. Ce scepticisme na cependant pas empch Codd de poursuivre ses recherches. Un premier prototype de Systme de gestion de bases de donnes relationnelles (SGBDR) a t construit dans les laboratoires dIBM. Depuis les annes 80, cette technologie a mri et a t adopte par lindustrie. En 1987, le langage SQL, qui tend lalgbre relationnelle, a t standardis. Cest dans ce type de modle que se situe ce cours de base de donnes. Modle objet La notion de bases de donnes objet ou relationnel-objet est plus rcente et encore en phase de recherche et de dveloppement. Elle sera trs probablement ajoute au modle relationnel.

1.2
1.2.1

Systme de gestion de base de donnes (SGBD)


Principes de fonctionnement

La gestion et laccs une base de donnes sont assurs par un ensemble de programmes qui constituent le Systme de gestion de base de donnes (SGBD). Un SGBD doit permettre lajout, la modication et la recherche de donnes. Un systme de gestion de bases de donnes hberge gnralement plusieurs bases de donnes, qui sont destines des logiciels ou des thmatiques dirents. Actuellement, la plupart des SGBD fonctionnent selon un mode client/serveur. Le serveur (sous entendu la machine qui stocke les donnes) reoit des requtes de plusieurs clients et ceci de manire concurrente. Le serveur analyse la requte, la traite et retourne le rsultat au client. Le modle client/serveur est assez souvent implment au moyen de linterface des sockets (voir le cours de rseau) ; le rseau tant Internet. Une variante de ce modle est le modle ASP (Application Service Provider). Dans ce modle, le client sadresse un mandataire (broker) qui le met en relation avec un SGBD capable de rsoudre la requte. La requte est ensuite directement envoye au SGBD slectionn qui rsout et retourne le rsultat directement au client. Quelque soit le modle, un des problmes fondamentaux prendre en compte est la cohrence des donnes. Par exemple, dans un environnement o plusieurs utilisateurs peuvent accder concurremment une colonne dune table par exemple pour la lire ou pour lcrire, il faut saccorder sur la politique dcriture. Cette politique peut tre : les lectures concurrentes sont autorises mais ds quil y a une criture dans une colonne, lensemble de la colonne est envoye aux autres utilisateurs layant lue pour quelle soit rafrachie.

1.2.2

Objectifs

Des objectifs principaux ont t xs aux SGBD ds lorigine de ceux-ci et ce, an de rsoudre les problmes causs par la dmarche classique. Ces objectifs sont les suivants : Indpendance physique : La faon dont les donnes sont dnies doit tre indpendante des structures de stockage utilises. Indpendance logique : Un mme ensemble de donnes peut tre vu diremment par des utilisateurs dirents. Toutes ces visions personnelles des donnes doivent tre intgres dans une vision globale. Accs aux donnes : Laccs aux donnes se fait par lintermdiaire dun Langage de Manipulation de Donnes (LMD). Il est crucial que ce langage permette dobtenir des rponses aux requtes en un

12

CHAPITRE 1. INTRODUCTION AUX BASES DE DONNES {S1}

temps raisonnable . Le LMD doit donc tre optimis, minimiser le nombre daccs disques, et tout cela de faon totalement transparente pour lutilisateur. Administration centralise des donnes (intgration) : Toutes les donnes doivent tre centralises dans un rservoir unique commun toutes les applications. En eet, des visions direntes des donnes (entre autres) se rsolvent plus facilement si les donnes sont administres de faon centralise. Non redondance des donnes : An dviter les problmes lors des mises jour, chaque donne ne doit tre prsente quune seule fois dans la base. Cohrence des donnes : Les donnes sont soumises un certain nombre de contraintes dintgrit qui dnissent un tat cohrent de la base. Elles doivent pouvoir tre exprimes simplement et vries automatiquement chaque insertion, modication ou suppression des donnes. Les contraintes dintgrit sont dcrites dans le Langage de Description de Donnes (LDD). Partage des donnes : Il sagit de permettre plusieurs utilisateurs daccder aux mmes donnes au mme moment de manire transparente. Si ce problme est simple rsoudre quand il sagit uniquement dinterrogations, cela ne lest plus quand il sagit de modications dans un contexte multi-utilisateurs car il faut : permettre deux (ou plus) utilisateurs de modier la mme donne en mme temps et assurer un rsultat dinterrogation cohrent pour un utilisateur consultant une table pendant quun autre la modie. Scurit des donnes : Les donnes doivent pouvoir tre protges contre les accs non autoriss. Pour cela, il faut pouvoir associer chaque utilisateur des droits daccs aux donnes. Rsistance aux pannes : Que se passe-t-il si une panne survient au milieu dune modication, si certains chiers contenant les donnes deviennent illisibles ? Il faut pouvoir rcuprer une base dans un tat sain . Ainsi, aprs une panne intervenant au milieu dune modication deux solutions sont possibles : soit rcuprer les donnes dans ltat dans lequel elles taient avant la modication, soit terminer lopration interrompue.

1.2.3

Niveaux de description des donnes ANSI/SPARC

Pour atteindre certains de ces objectifs (surtout les deux premiers), trois niveaux de description des donnes ont t dnis par la norme ANSI/SPARC. Le niveau externe correspond la perception de tout ou partie de la base par un groupe donn dutilisateurs, indpendamment des autres. On appelle cette description le schma externe ou vue. Il peut exister plusieurs schmas externes reprsentant direntes vues sur la base de donnes avec des possibilits de recouvrement. Le niveau externe assure lanalyse et linterprtation des requtes en primitives de plus bas niveau et se charge galement de convertir ventuellement les donnes brutes, issues de la rponse la requte, dans un format souhait par lutilisateur. Le niveau conceptuel dcrit la structure de toutes les donnes de la base, leurs proprits (i.e. les relations qui existent entre elles : leur smantique inhrente), sans se soucier de limplmentation physique ni de la faon dont chaque groupe de travail voudra sen servir. Dans le cas des SGBD relationnels, il sagit dune vision tabulaire o la smantique de linformation est exprime en utilisant les concepts de relation, attributs et de contraintes dintgrit. On appelle cette description le schma conceptuel. Le niveau interne ou physique sappuie sur un systme de gestion de chiers pour dnir la politique de stockage ainsi que le placement des donnes. Le niveau physique est donc responsable du choix de lorganisation physique des chiers ainsi que de lutilisation de telle ou telle mthode daccs en fonction de la requte. On appelle cette description le schma interne.

1.2.4

Quelques SGBD connus et utiliss

Il existe de nombreux systmes de gestion de bases de donnes, en voici une liste non exhaustive : PostgreSQL : http ://www.postgresql.org/ dans le domaine public ;

1.2. SYSTME DE GESTION DE BASE DE DONNES (SGBD)

13

MySQL : http ://www.mysql.org/ dans le domaine public ; Oracle : http ://www.oracle.com/ de Oracle Corporation ; IBM DB2 : http ://www-306.ibm.com/software/data/db2/ Microsoft SQL : http ://www.microsoft.com/sql/ Sybase : http ://www.sybase.com/linux Informix : http ://www-306.ibm.com/software/data/informix/

14

CHAPITRE 1. INTRODUCTION AUX BASES DE DONNES {S1}

1.3
1.3.1

Travaux Dirigs Sensibilisation la problmatique des bases de donnes


Introduction

Objectifs Lobjectif de ce TD est de se faire une ide de lintrt de toute la thorie sur la conception des bases de donnes et de lintrt de lutilisation des systmes de gestion de base de donnes. En dautres termes, nous allons essayer dapporter des lments de rponse la question : Pourquoi dois-je membter avec toute cette thorie et ces connaissances assimiler alors que je sais trs bien manipuler un chier, y stocker des informations et les y retrouver avec mon langage de programmation favoris ? Contexte Supposons que vous ayez dvelopper une application de gestion dune bibliothque. Tous les livres de la bibliothque possdent un numro de livre, un titre, un ou plusieurs auteurs et un diteur. Lorsquune personne emprunte un livre, il faut mmoriser son nom, son prnom, son numro de tlphone, son adresse, la date de lemprunt et la date de retour une fois ce dernier ralis. Toutes les informations doivent tre conserves pour garder un historique des emprunts.

1.3.2

Approche nave

Une solution simple et nave . . . Certains dentre vous ont une exprience des bases de donnes (il sagit vraiment de quelque chose dincontournable aujourdhui) ou une exprience importante en dveloppement logiciel. Dans le cadre de cet exercice, oubliez toutes vos connaissances et vos rexions sur le sujet. 1. Votre application va devoir stocker toutes les informations mentionnes dans lintroduction (section Contexte), et de manire persistante, donc en utilisant un chier. Quelle est la solution de stockage des donnes la plus nave et la plus naturelle venant immdiatement lesprit ? . . . mais pas sans consquences Supposons que nous adoptions la solution nave et naturelle suivante : Nous crons un chier texte comportant lorigine une ligne par livre. Dans chaque ligne, on trouve les informations titre, auteur, diteur, numro du livre spares par une tabulation. Quand une personne emprunte un livre, on complte la ligne du livre en question par les champs nom, prnom, tlphone, adresse et date-emprunt toujours en sparant ces informations par une tabulation. Lorsquune personne retourne un livre, il sut dajouter un dernier champs date-retour sur la ligne du livre en question. Quand un livre est emprunt une nouvelle fois, on cre une nouvelle ligne avec toutes les informations concernant le livre et la personne qui lemprunte. Bien entendu, le bibliothcaire ne ressaisit pas tout, lapplication va chercher la plupart de ces informations dans le chier. En fait, on peut voir ce chier texte comme un tableau de chanes de caractres dont lentte des colonnes seraient les suivantes :
Titre Auteur diteur NLivre Nom Prnom Tlphone Adresse Date-emprunt Date-retour

Supposons que lapplication de gestion de bibliothque fonctionne correctement et stocke toutes ses donnes dans un chier comme celui que nous venons de dcrire. Nous allons nous pencher sur les inconvnients et les consquences inhrentes une telle approche.

1.3. TRAVAUX DIRIGS SENSIBILISATION LA PROBLMATIQUE DES BASES DE DONNES {S1}15

Lapplication fonctionne maintenant depuis 10 ans. Le nombre de personnes inscrites la bibliothque est relativement constant (bien que lon constate un roulement) et de 5000 personnes en moyenne par an. Un abonn emprunte en moyenne 5 livres par mois. 2. Quel est, approximativement, le nombre de lignes du chier des donnes ? 3. Quelle est la taille approximative du chier sachant que chaque caractre occupe 1 octet et quune ligne contient, en moyenne, 150 caractres ? 4. Supposons quune personne est abonne depuis lorigine de lapplication. Elle prvient le bibliothcaire que son prnom est mal orthographi. Combien de lignes, approximativement, doivent tre modies pour corriger cette erreur dans tout le chier de donnes ? 5. Lorsquun abonn emprunte un livre, le bibliothcaire saisit simplement le numro du livre et le nom et le prnom de labonn. Lapplication se charge alors de parcourir le chier pour rechercher les informations manquantes concernant le livre et labonn an dcrire, la n du chier, la nouvelle ligne concernant lemprunt. Dans le pire des cas, lapplication doit parcourir tout le chier. Supposons quun accs au chier cote 10ms, quune lecture de ligne cote 6ms et quune recherche sur la ligne pour trouver le numro du livre ou le nom et le prnom de labonn cote 1ms. Quel est, dans le pire des cas, le temps mis par lapplication pour complter les informations saisies par le bibliothcaire ? 6. numrez ou rsumez tous les problmes que la reprsentation des donnes choisie (le chier de donnes) semble poser.

1.3.3

Anement de la solution

Il est vident que la solution nave dcrite dans la section prcdente pose de nombreux problmes. Elle est totalement inacceptable pour une application srieuse bien quelle soit encore largement employe dans des cas de petite taille (comme par exemple, dans la plupart des chiers bibliographiques LaTeX). Un premier anage de la solution de la section prcdente consiste utiliser non pas un chier unique mais quatre chiers distincts : Un premier chier est ddi au stockage des informations concernant les livres de la bibliothque. Un second chier est ddi au stockage des informations concernant les abonns. Les informations stockes dans le troisme chier vont permettre de faire la correspondance entre les deux premiers pour signier quun livre donn est en cours de prt par un abonn donn depuis une date donne. Enn, un dernier chier va permettre de stocker lhistorique des prts. Il est similaire au troisime chier, mais il comporte en plus une information relative la date de retour du livre. 7. Prcisez le format et les informations stockes dans chacun de ces quatre chiers. 8. Quels sont les avantages de cette nouvelle solution ? 9. Intressons-nous au premier chier (celui concernant les livres). Quels problmes diagnostiquezvous dans ce chier ? 10. Le format de ce chier permet-il de prendre en compte des livres co-crits par plusieurs auteurs ? 11. Quelle solution proposez-vous ?

16

CHAPITRE 1. INTRODUCTION AUX BASES DE DONNES {S1}

1.3.4

Que retenir de ce TD ?

Les problmes les plus courants rencontrs dans des bases de donnes mal conues peuvent tre regroups selon les critres suivants : Redondance des donnes Certains choix de conception entranent une rptition des donnes lors de leur insertion dans la base. Cette redondance est souvent la cause danomalies provenant de la complexit des insertions. Cest, par exemple, le cas de la premire organisation propose : ds quun abonn emprunte un livre, il faut dupliquer toutes les information concernant labonn et le livre emprunt ! Au contraire, dans la deuxime solution, seuls les numros indispensables la distinction dun livre et dun abonn sont rpts dans le cas dun emprunt. Incohrence en modication La redondance de linformation entrane galement des risques en cas de modication dune donne car on oublie frquemment de modier toutes ses occurrences. Anomalie dinsertion Une mauvaise conception peut parfois empcher linsertion dune information, faute de connatre la valeur de tous ses champs. Pour remdier ce problme, certains SGBD introduisent une valeur non type qui signie que la valeur dun attribut est inconnue ou indtermine. Cette valeur (appele usuellement NULL) indique rellement une valeur inconnue et non une chane de caractres vide ou un entier gal zro. Dans la premire solution propose, insrer un nouvel abonn qui na jamais emprunt de livre peut poser des problmes. Une solution serait dinsrer des champs vides (suite de tabulations conscutives) au dbut de la ligne. Anomalie de suppression Enn, une mauvaise conception peut entraner, lors de la suppression dune information, la suppression dautres informations, smantiquement distinctes, mais indissociables dans la modlisation adopte. Par exemple, dans la premire solution propose, si lon dsire supprimer toutes les traces dun livre dans le chier de donnes, on fera compltement disparatre tous les abonns qui nont emprunt que ce livre. Bien dautres enjeux, que ceux que nous avons abords, sont inhrents aux bases de donnes. Ces enjeux ont t survols dans la section 1.2.2 et concernent la gestion des bases de donnes : indpendance physique, indpendance logique, accs aux donnes, administration centralise des donnes, cohrence des donnes, partage des donnes, scurit des donnes, rsistance aux pannes, etc. La conception des bases de donnes est donc un problme complexe. La gestion de ces bases constitue galement un problme complexe. Or, ces deux problmes sont extrmement rcurrents puisque les bases de donnes se trouvent aujourdhui au cur de tous les systmes dinformation. Cest pourquoi tout ces problmes ont t largement tudis et des solutions ables et prouves ont t trouves. De nombreux travaux ont ainsi permis de mettre au point une thorie permettant la conception de bases de donnes bien formes. Cest la problmatique que nous abordons dans le chapitre 2. La problmatique de la gestion des bases de donnes trouve une solution dans lutilisation dun SGBD. Pour toutes ces raisons, jespre que lintrt la thorie sur la conception des bases de donnes ainsi que lintrt de lutilisation des systmes de gestion de base de donnes deviennent vidant pour vous.

Chapitre 2

Conception des bases de donnes : le modle entits-associations


2.1
2.1.1

Introduction
Pourquoi une modlisation pralable ?

Il est dicile de modliser un domaine sous une forme directement utilisable par un SGBD. Une ou plusieurs modlisations intermdiaires sont donc utiles, le modle entits-associations constitue lune des premires et des plus courantes. Ce modle, prsent par Chen (1976), permet une description naturelle du monde rel partir des concepts dentit et dassociation1 . Bas sur la thorie des ensembles et des relations, ce modle se veut universel et rpond lobjectif dindpendance donnes-programmes. Ce modle, utilis pour la phase de conception, sinscrit notamment dans le cadre dune mthode plus gnrale et trs rpandue : Merise.

2.1.2

Merise

MERISE (Mthode dtude et de Ralisation Informatique pour les Systmes dEntreprise) est certainement le langage de spcication le plus rpandu dans la communaut de linformatique des systmes dinformation, et plus particulirement dans le domaine des bases de donnes. Une reprsentation Merise permet de valider des choix par rapport aux objectifs, de quantier les solutions retenues, de mettre en uvre des techniques doptimisation et enn de guider jusqu limplmentation. Reconnu comme standard, Merise devient un outil de communication. En eet, Merise russit le compromis dicile entre le souci dune modlisation prcise et formelle, et la capacit dorir un outil et un moyen de communication accessible aux non-informaticiens. Un des concepts cls de la mthode Merise est la sparation des donnes et des traitements. Cette mthode est donc parfaitement adapte la modlisation des problmes abords dun point de vue fonctionnel2 . Les donnes reprsentent la statique du systme dinformation et les traitements sa dynamique. Lexpression conceptuelle des donnes conduit une modlisation des donnes en entits et en associations. Dans ce cours, nous cartons volontairement la modlisation des traitements puisque nous ne nous intressons la mthode Merise que dans la perspective de la modlisation de bases de donnes. Merise propose une dmarche, dite par niveaux, dans laquelle il sagit de hirarchiser les proccupations de modlisation qui sont de trois ordres : la conception, lorganisation et la technique. En eet, pour aborder la modlisation dun systme, il convient de lanalyser en premier lieu de faon globale et de se concentrer sur sa fonction : cest--dire de sinterroger sur ce quil fait avant de dnir comment
Dans la littrature, on utilise indiremment le terme relation ou le terme association, on parle donc de modle entits-relations (E-R) ou de modle entits-associations (E-A). Nous prfrons utiliser le terme association plutt que le terme relation pour limiter la confusion avec les relations du modle relationnel. 2 A contrario, Merise nest pas adapt la modlisation des problmes abords dune manire oriente objet (dans ce cas, il faut, par exemple, utiliser UML).
1

17

18

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

il le fait. Ces niveaux de modlisation sont organiss dans une double approche donnes/traitements. Les trois niveaux de reprsentation des donnes, puisque ce sont eux qui nous intressent, sont dtaills ci-dessous. Niveau conceptuel : le modle conceptuel des donnes (MCD) dcrit les entits du monde rel, en terme dobjets, de proprits et de relations, indpendamment de toute technique dorganisation et dimplantation des donnes. Ce modle se concrtise par un schma entits-associations reprsentant la structure du systme dinformation, du point de vue des donnes. Niveau logique : le modle logique des donnes (MLD) prcise le modle conceptuel par des choix organisationnels. Il sagit dune transcription (galement appele drivation) du MCD dans un formalisme adapt une implmentation ultrieure, au niveau physique, sous forme de base de donnes relationnelle ou rseau, ou autres (cf. section 1.1.2). Les choix techniques dimplmentation (choix dun SGBD) ne seront eectus quau niveau suivant. Niveau physique : le modle physique des donnes (MPD) permet dtablir la manire concrte dont le systme sera mis en place (SGBD retenu).

2.2

lments constitutifs du modle entits-associations

La reprsentation du modle entits-associations sappuie sur trois concepts de base : lobjet ou entit, lassociation, la proprit. Lobjet est une entit ayant une existence propre. Lassociation est un lien ou relation entre objets sans existence propre. La proprit est la plus petite donne dinformation dcrivant un objet ou une association.

2.2.1

Entit

F. 2.1 Reprsentation graphique dun exemple de type-entit.

Dnition 2.1 -entit- Une entit est un objet, une chose concrte ou abstraite qui peut tre reconnue distinctement et qui est caractrise par son unicit. Exemples dentit : Jean Dupont, Pierre Bertrand, le livre que je tiens entre les mains, la Ferrari qui se trouve dans mon garage, etc. Les entits ne sont gnralement pas reprsentes graphiquement. Dnition 2.2 -type-entit- Un type-entit dsigne un ensemble dentits qui possdent une smantique et des proprits communes. Les personnes, les livres et les voitures sont des exemples de type-entit. En eet, dans le cas dune personne par exemple, les informations associes (i.e. les proprits), comme le nom et le prnom, ne changent pas de nature. Une entit est souvent nomme occurrence ou instance de son type-entit. La gure 2.1 montre la reprsentation graphique dun exemple de type-entit (Personne) sans ses proprits associes. Les type-entit Personne, caractris par un nom et un prnom, et Voiture, caractris par un nom et une puissance scale, ne peuvent pas tre regroups car ils ne partagent leurs proprits (le prnom est

2.2. LMENTS CONSTITUTIFS DU MODLE ENTITS-ASSOCIATIONS

19

une chane de caractres et la puissance scale un nombre). Les type-entit Personne, caractris par un nom et un prnom, et Livre, caractris un titre et un auteur, possdent tous les deux deux attributs du type chane de caractres. Pourtant, ces deux type-entits ne peuvent pas tre regroups car ils ne partagent pas une mme smantique : le nom dune personne na rien voir avec le titre dun livre, le prnom dune personne na rien voir avec un auteur. Par abus de langage, on utilise souvent le mot entit en lieu et place du mot type-entit, il faut cependant prendre garde ne pas confondre les deux concepts.

2.2.2

Attribut ou proprit, valeur

F. 2.2 Reprsentation graphique dun exemple de type-entit comportant trois attributs

Dnition 2.3 -attribut, proprit- Un attribut (ou une proprit) est une caractristique associe un type-entit ou un type-association. Exemples dattribut : le nom dune personne, le titre dune livre, la puissance dune voiture. Dnition 2.4 -valeur- Au niveau du type-entit ou du type-association, chaque attribut possde un domaine qui dnit lensemble des valeurs possibles qui peuvent tre choisies pour lui (entier, chane de caractres, boolen, . . .). Au niveau de lentit, chaque attribut possde une valeur compatible avec son domaine. La gure 2.2 montre la reprsentation graphique dun exemple de type-entit (Personne) avec trois attributs. Rgle 2.5 Un attribut ne peut en aucun cas tre partag par plusieurs type-entits ou type-associations. Rgle 2.6 Un attribut est une donne lmentaire, ce qui exclut des donnes calcules ou drives. Rgle 2.7 Un type-entit et ses attributs doivent tre cohrents entre eux (i.e. ne traiter que dun seul sujet). Par exemple, si le modle doit comporter des informations relatives des articles et leur fournisseur, ces informations ne doivent pas coexister au sein dun mme type-entit. Il est prfrable de mettre les informations relatives aux articles dans un type-entit Article et les informations relatives aux fournisseurs dans un type-entit Fournisseur. Ces deux type-entits seront probablement ensuite relis par un type-association.

2.2.3

Identiant ou cl

Dnition 2.8 -identiant, cl- Un identiant (ou cl) dun type-entit ou dun type-association est constitu par un ou plusieurs de ses attributs qui doivent avoir une valeur unique pour chaque entit ou association de ce type. Il est donc impossible que les attributs constituant lidentiant dun type-entit (respectivement typeassociation) prennent la mme valeur pour deux entits (respectivement deux associations) distinctes. Exemples didentiant : le numro de scurit sociale pour une personne, le numro dimmatriculation pour une voiture, le code ISBN dun livre pour un livre (mais pas pour un exemplaire).

20

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.3 Reprsentation graphique dun exemple de type-entit comportant quatre attributs dont un est un identiant : deux personnes peuvent avoir le mme nom, le mme prnom et le mme ge, mais pas le mme numro de scurit sociale.

Rgle 2.9 Chaque type-entit possde au moins un identiant, ventuellement form de plusieurs attributs. Ainsi, chaque type-entit possde au moins un attribut qui, sil est seul, est donc forcment lidentiant. Dans la reprsentation graphique, les attributs qui constituent lidentiant sont souligns et placs en tte (cf. gure 2.3).

2.2.4

Association ou relation

F. 2.4 Reprsentation graphique dun exemple de type-association liant deux type-entits.

Dnition 2.10

-association- Une association (ou une relation) est un lien entre plusieurs entits.

Exemples dassociation : lemprunt par ltudiant Tanidute du 3e exemplaire du livre Matrisez SQL . Les associations ne sont gnralement pas reprsentes graphiquement. Dnition 2.11 -type-association- Un type-association (ou un type-relation) dsigne un ensemble de relations qui possdent les mmes caractristiques. Le type-association dcrit un lien entre plusieurs type-entits. Les associations de ce type-association lient des entits de ces type-entits. Comme les type-entits, les type-associations sont dnis laide dattributs qui prennent leur valeur dans les associations. Rgle 2.12 Un attribut peut tre plac dans un type-association uniquement lorsquil dpend de toutes les entits lies par le type-association. Un type-association peut ne pas possder dattribut explicite et cela est relativement frquent, mais on verra quil possde au moins des attributs implicites. Exemples de type-association : lemprunt dun livre la bibliothque. Une association est souvent nomme occurrence ou instance de son type-association. La gure 2.4 montre la reprsentation graphique dun exemple de type-association. Par abus de langage, on utilise souvent le mot association en lieu et place du mot type-association, il faut cependant prendre garde ne pas confondre les deux concepts.

2.2. LMENTS CONSTITUTIFS DU MODLE ENTITS-ASSOCIATIONS

21

Dnition 2.13 -participant- Les type-entits intervenant dans un type-association sont appels les participants de ce type-association. Dnition 2.14 type-association. -collection- Lensemble des participants dun type-association est appel la collection de ce

Cette collection comporte au moins un type-entit (cf. section 2.3.2), mais elle peut en contenir plus, on parle alors de type-association n-aire (quand n = 2 on parle de type-association binaire, quand n = 3 de type-association ternaire, . . .). Dnition 2.15 -dimension ou arit dun type-association- La dimension, ou larit dun type-association est le nombre de type-entits contenu dans la collection. Comme un type-entit, un type-association possde forcment un identiant, quil soit explicite ou non. Rgle 2.16 La concatnation des identiants des type-entits lis un type-association constitue un identiant de ce type-association et cet identiant nest pas mentionn sur le modle (il est implicite). Cette rgle implique que deux instances dun mme type-association ne peuvent lier un mme ensemble dentits. Souvent, un sous-ensemble de la concatnation des identiants des type-entits lis sut identier le type-association. On admet galement un identiant plus naturel et explicite, condition quil ne soit quun moyen dexprimer plus simplement cette concatnation.

2.2.5

Cardinalit

F. 2.5 Reprsentation graphique des cardinalits dun type-association. Dans cet exemple pdagogique, on suppose quun livre ne peut possder quun auteur.

Dnition 2.17 -cardinalit- La cardinalit dune patte reliant un type-association et un type-entit prcise le nombre de fois minimal et maximal dinterventions dune entit du type-entit dans une association du typeassociation. La cardinalit minimale doit tre infrieure ou gale la cardinalit maximale. Exemple de cardinalit : une personne peut tre lauteur de 0 n livre, mais un livre ne peut tre crit que par une personne (cf. gure 2.5). Rgle 2.18 Lexpression de la cardinalit est obligatoire pour chaque patte dun type-association. Rgle 2.19 Une cardinalit minimal est toujours 0 ou 1 et une cardinalit maximale est toujours 1 ou n. Ainsi, si une cardinalit maximale est connue et vaut 2, 3 ou plus, alors nous considrons quelle est indtermine et vaut n. En eet, si nous connaissons n au moment de la conception, il se peut que cette valeur volue au cours du temps. Il vaut donc mieux considrer n comme inconnue ds le dpart. De la mme manire, on ne modlise pas des cardinalits minimales qui valent plus de 1 car ces valeurs sont galement susceptibles dvoluer. Enn, une cardinalit maximale de 0 na pas de sens car elle rendrait le type-association inutile. Les seuls cardinalits admises sont donc :

22

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

0,1 : une occurrence du type-entit peut exister tout en tant implique dans aucune association et peut tre implique dans au maximum une association. 0,n : cest la cardinalit la plus ouverte ; une occurrence du type-entit peut exister tout en tant implique dans aucune association et peut tre implique, sans limitation, dans plusieurs associations. 1,1 : une occurrence du type-entit ne peut exister que si elle est implique dans exactement (au moins et au plus) une association. 1,n : une occurrence du type-entit ne peut exister que si elle est implique dans au moins une association. Une cardinalit minimale de 1 doit se justier par le fait que les entits du type-entit en questions ont besoin de lassociation pour exister. Dans tous les autres cas, la cardinalit minimale vaut 0. Ceci dit, la discussion autour dune cardinalit minimale de 0 ou de 1 nest intressante que lorsque la cardinalit maximale est 1. En eet, nous verrons que, lors de la traduction vers un schma relationnel (cf. section 3.1.3), lorsque la cardinalit maximale est n, nous ne ferons pas la dirence entre une cardinalit minimale de 0 ou de 1. Remarques La seule dicult pour tablir correctement les cardinalits est de se poser les question dans le bon sens. Pour augmenter le risque derreurs, il faut noter que, pour les habitus, ou les futurs habitus, du modle UML, les cardinalits dun type-association sont lenvers (par rfrence UML) pour les type-associations binaires et lendroit pour les n-aires avec n > 2. La notion de cardinalit nest pas dnie de la mme manire dans le modle Amricain et dans le modle Europen (Merise). Dans le premier nexiste que la notion de cardinalit maximale. Avec un SGBD relationnel, nous pourrons contraindre des cardinalits des valeurs comme 2, 3 ou plus en utilisant des dclencheurs (trigger, cf. section ??).

2.3
2.3.1

Complments sur les associations


Associations plurielles

F. 2.6 Exemple dassociations plurielles entre un type-entit Personne et un type-entit Livre. Sur ce schma, un type-association permet de modliser que des personnes crivent des livres et un autre que des personnes critiquent (au sens de critique littraire) des livres.

Deux mmes entits peuvent tre plusieurs fois en association (cest le cas sur la gure 2.6).

2.3.2

Association rexive

Les type-associations rexifs sont prsents dans la plupart des modles. Dnition 2.20 -Type-association rexif- Un type-association est quali de rexif quand il matrialise une relation entre un type-entit et lui-mme (cf. gure 2.7).

2.3. COMPLMENTS SUR LES ASSOCIATIONS

23

F. 2.7 Exemple dassociations reexives sur le type-entit Personne. Le premier type-association permet de modliser la relation parent/enfant et le deuxime type-association la relation de fraternit.

Une occurrence de ce type-association (i.e. une association) associe gnralement une occurrence du type-association (i.e. une entit) une autre entit du mme type. Cette relation peut tre symtrique, cest le cas du type-association Etre frre sur la gure 2.7, ou ne pas ltre, comme le type-association Etre parent sur cette mme gure. Dans le cas o la relation nest pas symtrique, on peut prciser les rles sur les pattes du type-association comme pour la relation Etre parent de la gure 2.7. Lambigut pose par la non-symtrie dun type-association rexif sera leve lors du passage au modle relationnel (cf. section 3.1.3).

2.3.3

Association n-aire (n > 2)

Dans la section 2.2.4 nous avons introduit la notion de type-association n-aire. Ce type-association met en relation n type-entits. Mme sil ny a, en principe, pas de limite sur larit dun type-association, dans la pratique on ne va rarement au-del de trois. Les associations de degr suprieur deux sont plus diciles manipuler et interprter, notamment au niveau des cardinalits. Exemple dassociation n-aire inapproprie

F. 2.8 Exemple de type-association ternaire inappropri. Le type-association ternaire Contient associant les type-entits Facture, Produit et Client reprsent sur la gure 2.8 est inappropri puisquune facture donne est toujours adresse au mme client. En eet, cette modlisation implique pour les associations (instances du type-association) Contient une rptition du numro de client pour chaque produit dune mme facture.

24

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.9 Type-association ternaire de la gure 2.8 corrig en deux type-associations binaires.

La solution consiste clater le type-association ternaire Contient en deux type-associations binaires comme reprsent sur la gure 2.9. Dcomposition dune association n-aire

F. 2.10 Exemple de type association ternaire entre des type-entits Crneau horaire, Salle et Film.

La gure 2.10 nous montre un exemple de type-association ternaire entre les type-entits Crneau horaire, Salle et Film. Il est toujours possible de saranchir dun type-association n-aire (n > 2) en se ramenant des type-associations binaires de la manire suivante : On remplace le type-association n-aire par un type-entit et on lui attribut un identiant. On cre des type-associations binaire entre le nouveau type-entit et tous les type-entits de la collection de lancien type-association n-aire. La cardinalit de chacun des type-associations binaires crs est 1, 1 du ct du type-entit cr (celui qui remplace le type-association n-aire), et 0, n ou 1, n du ct des type-entits de la collection de lancien type-association n-aire. La gure 2.11 illustre le rsultat de cette transformation sur le schma de la gure 2.10. Lavantage du schma de la gure 2.11 est de rendre plus intelligible la lecture des cardinalits. Il ne faut surtout pas le voir comme un aboutissement mais comme une tape intermdiaire avant daboutir au schma de la gure 2.10 (cf. rgle 2.27). Ainsi, le mcanisme, que nous venons de dtailler ci-dessus,

2.3. COMPLMENTS SUR LES ASSOCIATIONS

25

F. 2.11 Transformation du type-association ternaire de la gure 2.10 en un type-entit et trois typeassociations binaires.

de passage dun type-association n-aire (n > 2) un type-entit et n type-associations binaires est tout fait rversible condition que : toutes les pattes des type-associations binaires autour du type-entit central ont une cardinalit maximale de 1 au centre et de n lextrieur ; les attributs du type-entit central satisfont la rgle de bonne formation des attributs de typeassociation (cf. section 2.5.2). Dtection dune erreur de modlisation par dcomposition dune association n-aire Passer par cette tape intermdiaire ne comportant pas de type-association n-aire (n > 2) peut, dans certains cas, viter dintroduire un type-association n-aire inappropri. Imaginons par exemple un type-association ternaire Vol liant trois type-entits Avion, Trajet et Pilote comme reprsent sur la gure 2.12. La transformation consistant supprimer le type-association ternaire du modle de la gure 2.12 produit le modle de la gure 2.13. Ce modle fait immdiatement apparatre une erreur de conception qui tait jusque l dicile diagnostiquer : gnralement, un vol donn sont aects plusieur pilotes (par exemple le commandant de bord et un copilote) et non pas un seul. Le modle correct modlisant cette situation est celui de la gure 2.14 o le type-entit Vol ne peut tre transform en un type-association ternaire Vol comme sur la gure 2.12.

26

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.12 Modle reprsentant un type-association ternaire Vol liant trois type-entits Avion, Trajet et Pilote.

F. 2.13 Transformation du type-association ternaire de la gure 2.12 en un type-entit et trois typeassociations binaires.

F. 2.14 Modle de la gure 2.13 corrig au niveau des cardinalits.

2.4. TRAVAUX DIRIGS MODLE ENTITS-ASSOCIATIONS {S2}

27

2.4
2.4.1

Travaux Dirigs Modle entits-associations (1re partie)


Attention aux attributs multiples

F. 2.15 Modlisation incorrecte dun enseignement.

On dsire modliser par un modle entits-associations le fait quun enseignement est dispens par un enseignant plusieurs tudiants qui ne suivent quun enseignement. On vous propose la modlisation reprsente sur la gure 2.15. 1. Critiquez cette modlisation. 2. Proposez-en une correcte.

2.4.2

tudiants, cours, enseignants, salles, . . .

Modlisez indpendamment les situations suivantes : 3. Plusieurs cours sont oerts. Un cours peut tre suivi par plusieurs tudiants et un tudiant peut sinscrire plusieurs cours. Pour chaque cours, on veut connatre la liste des tudiants et leur note (chaque cours ne comporte quune seule valuation). 4. Plusieurs cours sont oerts. Un cours est dispens par un seul enseignant et un enseignant peut dispenser plusieurs cours. Pour chaque cours, on veut connatre lenseignant qui le dispense. On sintresse maintenant la modlisation dune situation globale et plus complexe : Il existe plusieurs matires (mathmatiques, sciences-physiques, franais, anglais, philosophie). Plusieurs cours sont oerts et il peut y avoir plusieurs cours de la mme matire. Un cours est dispens par un, et un seul, enseignant et correspond une matire. Un enseignant peut dispenser plusieurs cours dans la mme matire ou dans des matires direntes. Un tudiant peut sinscrire plusieurs cours. Un cours est toujours dispens dans une mme salle, mais une salle peut recevoir plusieurs cours (successivement). Chaque cours ne comporte quune seule valuation. 5. Proposez un modle entits-associations permettant de modliser la situation dcrite ci-dessus.

2.4.3

Deux instances dun mme type-association ne peuvent lier un mme ensemble dentits

Considrons la modlisation de la gure 2.16 qui exprime quun client commande des produits chez un fournisseur. 6. Imaginons quun mme client commande un mme produit chez un mme fournisseur plus dune fois. Cette situation est-elle compatible avec le modle ? 7. Proposez une amlioration de ce modle.

28

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.16 Le type-association Commande lie les type-entits Produit, Client et Fournisseur.

F. 2.17 Modlisation des rsidences principales et secondaires dun ensemble de personnes.

2.4.4

Comprenez-vous les type-associations n-aire ?

On dsire crer une base de donnes sur les rsidences principales et secondaires dun chantillon de la population possdant exactement une rsidence principale et une rsidence secondaire. Dans cette base, si une personne ne peut possder plus dune rsidence, une rsidence peut trs bien appartenir plusieurs personnes. Pour modliser cette situation, on vous propose le modle de la gure 2.17. 8. Expliquez la cardinalit 1 1 de lune des pattes du type-association ternaire. 9. Critiquez cette solution. 10. Proposez un modle corrig.

F. 2.18 Ces deux modlisations ne sont pas des alternatives.

2.4. TRAVAUX DIRIGS MODLE ENTITS-ASSOCIATIONS {S2}

29

11. Les deux modles de la gure 2.18 ne sont pas quivalents. Expliquez pourquoi. 12. Dans le cours, section 2.3.3, est expos un exemple de dtection dune erreur de modlisation grce la dcomposition dune association n-aire. Discutez avec le charg de TD du problme expos dans cette section et illustr par le modle de la gure 2.12.

2.4.5

Cas dune bibliothque (1re partie)

Une petite bibliothque souhaite informatiser la gestion de son fonds documentaire et de ses emprunts. Dans cette perspective, le bibliothcaire, qui nest pas un informaticien, a rdig le texte suivant : Grce cette informatisation, un abonn devra pouvoir retrouver un livre en connaissant son titre. Il doit aussi pouvoir connatre la liste des livres dun auteur. Un abonn a le droit demprunter au maximum dix ouvrages simultanment. Les prts sont accords pour une dure de quinze jours. La gestion des prts doit permettre de connatre, tout moment, la liste des livres dtenus par un abonn, et inversement, de retrouver le nom des abonns dtenant un livre absent des rayons. Un livre peut tre crit par plusieurs auteurs. Chaque livre est achet en un ou plusieurs exemplaires. 13. Identiez, dans le texte ci-dessus, les mots devant se concrtiser par des entits, des associations ou des attributs. 14. Proposez un modle entits-associations permettant de modliser la situation dcrite ci-dessus.

30

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

2.5

Rgles de bonne formation dun modle entits-associations

La bonne formation dun modle entits-associations permet dviter une grande partie des sources dincohrences et de redondance. Pour tre bien form, un modle entits-associations doit respecter certaines rgles et les type-entits et type-associations doivent tre normalises. Un bon principe de conception peut tre formul ainsi : une seule place pour chaque fait . Bien que lobjectif des principes exposs dans cette section soit daider le concepteur obtenir un diagramme entits-associations bien form, ces principes ne doivent pas tre interprt comme des lois. Quil sagisse des rgles de bonne formation ou des rgles de normalisation, il peut exister, trs occasionnellement, de bonnes raisons pour ne pas les appliquer.

2.5.1

Rgles portant sur les noms

Rgle 2.21 Dans un modle entits-associations, le nom dun type-entit, dun type-association ou dun attribut doit tre unique.

F. 2.19 La prsence des deux type-entits Enseignant et Etudiant est symptomatique dune modlisation inacheve. A terme, ces deux type-entits doivent tre fusionns en un unique type-entit Personne. Rfrez vous la rgle 2.25 pour plus de prcisions concernant cette erreur de modlisation.

F. 2.20 Ici, les attributs Adresse de facturation sont redondants. Cette situation doit tre vite tout prix car elle entrane un gaspillage despace mmoire mais aussi et surtout un grand risque dincohrence. En eet, que faire si, dans le cadre dune occurrence du type-association Correspondre, la valeurs des deux attributs Adresse de facturation dirent ?

F. 2.21 Dans cette situation, les deux attributs Adresse doivent simplement tre renomms en Adresse client et Adresse fournisseur. Il en va de mme pour les deux attributs Nom.

2.5. RGLES DE BONNE FORMATION DUN MODLE ENTITS-ASSOCIATIONS

31

Lorsque des attributs portent le mme nom, cest parfois le signe dune modlisation inacheve (gure 2.19) ou dune redondance (gure 2.20). Sinon, il faut simplement ajouter au nom de lattribut le nom du type-entit ou du type-association dans lequel il se trouve (gure 2.21). Il faut toutefois remarquer que le dernier cas dcrit nest pas rdhibitoire et que les SGDB Relationnel saccommodent trs bien de relations comportant des attributs de mme nom. Lcriture des requtes sera tout de mme plus lisible si les attributs ont tous des noms dirents.

2.5.2

Rgles de normalisation des attributs

Rgle 2.22 Il faut remplacer un attribut multiple en un type-association et un type-entit supplmentaires.

F. 2.22 Remplacement des attributs multiples en un type-association et un type-entit et dcomposition des attributs composites.

En eet, les attributs multiples posent rgulirement des problmes dvolutivit du modle. Par exemple, sur le modle de gauche de la gure 2.22, comment faire si un employ possde deux adresses secondaires ou plusieurs numros de portable ? Il est galement intressant de dcomposer les attributs composites comme lattribut Adresse par exemple. Il est en eet dicile dcrire une requte portant sur la ville o habitent les employs si cette information est noye dans un unique attribut Adresse. Rgle 2.23 Il ne faut jamais ajouter un attribut driv dautres attributs, que ces autres attributs se trouvent dans le mme type-entit ou pas.

F. 2.23 Il faut supprimer lattribut Montant total du type-entit Commande car on peut le calculer partir des attributs Quantit du type association Contenir et Prix unitaire du type-entit Article.

En eet, les attributs drivs induisent un risque dincohrence entre les valeurs des attributs de base et celles des attributs drivs. La gure 2.23 illustre le cas dun attribut Montant total dans un type-entit Commande qui peut tre calcul partir des attributs Quantit du type association Contenir et Prix unitaire du type-entit Article. Il faut donc supprimer lattribut Montant total dans le type-entit Commande. Dautres attributs drivs sont galement viter comme lge, que lon peut dduire de la

32

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

date de naissance et de la date courante. Il faut cependant faire attention aux piges : par exemple, le code postal ne dtermine ni le numro de dpartement ni la Ville3 Comme nous lavons dj dit (cf. rgle 2.12), les attributs dun type-association doivent dpendre directement des identiants de tous les type-entits de la collection du type-association.

F. 2.24 Comme la cardinalit maximale du type-association Livrer est 1 du ct du type-entit Livraison, lattribut Nom livreur de Livrer doit tre dplac dans Livraison. Par exemple, sur la gure 2.23, lattribut Quantit du type-association Contenir dpend bien la fois de lidentiant N commande et de N article des type-entits de la collection de Contenir. Inversement, sur cette mme gure, lattribut Prix-unitaire ne dpend que de N article du type-entit Article, il ne pourait donc pas tre un attribut du type-association Contenir. Une consquence immdiate de cette rgle est quun type association dont la cardinalit maximale de lune des pattes est 1 ne peut pas possder dattribut. Si elle en possdait, ce serait une erreur de modlisation et il faudrait les dplacer dans le type-entit connect la patte portant la cardinalit maximale de 1 (cf. gure 2.24). Rgle 2.24 Un attribut correspondant un type numr est gnralement avantageusement remplac par un type-entit. Par exemple, sur la gure 2.25, lattribut Type caractrise le type dune mission et peut prendre des valeurs comme : actualit, culturelle, reportage, divertissement, etc. Remplacer cet attribut par un typeentit permet, dune part, daugmenter la cohrence (en saranchissant, par exemple, des variations du genre culturelle, culture, Culture, . . .) et dautre part, si les cardinalits le permettent, de pouvoir aecter plusieurs types une mme entit (ex : actualit et culturelle)

F. 2.25 Un attribut correspondant un type numr est gnralement avantageusement remplac par un type-entit..

2.5.3

Rgles de fusion/suppression dentits/associations

Rgle 2.25 Il faut factoriser les type-entits quand cest possible. La spcialisation du type-entit obtenu peut se traduire par lintroduction dun attribut supplmentaire dont lensemble des valeurs possibles est lensemble des noms des type-entits factoriss (gure 2.26).
3 Le code postal en France identie le bureau distributeur qui achemine le courrier dans une commune. En consquence et daprs cette dnition, il nexiste pas de relation entre le code postal et le code du dpartement de la commune. Par exemple,

2.5. RGLES DE BONNE FORMATION DUN MODLE ENTITS-ASSOCIATIONS

33

F. 2.26 Il faut factoriser les type-entits quand cest possible, ventuellement en introduisant un nouvel attribut.

Mais lintroduction dun attribut supplmentaire nest pas forcment ncessaire ou souhaitable. Par exemple, sur le modle entits-associations nal de la gure 2.27, on peut distinguer les entits qui correspondent des crivains ou des abonns en fonction du type de lassociation, Ecrire ou Emprunter, que lentit en question entretient avec une entit du type Livre. Ne pas introduire dattribut permet en outre de permettre une personne dtre la fois un Abonn et un crivain.

F. 2.27 Il faut factoriser les type-entits quand cest possible, mais lintroduction dun attribut supplmentaire nest pas toujours ncessaire. Remarque : ce diagramme est intentionnellement simpli outrance.

Rgle 2.26 Il faut factoriser les type-associations quand cest possible. Cette rgles est le pendant pour les type-associations de la rgle 2.25 qui concerne les type-entits. La spcialisation du type-association obtenu peut se traduire par lintroduction dun attribut supplmentaire dont lensemble des valeurs possibles est lensemble des noms des type-associations factoriss. La gure 2.28 montre un exemple de multiplication inutile de type-associations. Rgle 2.27 Un type-entit remplaable par un type-association doit tre remplac. Par exemple, le type-entit Projection de la gure 2.11 page 25 doit tre remplac par le type-association ternaire Projeter pour aboutir au schma de la gure 2.10 page 24. Rgle 2.28 Lorsque les cardinalits dun type-association sont toutes 1, 1 cest que le type-association na pas lieu dtre.
la commune La Feuillade, dont le code postal est 19600, est situe dans le dpartement de la Dordogne (24). Dans cette non correspondance entre code postal et dpartement, il y a toute la Corse ! Il ny a pas non plus de correspondance biunivoque entre le code postal et une ville. Une commune peut avoir plusieurs codes postaux, un code postal peut recouvrir plusieurs communes.

34

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.28 Un seul type-association sut pour remplacer les quatre type-associations Jouer en tant que . . .

Il faut aussi se poser la question de lintrt du type-association quand les cardinalits maximale sont toutes de 1.

F. 2.29 Lorsque les cardinalits dun type-association sont toutes 1, 1 cest quil sagit dun typeassociation fantme. Lorsque les cardinalits dun type-association sont toutes 1, 1, le type-association doit gnralement tre supprim et les type-entits correspondant fusionns comme lillustre la gure 2.29. Nanmoins, mme si toutes ses cardinalits maximale sont de 1, il est parfois prfrable de ne pas supprimer le type-association, comme dans lexemple de la gure 2.30. Rgle 2.29 Il faut veiller viter les type-associations redondants. En eet, sil existe deux chemins pour se rendre dun type-entit un autre, alors ces deux chemins doivent avoir deux signications ou deux dures de vie distinctes. Dans le cas contraire, il faut supprimer le chemin le plus court puisquil est dductible des autres chemins. Par exemple, dans le modle reprsent sur la gure 2.31, si un client ne peut pas rgler la facture dun autre client, alors le type-association Payer est redondant et doit purement et simplement tre supprim

2.5. RGLES DE BONNE FORMATION DUN MODLE ENTITS-ASSOCIATIONS

35

F. 2.30 Mme si toutes les cardinalits maximale sont de 1, il vaut mieux conserver le type-association Etre.

F. 2.31 Si un client ne peut pas rgler la facture dun autre client, alors le type-association Payer est inutile.

F. 2.32 Solution au problme de la redondance du type-association de la gure 2.31.

36

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.33 Dans le modle de la gure 2.31, si un client peut rgler la facture dun autre client, il faut remplacer le type-entit Rglement par un type-association Rgler.

du modle (cf. gure 2.32). On pourra toujours retrouver le client qui a eectu un rglement en passant par la facture correspondante. Par contre, si un client peut rgler la facture dun autre client, alors cest la rgle 2.27 quil faut appliquer : on remplace le type-entit Rglement par un type-association Rgler (cf. gure 2.33).

2.5.4

Normalisation des type-entits et type-associations

Introduction Les formes normales sont dirent stades de qualit qui permettent dviter la redondance, source danomalies. La normalisation peut tre aussi bien eectue sur un modle entits-associations, o elle sapplique sur les type-entits et type-associations, que sur un modle relationnel. Il existe 5 formes normales principales et deux extensions. Plus le niveau de normalisation est lev, plus le modle est exempte de redondances. Un type-entit ou un type-association en forme normale de niveau n est automatiquement en forme normale de niveau n 1. Une modlisation rigoureuse permet gnralement daboutir directement des type-entits et type-associations en forme normale de Boyce-Codd. Nous avons dcid de prsenter deux fois cette thorie de la normalisation : Une premire fois, dans le cadre du modle entits-associations (la prsente section 2.5.4), en privilgiant une approche plus intuitive qui nintroduit pas explicitement la notion de dpendance fonctionnelle (et encore moins les notions de dpendance multivalue et de jointure). Nous nous arrterons, dans cette section, la forme normale de Boyce-Codd. Puis une seconde fois, dans le cadre de modle relationnel (section 3.2), en privilgiant une approche plus formelle sappuyant sur la dnition des dpendances fonctionnelle, multivalue et de jointure. Nous irons alors jusqu la cinquime forme normale. Premire forme normale (1FN) Dnition 2.30 -Premire forme normale (1FN)- Un type-entit ou un type-association est en premire forme normale si tous ses attributs sont lmentaires, cest--dire non dcomposables. Un attribut composite doit tre dcomposs en attributs lmentaires (comme lattribut Adresse sur la gure 2.34) ou faire lobjet dune entit supplmentaire (comme lattribut Occupants sur la gure 2.34. Llmentarit dun attribut est toutefois fonction des choix de gestion. Par exemple, la proprit Adresse peut tre considre comme lmentaire si la gestion de ces adresses est globale. Par contre, sil faut pouvoir considrer les codes postaux, les noms de rues, . . ., il convient dclater la proprit Adresse

2.5. RGLES DE BONNE FORMATION DUN MODLE ENTITS-ASSOCIATIONS

37

F. 2.34 Exemple de normalisation en premire forme normale.

en Adresse (au sens numro dappartement, numro et nom de rue, . . .), Code postal et Ville. En cas de doute, il est prfrable (car plus gnral) dclater une proprit que deectuer un regroupement. Deuxime forme normale (2FN)

F. 2.35 Exemple de normalisation en deuxime forme normale. On suppose quun mme fournisseur peut fournir plusieurs produits et quun mme produit peut tre fourni par dirents fournisseurs.

Dnition 2.31 -Deuxime forme normale (2FN)- Un type-entit ou un type-association est en deuxime forme normale si, et seulement si, il est en premire forme normale et si tout attribut nappartenant pas la cl dpend de la totalit de cette cl. Autrement dit, les attributs doivent dpendre de lensemble des attributs participant la cl. Ainsi, si la cl est rduite un seul attribut, ou si elle contient tous les attributs, le type-entit ou le type-association est, par dnition, forcment en deuxime forme normale. La gure 2.35 montre un type-entit Article dcrivant des produits provenant de dirents fournisseurs. On suppose quun mme fournisseur peut fournir plusieurs produits et quun mme produit peut tre fourni par dirents fournisseurs. Dans ce cas, les attributs Produit ou Fournisseur ne peuvent constituer un identiant du type-entit Article. Par contre, le couple Produit/Fournisseur constitue bien un identiant du type-entit Article. Cependant, lattribut Adresse fournisseur ne dpend maintenant que dune partie de la cl (Fournisseur). Opter pour une nouvelle cl arbitraire rduite un seul attribut N article permet dobtenir un type-entit Article en deuxime forme normale. On va voir dans ce qui suit que cette solution na fait que dplacer le problme. Troisime forme normale (3FN) Dnition 2.32 -Troisime forme normale (3FN)- Un type-entit ou un type-association est en troisime forme normale si, et seulement si, il est en deuxime forme normale et si tous ses attributs dpendent directement de sa cl et pas dautres attributs. Cette normalisation peut amener dsimbriquer des type-entits caches comme le montre la gure 2.36. Un type-entit ou un type-association en deuxime forme normale avec au plus un attribut qui nappartient pas la cl est, par dnition, forcment en troisime forme normale.

38

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

F. 2.36 Exemple de normalisation en troisime forme normale. Dans cet exemple, lattribut Adresse fournisseur dpend de lattribut Fournisseur.

Forme normale de Boyce-Codd (BCNF)

F. 2.37 Exemple de normalisation en forme normale de Boyce-Codd.

Dnition 2.33 -Forme normale de Boyce-Codd (BCNF)- Un type-entit ou un type-association est en forme normale de Boyce-Codd si, et seulement si, il est en troisime forme normale et si aucun attribut faisant partie de la cl dpend dun attribut ne faisant pas partie de la cl. Intressons-nous, par exemple (cf. gure 2.37), un type-entit Diplm modlisant des personnes (Nom et Prnom) possdant un diplme (Diplme) dune institution (Institution). On suppose quil ny a pas dhomonyme, quune mme personne ne possde pas deux fois le mme diplme mais quelle peut possder plusieurs diplmes dirents. Une institution ne dlivre quun type de diplme, mais un mme diplme peut tre dlivr par plusieurs institutions (par exemple, plusieurs coles dingnieurs dlivrent des diplmes dingnieur). Une cl possible pour le type-entit Diplm est donc Nom, Prnom, Diplme. Le type-entit obtenu est en troisime forme normale, mais une redondance subsiste car lattribut Institution dtermine lattribut Diplme. Le type-entit Diplm nest donc pas en forme normale de Boyce-Codd. Un modle en forme normale de Boyce-Codd est considr comme tant de qualit susante pour une implantation. Autres formes normales Il existe dautres formes normales. La quatrime et la cinquime forme normale sont prsentes dans la section 3.2 dans le cadre du modle relationnel.

2.6
2.6.1

laboration dun modle entits-associations


tapes de conceptions dun modle entits-associations

Pour concevoir un modle entits-associations, vous devrez certainement passer par une succession dtapes. Nous les dcrivons ci-dessous dans lordre chronologique. Sachez cependant que la conception dun modle entits-associations est un travail non linaire. Vous devrez rgulirement revenir une tape prcdente et vous navez pas besoin den avoir termin avec une tape pour commencer ltape suivante.

2.6. LABORATION DUN MODLE ENTITS-ASSOCIATIONS

39

Recueil des besoins Cest une tape primordiale. Inventoriez lensemble des donnes partir des documents de lentreprise, dun ventuel cahier des charges et plus gnralement de tous les supports de linformation. Nhsitez pas poser des questions. Tri de linformation Faites le tri dans les donnes recueillies. Il faut faire attention, ce niveau, aux problmes de synonymie/polysmie. En eet, les attributs ne doivent pas tre redondants. Par exemple, si dans le langage de lentreprise on peut parler indiremment de rfrence darticle ou de n de produit pour dsigner la mme chose, cette caractristique ne devra se concrtiser que par un unique attribut dans le modle. Inversement, on peut parler dadresse pour dsigner ladresse du fournisseur et ladresse du client, le contexte permettant de lever lambigut. Par contre, dans le modle, il faudra veiller bien distinguer ces deux caractristiques par deux attributs distincts. Un autre exemple est celui dune entreprise de production fabricant des produits destination dune autre socit du mme groupe. Il se peut que dans ce cas, le prix de production (i.e. le cot de revient industriel) soit le mme que prix de vente (aucune marge nest ralise). Mme dans ce cas o les deux caractristiques sont identiques pour chaque entit (prix de production gale prix de vente), il faut imprativement les scinder en deux attributs au niveau du type-entit Produit. Sinon, cette galit factuelle deviendrait une contrainte impose par le modle, obligeant alors lentreprise de production revoir son systme le jour o elle dcidera de raliser une marge (prix de production infrieure au prix de vente). Identication des type-entits Le reprage dattributs pouvant servir didentiant permet souvent de reprer un type-entit. Les attributs de ce type-entit sont alors les attributs qui dpendent des attributs pouvant servir didentiant. Attention, un mme concept du monde rel peut tre reprsent dans certains cas comme un attribut et dans dautres cas comme un type-entit, selon quil a ou non une existence propre. Par exemple, la marque dune automobile peut tre vue comme un attribut du type-entit Vhicule de la base de donnes dune prfecture mais aussi comme un type-entit Constructeur automobile dans la base de donnes du Ministre de lIndustrie. Lorsquon ne parvient pas trouver didentiant pour un type-entit, il faut se demander sil ne sagit pas en fait dun type-association. Si ce nest pas le cas, un identiant arbitraire numrique entier peut faire laaire. Identication des type-associations Identiez les type-associations reliant les type-entits du modle. Le cas chant, leur aecter les attributs correspondant. Il est parfois dicile de faire un choix entre un type-entit et un type-association. Par exemple, un mariage peut tre considr comme un type-association entre deux personnes ou comme un type-entit pour lequel on veut conserver un numro, une date, un lieu, . . ., et que lon souhaite manipuler en tant que tel. tudiez galement les cardinalits des type-associations retenus. Lorsque toutes les pattes dun type-association portent la cardinalit 1, 1, il faut se demander si ce type-association et les typeentits lis ne dcrivent pas en fait un seul type-entit (cf. rgle 2.29). Vrication du modle Vriez que le modle respecte bien les rgles que nous avons noncs et les dnitions concernant la normalisation des type-entits et des type-associations. Le cas chant, oprez les modications ncessaires pour que le modle soit bien form. Remarque : pour faciliter la lecture du schma, il est assez courant de ne pas y faire gurer les attributs ou de ne conserver que ceux qui font partie des identiants. Les attributs cachs doivent alors absolument tre spcis dans un document part.

2.6.2

Conseils divers

Concernant le choix des noms Pour les type-entits, choisissez un nom commun dcrivant le type-entit (ex : tudiant, Enseignant, Matire). Certain prfrent mettre le nom au pluriel (ex : tudiants, Enseignants, Matires). Restez cependant cohrents, soit tous les noms de type-entit sont au pluriel, soit ils sont tous au singulier.

40

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

Pour les type-association, choisissez un verbe linnitif, ventuellement la forme passive ou accompagn dun adverbe (ex : Enseigner, Avoir lieu dans). Pour les attributs, utilisez un nom commun au singulier ventuellement accompagn du nom du type-entit ou du type-association dans lequel il se trouve (ex : nom de client, numro darticle). Concernant le choix des identiants des type-entits vitez les identiants composs de plusieurs attributs (comme, par exemple, un identiant form par les attributs nom et prnom dun type-association Personne) car : ils dgradent les performances du SGBD, mais surtout lunicit suppose par une telle dmarche nit gnralement, tt ou tard, par tre dmentie ! vitez les identiants susceptibles de changer au cours du temps (comme la plaque dimmatriculation dun vhicule). vitez les identiants du type chane de caractre. En fait, il est souvent prfrable de choisir un identiant arbitraire de type entier pour les typeentits. Cet identiant deviendra une cl primaire dans le schma relationnel et le SGBD lincrmentera automatiquement lors de la cration de nouvelles instances. Linconvnient de cette pratique est quil devient possible de se retrouver avec deux instances du type-entits reprsentant le mme objet mais avec deux numros dirents. Malgr cette inconvnient, cette politique de lidentiant reste largement avantageuse dans la pratique et permet, en outre, de saranchir (en la satisfaisant automatiquement) de la deuxime forme normale (cf. section 2.5.4). Bien distinguer les concepts de donnes et de traitements La modlisation conceptuelle de donnes exclut la reprsentation des traitements futurs sur ces donnes. Toutefois, elle ncessite la connaissance de ces traitements pour prvoir les donnes lmentaires indispensables ceux-ci. En consquence, il existe une confusion frquente entre les concepts de donnes et de traitements. Par exemple, la facturation est un traitement qui ncessite de connatre toutes les caractristiques dune commande. Par contre, la facturation ne se traduit ni par un type-entit, ni par un type-association dans le schma entits-associations.

2.7. TRAVAUX DIRIGS MODLE ENTITS-ASSOCIATIONS {S3}

41

2.7
2.7.1

Travaux Dirigs Modle entits-associations (2e partie)


Mais qui a fait cette modlisation ?

F. 2.38 Ce modle entits-associations nest pas en bonne forme !

Le modle entits-associations de la gure 2.38 pose de nombreux problmes. 1. Identiez les erreurs de modlisation et les incohrences dont soure ce modle. Prcisez chaque fois la rgle ou la dnition enfreinte et rchissez la correction apporter au modle. 2. Proposez un modle corrig bien form.

2.7.2

Cas dune bibliothque (2e partie)

Une petite bibliothque souhaite informatiser la gestion de son fonds documentaire et de ses emprunts. Dans cette perspective, le bibliothcaire, qui nest pas un informaticien, a rdig le texte suivant : Grce cette informatisation, un abonn devra pouvoir retrouver un livre en connaissant son titre. Il doit aussi pouvoir connatre la liste des livres dun auteur, la liste des auteurs dun livre ainsi que son diteur. Chaque livre est achet en un ou plusieurs exemplaires. Attention, un livre est parfois dit plusieurs fois, ventuellement par des diteurs dirents. Pour sabonner, une personne doit verser une caution et laisser ses coordonnes. Suivant le montant de sa caution, un abonn a le droit demprunter entre deux et dix ouvrages simultanment. Les prts sont accords pour une dure de quinze jours. La gestion des prts doit permettre de connatre, tout moment, la liste des livres dtenus par un abonn, et inversement, de retrouver le nom des abonns dtenant un livre absent des rayons. La gestion du fonds documentaire doit permettre de connatre pour chaque exemplaire sa date dachat, son tat et sil est disponible en rayon dans la bibliothque. 15. Identiez, dans le texte ci-dessus, les mots devant se concrtiser par des entits, des associations ou des attributs. 16. Proposez un modle entits-associations bien form permettant de modliser la situation dcrite ci-dessus.

42

CHAPITRE 2. CONCEPTION DES BASES DE DONNES (MODLE E-A) {S2-3}

2.7.3

Cas dune entreprise de dpannage

Une entreprise de dpannage possde plusieurs services spcialiss regroupant chacun un certain nombre demploys. Les employs ne travaillent que dans un service, ils ont une fonction dans lentreprise, ventuellement un suprieur et des subalternes. Leur salaire dpend de leur fonction et de leur anciennet au sein de lentreprise. En plus du petit outillage courant, lentreprise de dpannage dispose de gros matriels demandant une qualication particulire aux salaris susceptibles de lutiliser. Tous les salaris ne sont pas qualis pour lutilisation de tout le matriel. Ce matriel est rfrenc au niveau de lentreprise. Un matriel particulirement complexe est rfrenc comme un tout et, le cas chant, par composants, les composant tant eux-mmes parfois dcomposables. Une intervention de dpannage se fait toujours la demande dun client et sous la direction dun responsable. Une intervention de dpannage se dcompose en un certain nombre dactes de dpannage faisant intervenir un employ. Chaque acte de dpannage comporte un cot. Lorsquun employ participe un acte de dpannage, la date de dbut et de n de la participation de lemploy est note. Proposez un modle entits-associations bien form permettant de modliser la situation dcrite ci-dessus.

Chapitre 3

Bases de donnes relationnelles


3.1
3.1.1

Introduction au modle relationnel


Prsentation

Le modle relationnel a dj t introduit dans la section 1.1.2. Dans ce modle, les donnes sont reprsentes par des tables, sans prjuger de la faon dont les informations sont stockes dans la machine. Les tables constituent donc la structure logique1 du modle relationnel. Au niveau physique, le systme est libre dutiliser nimporte quelle technique de stockage (chiers squentiels, indexage, adressage dispers, sries de pointeurs, compression, . . .) ds lors quil est possible de relier ces structures des tables au niveau logique. Les tables ne reprsentent donc quune abstraction de lenregistrement physique des donnes en mmoire. Le succs du modle relationnel auprs des chercheurs, concepteurs et utilisateurs est d la puissance et la simplicit de ses concepts. En outre, contrairement certains autres modles, il repose sur des bases thoriques solides, notamment la thorie des ensembles et la logique des prdicats du premier ordre. Les objectifs du modle relationnel sont : proposer des schmas de donnes faciles utiliser ; amliorer lindpendance logique et physique (cf. section 1.2.2) ; mettre la disposition des utilisateurs des langages de haut niveau ; optimiser les accs la base de donnes ; amliorer lintgrit et la condentialit ; fournir une approche mthodologique dans la construction des schmas. De faon informelle, on peut dnir le modle relationnel de la manire suivante : les donnes sont organises sous forme de tables deux dimensions, encore appeles relations, dont les lignes sont appeles n-uplet ou tuple en anglais ; les donnes sont manipules par des oprateurs de lalgbre relationnelle ; ltat cohrent de la base est dni par un ensemble de contraintes dintgrit. Au modle relationnel est associe a la thorie de la normalisation des relations qui permet de se dbarrasser des incohrences au moment de la conception dune base de donnes relationnelle.

3.1.2

lments du modle relationnel


-attribut- Un attribut est un identicateur (un nom) dcrivant une information stocke dans

Dnition 3.1 une base.

Exemples dattribut : lge dune personne, le nom dune personne, le numro de scurit sociale. Dnition 3.2 -Domaine- Le domaine dun attribut est lensemble, ni ou inni, de ses valeurs possibles.

1 Le terme structure logique englobe ici le niveau conceptuel et les niveaux externes dANSI/SPARC (cf. section 1.2.3) et correspond approximativement au niveau logique de Merise (cf. section 2.1.2).

43

44

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Par exemple, lattribut numro de scurit sociale a pour domaine lensemble des combinaisons de quinze chires et nom a pour domaine lensemble des combinaisons de lettres (une combinaison comme cette dernire est gnralement appele chane de caractres ou, plus simplement, chane). Dnition 3.3 (n > 0). -relation- Une relation est un sous-ensemble du produit cartsien de n domaines dattributs

Une relation est reprsente sous la forme dun tableau deux dimensions dans lequel les n attributs correspondent aux titres des n colonnes. Dnition 3.4 -schma de relation- Un schma de relation prcise le nom de la relation ainsi que la liste des attributs avec leurs domaines. Le tableau 3.1 montre un exemple de relation et prcise son schma. N Scu 354338532195874 345353545435811 173354684513546 973564213535435 Nom Durand Dubois Dupont Dubois Prnom Caroline Jacques Lisa Rose-Marie

T. 3.1 Exemple de relation de schma Personne(N scu : Entier, Nom : Chane, Prnom : Chane)

Dnition 3.5

-degr- Le degr dune relation est son nombre dattributs.

Dnition 3.6 -occurrence ou n-uplets ou tuples- Une occurrence, ou n-uplets, ou tuples, est un lment de lensemble gur par une relation. Autrement dit, une occurrence est une ligne du tableau qui reprsente la relation. Dnition 3.7 -cardinalit- La cardinalit dune relation est son nombre doccurrences.

Dnition 3.8 -cl candidate- Une cl candidate dune relation est un ensemble minimal des attributs de la relation dont les valeurs identient coup sr une occurrence. La valeur dune cl candidate est donc distincte pour toutes les tuples de la relation. La notion de cl candidate est essentielle dans le modle relationnel. Rgle 3.9 Toute relation a au moins une cl candidate et peut en avoir plusieurs. Ainsi, il ne peut jamais y avoir deux tuples identiques au sein dune relation. Les cls candidates dune relation nont pas forcment le mme nombre dattributs. Une cl candidate peut tre forme dun attribut arbitraire, utilis cette seule n. Dnition 3.10 -cl primaire- La cl primaire dune relation est une de ses cls candidates. Pour signaler la cl primaire, ses attributs sont gnralement souligns. Dnition 3.11 -cl trangre- Une cl trangre dans une relation est forme dun ou plusieurs attributs qui constituent une cl primaire dans une autre relation. Dnition 3.12 relation. -schma relationnel- Un schma relationnel est constitu par lensemble des schmas de

Dnition 3.13 -base de donnes relationnelle- Une base de donnes relationnelle est constitue par lensemble des n-uplets des direntes relations du schma relationnel.

3.1. INTRODUCTION AU MODLE RELATIONNEL

45

3.1.3

Passage du modle entits-associations au modle relationnel

Rgles de passage Pour traduire un schma du modle entits-associations vers le modle relationnel, on peut appliquer les rgles suivantes : 1. La normalisation devrait toujours tre eectue avant le passage au modle relationnel (cf. section 2.5.4). Dans les faits, elle est parfois faite a posteriori (section 3.2), ce qui impose toujours une surcharge de travail importante. 2. Chaque type-entit donne naissance une relation. Chaque attribut de ce type-entit devient un attribut de la relation. Lidentiant est conserv en tant que cl de la relation. 3. Chaque type-association dont aucune patte na pour cardinalit maximale 1 donne naissance une relation. Chaque attribut de ce type-association devient un attribut de la relation. Lidentiant, sil est prcis, est conserv en tant que cl de la relation, sinon cette cl est forme par la concatnation des identiants des type-entits qui interviennent dans le type-association. 4. Un type-association dont au moins une patte a une cardinalit maximale 1 (ce type-association devrait tre binaire et na gnralement pas dattribut) ne devient pas une relation. Il dcrit en eet une dpendance fonctionnelle (cf. section 3.2). La relation correspondant au type-entit dont la patte vers le type-association a une cardinalit maximale valant 1, se voit simplement ajouter comme attribut (et donc comme cl trangre) lidentiant de lautre type-entit. Cas particulier dun type-assocuation du type 1 vers 1

F. 3.1 Reprise de lexemple de la gure 2.30 dun type-association Etre o toutes les cardinalits maximales sont de 1. Dans lexemple de la gure 3.1 toutes les cardinalits maximales du type-association Etre sont de 1. Lapplication des rgles de passage du modle entits-associations au modle relationnel nonces cidessus nous donnerait : Citoyen(Num-Citoyen, Num-Candidat, Nom, Prnom, Adresse) Candidat(Num-Candidat), Num-Citoyen, Parti) Lattribut Num-Candidat dans la relation Citoyen est une cl trangre de la relation Candidat. Lattribut Num-Citoyen dans la relation Candidat est une cl trangre de la relation Citoyen. Le type-association Etre tant du type 1 vers 1, il est entirement matrialis dans la relation Candidat par lattribut Num-Citoyen. Il est donc inutile de la rematrialiser dans la relation Citoyen. Lattribut Num-Candidat dans la relation Citoyen doit donc tre supprim. Dautre part, dans la relation Candidat, lattribut Num-Citoyen, en plus dtre une cl trangre, constitue une cl candidate. On peut donc se passer de la cl Num-Candidat. Le schma relationnel adquat correspondant au modle entits-associations de la gure 3.1 devient donc : Citoyen(Num-Citoyen, Nom, Prnom, Adresse) Candidat(Num-Citoyen, Parti) o Num-Citoyen, en plus dtre la cl de la relation Candidat, est une cl trangre de la relation Citoyen.

46

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Cas particulier dun type-entit sans attribut autre que sa cl Lorsquun type-entit ne possde pas dattribut en dehors de sa cl, il ne faut pas ncessairement en faire une relation.

F. 3.2 Ici, le type-entit Date ne doit pas se matrialiser par une relation.

Par exemple, le type-entit Date de la gure 3.2 ne doit pas se traduire par une relation. Le schma relationnel adquat correspondant au modle entits-associations de la gure 3.2 est donc : Exemplaire(Num-Exemplaire, date-achat) Personne(Num-Personne, nom, prnom, adresse) Emprunter(Num-Exemplaire, Num-Personne, Date, date-retour) Exemple complet

F. 3.3 Exemple trs simpli de modlisation entits-associations

Comme exemple dapplication, voici les relations dduites du schma entits-associations de la gure 3.3 : Patient(Num-Patient, Nom-Patient, Num-Mutuelle) Mutuelle(Num-Mutuelle, Nom-Mutuelle) Mdecin(Num-Mdecin, Nom-Mdecin, Prnom-Mdecin) Aection(Num-Aection, Nom-Aection) Hospitaliser(Num-Patient, Num-Aection, Num-Mdecin, Date-Entre, Chambre, Dure-Hospitalisation)

3.2. NORMALISATION

47

3.2
3.2.1

Normalisation
Introduction

Les formes normales sont dirents stades de qualit qui permettent dviter la redondance dans les bases de donnes relationnelles an dviter ou de limiter : les pertes de donnes, les incohrences au sein des donnes, leondrement des performances des traitements. Le processus de normalisation consiste remplacer une relation donne par certaines projections an que la jointure de ces projections permette de retrouver la relation initiale. En dautres termes, le processus est rversible (i.e. sans perte dinformation). Les notions de projection et de jointure seront respectivement dnies dans les sections 3.4.3 et 3.4.8. Il existe une hirarchie dans les rgles de normalisation : une relation en 5e forme normale est forcment en 4e forme normale, une relation en 4e forme normale est forcment en forme normale de Boyce-Codd, etc. Il existe des mthodes systmatiques pour normaliser une relation dans chacune des formes normales. Ces algorithmes de dcomposition, associs chacune des formes normales, sortent du cadre de ce cours et ne seront pas abords. La normalisation peut tre eectue, et cest prfrable, pendant la phase de conception sur le modle entits-associations (cf. section 2.5.4). Ce qui a t dit et les exemples qui ont t donns dans cette section restent transposables au modle relationnel. Dans le cas o la normalisation est faite en amont, lors de la conception, il nest pas ncessaire de la recommencer sur le modle relationnel. On peut tout de mme vrier que les relations obtenues par le passage du modle entits-associations au modle relationnel sont toujours en forme normale, mais, sauf erreur, il ne devrait pas y avoir de problme. Il en va tout autrement lorsque lon ne connat pas bien, ou matrise pas bien, lorigine dun modle relationnel. Dans ce cas, vrier la normalisation des relations, et, le cas chant, les normaliser, est une phase primordiale. Cest galement le cas lorsque le modle relationnel est le modle de conception (i.e. on ne passe pas par un modle entits-associations). Contrairement ce que nous avions fait dans la section 2.5.4 dans le cadre du modle entitsassociations, nous abordons ici la normalisation en nous appuyant sur les notions de dpendance fonctionnelle, dpendance multivalue et dpendance de jointure. Il est important de prendre conscience que la dpendance fonctionnelle, la dpendance multivalue et la dpendance de jointure sont des notions smantiques. Elles tirent leurs origines dans les contraintes du monde rel. Comme ces contraintes participent la smantique de la situation, elles doivent avoir une manifestation dans la base de donnes. Les dpendances doivent donc tre spcies dans la dnition de la base de donnes an que le SGBD puisse les appliquer. Les concepts de normalisation fournissent en fait un moyen indirect de dclarer ces dpendances. Autrement dit, la normalisation dune base de donnes est une manifestation observable des dpendances observes dans le monde rel. La dpendance fonctionnelle permet de dnir les premires formes normales jusqu la forme normale de Boyce-Codd (1FN, 2FN, 3FN et BCNF). La dpendance multivalue permet de dnir la quatrime forme normale (4FN) et la dpendance de jointure la cinquime forme normale (5FN).

3.2.2

Dpendance fonctionnelle (DF)

Dnition 3.14 -dpendance fonctionnelle (DF)- Soit R(A1 , A2 , . . . An ) un schma de relation, et X et Y des sous-ensembles de A1 , A2 , . . . An . On dit que X dtermine Y ou que Y dpend fonctionnellement de X si, et seulement si, des valeurs identiques de X impliquent des valeurs identiques de Y. On le note : X Y. Autrement dit, il existe une dpendance fonctionnelle entre un ensemble dattributs X et un ensemble dattributs Y, que lon note X Y, si connaissant une occurrence de X on ne peut lui associer quune seule occurrence de Y. Il est essentiel de noter quune dpendance fonctionnelle est une assertion sur toutes les valeurs possibles et non sur les valeurs actuelles : elle caractrise une intention et non une extension de la relation. Dnition 3.15 -dpendance fonctionnelle lmentaire- Une dpendance fonctionnelle lmentaire est une dpendance fonctionnelle de la forme X A, o A est un attribut unique nappartenant pas X et o il nexiste pas X inclus au sens strict dans X (i.e. X X) tel que X A.

48

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Autrement dit, une dpendance fonctionnelle est lmentaire si la cible est un attribut unique et si la source ne comporte pas dattributs superus. La question sur llmentarit dune dpendance fonctionnelle ne doit donc se poser que lorsque la partie gauche de la dpendance fonctionnelle comporte plusieurs attributs. Dnition 3.16 -dpendance fonctionnelle directe- Une dpendance fonctionnelle X A est une dpendance fonctionnelle directe sil nexiste aucun attribut B tel que lon puisse avoir X B et B A. En dautres termes, cela signie que la dpendance entre X et A ne peut pas tre obtenue par transitivit.

3.2.3

Premire et deuxime forme normale

Premire forme normale Dnition 3.17 -premire forme normale (1FN)- Une relation est en premire forme normale si, et seulement si, tout attribut contient une valeur atomique (non multiples, non composes). Par exemple, le pseudo schma de relation Personne(num-personne, nom, prnom, rue-et-ville, prnomsenfants) nest pas en premire forme normale. Il faut le dcomposer en : Personne(num-personne, nom, prnom, rue, ville) Prnoms-enfants(num-personne, num-prnom) Prnoms(num-prnom, prnom) Remarques sur la premire forme normale La premire forme normale impose que chaque ligne dune relation ait une seule valeur pour chaque colonne (i.e. attribut), ce qui est justement la dnition dune table. Donc, une table est ncessairement en premire forme normale au sens du modle relationnel. Cependant, il faut noter que le modle relationnel peut tre tendu de manire permettre des colonnes valeur complexe. On parle alors de modle relationnel tendu (NF2 pour Non First Normal Form en anglais). Deuxime forme normale Dnition 3.18 -deuxime forme normale (2FN)- Une relation est en deuxime forme normale si, et seulement si, elle est en premire forme normale et si toutes les dpendances fonctionnelles entre la cl et les autres attributs sont lmentaires. Autrement dit, une relation est en deuxime forme normale si, et seulement si, elle est en premire forme normale et si tout attribut nappartenant pas la cl ne dpend pas que dune partie de la cl. Une relation peut tre en deuxime forme normale par rapport une de ses cls candidates et ne pas ltre par rapport une autre. Une relation avec une cl primaire rduite un seul attribut est, par dnition, forcment en deuxime forme normale. Soit, par exemple, le schma de relation suivant : CommandeLivre(Num-Commande, Num-Client, Titre, Auteur, Quantit, Prix). Cette relation indique quun client (identi par Num-Client) a pass une commande (identie par Num-Commande) de livre. Elle est bien en premire forme normale. Par contre, les attributs Titre, Auteur, Quantit et Prix ne dpendent que de Num-Commande, et pas de Num-Client. Cette relation nest donc pas en deuxime forme normale. Une solution simple pour la normaliser est de la remplacer par : CommandeLivre(Num-Commande, Num-Client, Titre, Auteur, Quantit, Prix).

3.2.4

Troisime forme normale

Dnition 3.19 -troisime forme normale (3FN)- Une relation est en troisime forme normale si, et seulement si, elle est en deuxime forme normale et si toutes les dpendances fonctionnelles entre la cl et les autres attributs sont lmentaires et directes.

3.2. NORMALISATION

49

Autrement dit, une relation est en troisime forme normale si, et seulement si, elle est en deuxime forme normale et si tout attribut nappartenant pas la clef ne dpend pas dun attribut non-cl. Une relation peut tre en troisime forme normale par rapport une de ses cls candidates et ne pas ltre par rapport une autre. Une relation en deuxime forme normale avec au plus un attribut qui nappartient pas la cl primaire est, par dnition, forcment en troisime forme normale. Soit, par exemple, le schma de relation suivant : CommandeLivre(Num-Commande, Num-Client, Titre, Auteur, Quantit, Prix). Comme nous lavons vu plus haut, cette relation est bien en deuxime forme normale. Par contre, les attributs Auteur et Prix dpendent de lattribut Titre. La relation nest donc pas en troisime forme normale. Pour la normaliser, il faut la dcomposer de la manire suivante : CommandeLivre(Num-Commande, Num-Client, Num-Livre, Quantit) Livre(Num-Livre, Titre, Auteur, Prix) Remarques importantes Soit les schmas de relation suivant : Ville(Code-Postal, Nom, Population) Personne(Nom, Prnom, Tlphone) Dans ces relations, on suppose les dpendances fonctionnelles directes suivante : Code-Postal Nom Code-Postal Population Nom, Prnom Tlphone Dans la section 2.6.2, nous avons dit quil est souvent prfrable de choisir un identiant arbitraire de type entier. Cette pratique semble aller lencontre de la troisime forme normale. Par exemple, la relation Ville(num-ville, Nom, Code-Postal, Population) nest pas en troisime forme normale si lon suppose que les attributs Nom et Population dpendent toujours de lattribut Code-Postal. Cependant, comme nous lavons dit dans lintroduction, une dpendance fonctionnelle est la manifestation dune notion smantique, pas dune notion formelle ou absolue. Dans le cas du code postal, nous avons dj expliqu (cf. note page 33) quil nexiste pas de relation systmatique entre le code postal et le code du dpartement ou la commune. Ainsi, il ny a pas de dpendance fonctionnelle entre les attributs Nom et Population et lattribut Code-Postal. La relation Ville(num-ville, Nom, Code-Postal, Population) est donc bien en troisime forme normale (en France, plusieurs villes portent le mme nom). La notion de dpendance fonctionnelle est donc une question dinterprtation faisant appel la connaissance du systme modlis et au bon sens. Il en va de mme avec le schma de relation Livre(Num-Livre, Titre, Auteur, Prix). Nous avons ici introduit un identiant numrique arbitraire Num-Livre car lidentiant naturel Titre, qui est une chane de caractres complexe, de taille non borne et au format libre, ne constitue pas un bon identiant dans la pratique. Pour justier la troisime forme normale de cette relation, on peut imaginer que plusieurs livres peuvent porter le mme titre. Il faut enn noter que la normalisation nest pas une n en soit et quelle ne doit pas ncessairement tre systmatiquement applique (nous y reviendrons section 3.2.7).

3.2.5

Forme normale de BOYCE-CODD

Dnition 3.20 -forme normale de BOYCE-CODD (BCNF)- Une relation est en forme normale de BOYCE-CODD (BCNF) si, et seulement si, elle est en troisime forme normale et si les seules dpendances fonctionnelles lmentaires sont celles dans lesquelles une cl dtermine un attribut. Cette forme normale permet de renforcer certaines lacunes de la troisime forme normale. Soit, par exemple, le schma relationnel dcrivant lenseignement dune matire donne une classe par un enseignant : Matire(nom-matire) Classe(num-classe) Enseignant(nom-enseignant) Enseignement(nom-enseignant, num-classe, nom-matire)

50

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Supposons, de plus, quune matire nest enseigne quune seule fois dans une classe et que par un seul enseignant, et quun enseignant nenseigne quune seule matire. Chacune des relations respecte bien la troisime forme normale. Cependant, dans la relation Enseignement, nous avons les dpendances fonctionnelles lmentaires suivantes : 1. nom-matire, num-classe nom-enseignant 2. nom-enseignant nom-matire Il existe donc des dpendances fonctionnelles lmentaires dont la source nest pas la cl de la relation. nom-enseignant George George George George Michael Michael Michael Michael num-classe 5 6 7 8 5 6 7 8 nom-matire Physique Physique Physique Physique Mathmatiques Mathmatiques Mathmatiques Mathmatiques

T. 3.2 Exemple de relation prsentant une redondance due au non respect de la forme normale de BOYCE-CODD. Le non respect de la forme normale de BOYCE-CODD entrane une redondance illustre par la table 3.2 : pour chaque nom-enseignant identiant un enseignant, il faut rpter le nom-matire identiant la matire quil enseigne. Pour normaliser la relation Enseignement, il faut la dcomposer pour aboutir au schma relationnel suivant : Matire(nom-matire) Classe(num-classe) Enseignant(nom-enseignant, nom-matire) Enseigner(nom-enseignant, num-classe) Dans la pratique, la plupart des problmes de conception peuvent tre rsolus en appliquant les concepts de troisime forme normale et de forme normale de BOYCE-CODD. Les quatrime et cinquime formes normales traitent encore dautres cas de redondance, mais qui ne sont pas expliqus par des dpendances fonctionnelles.

3.2.6

Pour aller plus loin que le cours : quatrime et cinquime forme normale

Dpendance multivalue (DM) Dnition 3.21 -dpendance multivalue (DM)- Soit R(A1 , A2 , . . . An ) un schma de relation contenant n proprits, soit X, Y et Z des sous-ensembles de A1 , A2 , . . . An et soit Xi , Yi et Zi des instances de ces sous-ensembles (i.e. une aectation de valeur chacune des proprits de ces sous-ensembles). Il existe une dpendance multivalue (DM) entre les ensembles de proprits X, Y lorsque : (X1 , Y1 , Z1 ) R et (X1 , Y2 , Z2 ) R (X1 , Y1 , Z2 ) R et (X1 , Y2 , Z1 ) R On la note X Y, ce qui se lit X multidtermine Y.

Remarque : X YX Ai (X Y). Comme illustration, supposons une situation o un employ dun garage est quali pour eectuer un certain type dintervention sur certaines marques de voiture. Cette situation est modlise par le schma relationnel suivant : Employ(Nom-Employ)

3.2. NORMALISATION

51

Intervention(Type-Intervetion) Constructeur(Marque) Intervenir(Nom-Employ, Type-Intervetion, Marque) Supposons maintenant quun employ qui eectue un ensemble de types dinterventions pour un ensemble de marques de voiture, est capable deectuer chacun de ces types dinterventions sur chacune de ces marques de voitures. Dans ce cas, il existe des dpendances multivalues dans la relation Intervenir : Nom-Employ Type-Intervetion et Nom-Employ Marque. Quatrime forme normale Dnition 3.22 -quatrime forme normale (4FN)- Une relation est en quatrime forme normale (4FN) si, et seulement si, elle est en forme normale de BOYCE-CODD et si elle ne possde pas de dpendance multivalue ou si, X Y tant la dpendance multivalue, il existe une proprit A telle que X A.

Nom-Employ Tussier Tussier Martin Martin Martin Martin Piquard Piquard Piquard Piquard Piquard Piquard

Type-Intervetion Dpannage Dpannage lectricit lectricit Mcanique Mcanique Carrosserie Carrosserie Alarme Alarme lectricit lectricit

Marque Peugeot Citron Citron Renault Citron Renault Fiat Ford Fiat Ford Fiat Ford

T. 3.3 Exemple de relation ntant pas en quatrime forme normale. Dans la section prcdente, nous avons prsent un schma relationnel qui ntait pas en quatrime forme normale en raison du schma de relation Intervenir. La table 3.3 propose un exemple de relation correspondant ce schma de relation. Cette table permet dobserver le phnomne de redondance conscutif au fait que cette table nest pas en quatrime forme normale. Dans cette table, le nombre de lignes commenant par un nom demploy donn doit tre gale au nombre dinterventions que cet employ peut faire multipli par le nombre de marques sur lesquelles il peut travailler. Imaginons que lemploy Piquard puisse maintenant travailler sur des voitures de la marque Citron (on dsire ajouter une information dans la base), il faudra alors ajouter trois lignes la table : une pour chaque type dintervention (Carrosserie, Alarme et lectricit). Pour normaliser la relation Intervenir, il faut la dcomposer pour aboutir au schma relationnel suivant : Employ(Nom-Employ) Intervention(Type-Intervetion) Constructeur(Marque) Etre-capable-de(Nom-Employ, Type-Intervetion) Etre-capable-dintervenir-sur(Nom-Employ, Marque) Dpendance de jointure (DJ) Jusquici, nous avons pu rsoudre une redondance dans une relation en la remplaant par deux de ses projections. Il existe cependant des relations qui ne peuvent pas tre dcomposes sans perte

52

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

dinformation en deux projections, mais qui peuvent ltre en trois ou plus (ces cas sont assez rares en pratique). Cest ce que permet la normalisation en cinquime forme normale. Les dpendances de jointures font appel des notions (projection et jointure) qui seront dnies plus loin (cf. section 3.4). Dnition 3.23 -dpendance de jointure (DJ)- Soient X1 , X2 , . . . , Xn des sous-ensembles dun schma de relation R. Il y a une dpendance de jointure, note {X1 , X2 , . . . , Xn } dans la relation R, si : R = (X1 ) R (X2 ) R . . . (Xn ) R Dnition 3.24 -dpendance de jointure triviale- Une dpendance de jointure est triviale si une des parties, Xi , est lensemble de toutes les attributs de R. Cinquime forme normale (5FN) Dnition 3.25 -cinquime forme normale (5FN)- Une relation R est en cinquime forme normale (5FN) si, pour toute dpendance de jointure non triviale {X1, X2, . . . , Xn} dans R, chacun des Xi contient une cl candidate de R. En dautres termes, les seules dcompositions qui prservent le contenu sont celles o chacune des tables de la dcomposition contient une cl candidate de la table. Il est donc superu de dcomposer de ce point de vue. Cette forme normale est nale vis--vis de la projection et de la jointure : elle garantie quune relation en cinquime forme normale ne contient aucune anomalie pouvant tre supprime en eectuant des projections (i.e. des dcompositions). Relation Fournisseur Num-Fournisseur Num-Article Num-Organisme f1 a2 o1 f1 a1 o2 f2 a1 o1 f1 a1 o1 T. 3.4 Exemple de relation ntant pas en cinquime forme normale. Prenons, comme illustration2 , la relation Fournisseur (table 3.4) qui dcrit les fournisseurs des organismes de la fonction publique. La fonction publique a des rgles trs particulires concernant les fournisseurs pour rduire le potentiel de conit dintrt. Un fournisseur fournit un certain nombre darticles (par exemple f 1 fournit a1 et a2). Le mme article peut tre fourni par plusieurs fournisseurs (par exemple a1 est fourni par f 1 et f 2). Un fournisseur peut tre attitr plusieurs organismes (par exemple f 1 est attitr o1 et o2). Un organisme peut avoir plusieurs fournisseurs (par exemple o1 est servi par f 1 et f 2). Un organisme peut utiliser plusieurs articles (cest--dire que o1 utilise a1 et a2) et un article peut tre utilis par plusieurs organismes (cest--dire que a1 est utilis par o1 et o2). La rgle de la fonction publique est la suivante : si un fournisseur fournit un certain article (comme f 1 fournit a1), le fournisseur est attitr lorganisme (comme f 1 est attitr o1), et lorganisme utilise un article (comme o1 utilise a1), alors ncessairement, le fournisseur fournit larticle lorganisme ( f 1 fournit a1 o1). Le dernier fait est dductible des trois autres. Cette table contient de la redondance de donnes parce que certains faits sont rpts. Par exemple, le fait que f 1 fournit a1 est rpt deux reprises, une fois parce quil fournit a1 o1 et une autre fois parce quil fournit a1 o2. Le fait que f 1 est attitr o1 est aussi rpt deux reprises. Il en est de mme pour o1 qui utilise a1.
2

Exemple tir de (Godin, 2000a).

3.2. NORMALISATION

53

La relation Fournisseur soure dune dpendance de jointure : *{(Num-Fournisseur, Num-Article), (Num-Fournisseur, Num-Organisme), (Num-Article, Num-Organisme)}. Pour rsoudre le problme de redondance, il faut dcomposer la relation en trois (cf. table 3.5). Relation FournisseurArticle Relation FournisseurOrganisme Relation ArticleOrganisme Num-Fournisseur Num-Article Num-Fournisseur Num-Organisme Num-Article Num-Organisme f1 a2 f1 o1 a2 o1 f1 a1 f1 o2 a1 o2 f2 a1 f2 o1 a1 o1 T. 3.5 Dcomposition de la relation Fournisseur (table 3.4) pour obtenir des relations en cinquime forme normale. Il est important de se convaincre quaucune dcomposition binaire de cette relation ne prserve le contenu de la relation initiale. Pour cela, il sut de tenter de joindre deux tables parmi les trois prcdentes. Aucune de ces jointures, ne produit la relation Fournisseur.

3.2.7

Remarques au sujet de la normalisation

Il existe dautres formes normales comme la forme normale domaine-cl (FNDC), la forme normale de restriction-union ou la sixime forme normale (6NF). Bien que lobjectif de la normalisation soit damener le concepteur obtenir des relations en forme normale nale (i.e. en cinquime forme normale), cet objectif ne doit pas tre interprt comme une loi. Il peut exister, trs occasionnellement, de bonnes raisons pour passer outre les principes de la normalisation. De plus, un schma en cinquime forme normale nest pas ncessairement un schma pleinement satisfaisant. Dautres facteurs sont considrer dans le processus de conception dune base de donnes et lexprience et lintuition jouent un rle important.

54

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

3.3
3.3.1

Travaux Dirigs Modle relationnel


Passage du modle entits-associations au modle relationnel

1. tablissez un schma relationnel partir du petit diagramme entits-associations ci-dessus. 2. Quelles sont les cls primaires et les cls trangres de chaque relation ? 3. Proposez un petit exemple de base de donnes relationnelle correspondant au schma relationnel tabli prcdemment.

4. Combien de schmas de relation doit contenir la traduction en schma relationnel du petit diagramme entits associations ci-dessus ? 5. tablissez un schma relationnel partir du petit diagramme entits associations ci-dessus sans tenir compte de la spcicit de la cardinalit 1-1. 6. Proposez un petit exemple de base de donnes relationnelle correspondant au schma relationnel tabli prcdemment. 7. Expliquez pourquoi deux des relations doivent tre fusionnes. 8. Donnez le schma relationnel correct. 9. Quelles sont les cls primaires et les cls trangres de chaque relation ? 10. A partir du MCD de la gure 3.4, tablir le schma relationnel.

3.3.2

Normalisation

La pice Le schma de relation Pice permet de dcrire des pices employes dans un atelier de montage : Pice (Npice, prix-unit, TVA, libell, catgorie) Supposons les dpendances fonctionnelles suivantes : Npice prix-unit Npice TVA Npice libell Npice catgorie catgorie TVA 11. Proposez un identiant pour ce schma de relation. 12. Normalisez ce schma de relation jusqu la forme normale de Boyce Codd.

3.3. TRAVAUX DIRIGS MODLE RELATIONNEL {S4}

55

F. 3.4 Exemple de MCD rpondant la question 2.7.1 du TD 2.7

La prime Le schma de relation Prime donne la liste des primes attribues au personnel technique en fonction des machines sur lesquelles il travaille : Prime (Nmachine, atelier, Ntechnicien, montant-prime, nom-technicien) Supposons les dpendances fonctionnelles suivantes : Nmachine atelier Ntechnicien nom-technicien (Nmachine, Ntechnicien) montant-prime 13. Proposez un identiant pour ce schma de relation. 14. Normalisez ce schma de relation jusqu la forme normale de Boyce Codd. Lcole Soit la relation Enseignement qui prcise quun tudiant a un certain enseignant dans une certaine matire : Enseignement (nom-tudiant, prnom-tudiant, matire, volume-horaire-matire, nom-enseignant, prnom-enseignant, salaire-enseignant) 15. Identiez les dpendances fonctionnelles de ce schma de relation. 16. Normalisez ce schma de relation jusquen troisime forme normale. Supposons maintenant que les contraintes suivantes sappliquent : Chaque tudiant na quun enseignant par matire. Un enseignant nenseigne quune seule matire, mais une matire peut trs bien tre enseigne par plusieurs professeurs.

56

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

17. En tenant compte de ces nouvelles contraintes, identiez les dpendances fonctionnelles du schma de relationnel en troisime forme normale que vous avez obtenu. 18. Lun des schmas de relation nest pas en forme normale de Boyce Codd, lequel ? 19. A laide dun exemple de relation, illustrez la redondance induite par ce schma de relation. 20. Normalisez ce schma de relation en forme normale de Boyce Codd. 21. Cette dcomposition rsout le problme de redondance, mais nintroduit-elle pas un autre problme ?

3.4. ALGBRE RELATIONNELLE

57

3.4
3.4.1

Algbre relationnelle
Introduction

Lalgbre relationnelle est un support mathmatique cohrent sur lequel repose le modle relationnel. Lobjet de cette section est daborder lalgbre relationnelle dans le but de dcrire les oprations quil est possible dappliquer sur des relations pour produire de nouvelles relations. Lapproche suivie est donc plus oprationnelle que mathmatique. On peut distinguer trois familles doprateurs relationnels : Les oprateurs unaires (Slection, Projection) : ce sont les oprateurs les plus simples, ils permettent de produire une nouvelle table partir dune autre table. Les oprateurs binaires ensemblistes (Union, Intersection Dirence) : ces oprateurs permettent de produire une nouvelle relation partir de deux relations de mme degr et de mme domaine. Les oprateurs binaires ou n-aires (Produit cartsien, Jointure, Division) : ils permettent de produire une nouvelle table partir de deux ou plusieurs autres tables. Les notations ne sont pas standardises en algbre relationnelle. Ce cours utilise des notations courantes mais donc pas forcment universelles.

3.4.2

Slection

Dnition 3.26 -slection- La slection (parfois appele restriction) gnre une relation regroupant exclusivement toutes les occurrences de la relation R qui satisfont lexpression logique E, on la note (E) R. Il sagit dune opration unaire essentielle dont la signature est : relation expression logique relation En dautres termes, la slection permet de choisir (i.e. slectionner) des lignes dans le tableau. Le rsultat de la slection est donc une nouvelle relation qui a les mmes attributs que R. Si R est vide (i.e. ne contient aucune occurrence), la relation qui rsulte de la slection est vide. Le tableau 3.7 montre un exemple de slection. Numro 5 1 12 3 Nom Durand Germain Dupont Germain Prnom Caroline Stan Lisa Rose-Marie

T. 3.6 Exemple de relation Personne

Numro 5 12

Nom Durand Dupont

Prnom Caroline Lisa

T. 3.7 Exemple de slection sur la relation Personne du tableau 3.6 : (Numro5) Personne e

3.4.3

Projection

Dnition 3.27 -projection- La projection consiste supprimer les attributs autres que A1 , . . . An dune relation et liminer les n-uplets en double apparaissant dans la nouvelle relation ; on la note (A1 , ...An ) R. Il sagit dune opration unaire essentielle dont la signature est :

58

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

relation liste dattributs relation En dautres termes, la projection permet de choisir des colonnes dans le tableau. Si R est vide, la relation qui rsulte de la projection est vide, mais pas forcment quivalente (elle contient gnralement moins dattributs). Le tableau 3.8 montre un exemple de slection. Nom Durand Germain Dupont T. 3.8 Exemple de projection sur la relation Personne du tableau 3.6 : Nom Personne

3.4.4

Union

Dnition 3.28 -union- Lunion est une opration portant sur deux relations R1 et R2 ayant le mme schma et construisant une troisime relation constitue des n-uplets appartenant chacune des deux relations R1 et R2 sans doublon, on la note R1 R2 . Il sagit une opration binaire ensembliste commutative essentielle dont la signature est : relation relation relation Comme nous lavons dj dit, R1 et R2 doivent avoir les mmes attributs et si une mme occurrence existe dans R1 et R2 , elle napparat quune seule fois dans le rsultat de lunion. Le rsultat de lunion est une nouvelle relation qui a les mmes attributs que R1 et R2 . Si R1 et R2 sont vides, la relation qui rsulte de lunion est vide. Si R1 (respectivement R2 ) est vide, la relation qui rsulte de lunion est identique R2 (respectivement R1 ). Le tableau 3.9 montre un exemple dunion. Relation R1 Nom Prnom Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Relation R2 Nom Prnom Dupont Lisa Juny Carole Fourt Lisa Relation R Nom Prnom Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Juny Carole Fourt Lisa

T. 3.9 Exemple dunion : R = R1 R2

3.4.5

Intersection

Dnition 3.29 -intersection- Lintersection est une opration portant sur deux relations R1 et R2 ayant le mme schma et construisant une troisime relation dont les n-uplets sont constitus de ceux appartenant aux deux relations, on la note R1 R2 . Il sagit une opration binaire ensembliste commutative dont la signature est : relation relation relation Comme nous lavons dj dit, R1 et R2 doivent avoir les mmes attributs. Le rsultat de lintersection est une nouvelle relation qui a les mmes attributs que R1 et R2 . Si R1 ou R2 ou les deux sont vides, la relation qui rsulte de lintersection est vide. Le tableau 3.10 montre un exemple dintersection.

3.4. ALGBRE RELATIONNELLE

59

Relation R1 Nom Prnom Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Juny Carole

Relation R2 Nom Prnom Dupont Lisa Juny Carole Fourt Lisa Durand Caroline

Relation R Nom Prnom Durand Caroline Dupont Lisa Juny Carole

T. 3.10 Exemple dintersection : R = R1 R2

3.4.6

Dirence

Dnition 3.30 -dirence- La dirence est une opration portant sur deux relations R1 et R2 ayant le mme schma et construisant une troisime relation dont les n-uplets sont constitus de ceux ne se trouvant que dans la relation R1 ; on la note R1 R2 . Il sagit une opration binaire ensembliste non commutative essentielle dont la signature est : relation relation relation Comme nous lavons dj dit, R1 et R2 doivent avoir les mmes attributs. Le rsultat de la dirence est une nouvelle relation qui a les mmes attributs que R1 et R2 . Si R1 est vide, la relation qui rsulte de la dirence est vide. Si R2 est vide, la relation qui rsulte de la dirence est identique R1 . Le tableau 3.11 montre un exemple de dirence. Relation R1 Nom Prnom Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Juny Carole Relation R2 Nom Prnom Dupont Lisa Juny Carole Fourt Lisa Durand Caroline Relation R Nom Prnom Germain Stan Germain Rose-Marie

T. 3.11 Exemple de dirence : R = R1 R2

3.4.7

Produit cartsien

Dnition 3.31 -produit cartsien- Le produit cartsien est une opration portant sur deux relations R1 et R2 et qui construit une troisime relation regroupant exclusivement toutes les possibilits de combinaison des occurrences des relations R1 et R2 , on la note R1 R2 . Il sagit une opration binaire commutative essentielle dont la signature est : relation relation relation Le rsultat du produit cartsien est une nouvelle relation qui a tous les attributs de R1 et tous ceux de R2 . Si R1 ou R2 ou les deux sont vides, la relation qui rsulte du produit cartsien est vide. Le nombre doccurrences de la relation qui rsulte du produit cartsien est le nombre doccurrences de R1 multipli par le nombre doccurrences de R2 . Le tableau 3.12 montre un exemple de produit cartsien.

60

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Relation Amie Nom Prnom Fourt Lisa Juny Carole

Relation Cadeau Article Prix livre 45 poupe 25 montre 87

Nom Fourt Fourt Fourt Juny Juny Juny

Relation R Prnom Article Lisa livre Lisa poupe Lisa montre Carole livre Carole poupe Carole montre

Prix 45 25 87 45 25 87

T. 3.12 Exemple de produit cartsien : R = Amie Cadeau

3.4.8

Jointure, theta-jointure, equi-jointure, jointure naturelle

Jointure Dnition 3.32 -jointure- La jointure est une opration portant sur deux relations R1 et R2 qui construit une troisime relation regroupant exclusivement toutes les possibilits de combinaison des occurrences des relations R1 et R2 qui satisfont lexpression logique E. La jointure est note R1 E R2 . Il sagit dune opration binaire commutative dont la signature est : relation relation expression logique relation Si R1 ou R2 ou les deux sont vides, la relation qui rsulte de la jointure est vide. En fait, la jointure nest rien dautre quun produit cartsien suivi dune slection : R1 E R2 = E (R1 R2 ) Le tableau 3.13 montre un exemple de jointure. Relation Famille Nom Prnom Age Fourt Lisa 6 Juny Carole 42 Fidus Laure 16 Relation Cadeau AgeC Article Prix 99 livre 30 6 poupe 60 20 baladeur 45 10 dguisement 15 Relation R Nom Prnom Age AgeC Article Fourt Lisa 6 99 livre Fourt Lisa 6 20 baladeur Fourt Lisa 6 10 dguisement Juny Carole 42 99 livre Fidus Laure 16 99 livre Fidus Laure 16 20 baladeur

Prix 30 45 15 30 30 45

T. 3.13 Exemple de jointure : R = Famille ((AgeAgeC)(Prix<50)) Cadeau

Theta-jointure Dnition 3.33 -theta-jointure- Une theta-jointure est une jointure dans laquelle lexpression logique E est une simple comparaison entre un attribut A1 de la relation R1 et un attribut A2 de la relation R2 . La theta-jointure est note R1 E R2 . Equi-jointure Dnition 3.34 -equi-jointure- Une equi-jointure est une theta-jointure dans laquelle lexpression logique E est un test dgalit entre un attribut A1 de la relation R1 et un attribut A2 de la relation R2 . Lequi-jointure est note R1 A1 ,A2 R2 .

3.4. ALGBRE RELATIONNELLE

61

Jointure naturelle Dnition 3.35 -jointure naturelle- Une jointure naturelle est une equi-jointure dans laquelle les attributs des relations R1 et R2 portent le mme nom A. Dans la relation construite, lattribut A nest pas dupliqu mais fusionn en un seul attribut. La jointure naturelle est note R1 2 . R Le rsultat de la jointure naturelle est une nouvelle relation qui a tous les attributs de R1 et tous ceux de R2 sauf A. Il est en fait indirent dliminer lattribut A de la relation R1 ou R2 . Le tableau 3.14 montre un exemple de jointure naturelle. Relation Famille Nom Prnom Age Fourt Lisa 6 Juny Carole 40 Fidus Laure 20 Choupy Emma 6 Relation Cadeau Age Article Prix 40 livre 45 6 poupe 25 20 montre 87 Relation R Prnom Age Lisa 6 Carole 40 Laure 20 Emma 6

Nom Fourt Juny Fidus Choupy

Article poupe livre montre poupe

Prix 25 45 87 25

T. 3.14 Exemple de jointure naturelle : R = Famille Cadeau

3.4.9

Division

Dnition 3.36 -division- La division est une opration portant sur deux relations R1 et R2 , telles que le schma de R2 est strictement inclus dans celui de R1 , qui gnre une troisime relation regroupant toutes les parties doccurrences de la relation R1 qui sont associes toutes les occurrences de la relation R2 ; on la note R1 R2 . Il sagit dune opration binaire non commutative dont la signature est : relation relation relation Autrement dit, la division de R1 par R2 (R1 R2 ) gnre une relation qui regroupe tous les n-uplets qui, concatns chacun des n-uplets de R2 , donne toujours un n-uplet de R1 . La relation R2 ne peut pas tre vide. Tous les attributs de R2 doivent tre prsents dans R1 et R1 doit possder au moins un attribut de plus que R2 (inclusion stricte). Le rsultat de la division est une nouvelle relation qui a tous les attributs de R1 sans aucun de ceux de R2 . Si R1 est vide, la relation qui rsulte de la division est vide. Le tableau 3.15 montre un exemple de division. Relation Enseignement Enseignant Etudiant Germain Dubois Fidus Pascal Robert Dubois Germain Pascal Fidus Dubois Germain Durand Robert Durand Relation Etudiant Nom Dubois Pascal Relation R Enseignant Germain Fidus

T. 3.15 Exemple de division : R = Enseignement Etudiant. La relation R contient donc tous les enseignants de la relation Enseignement qui enseignent tous les tudiants de la relation Etudiant.

62

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

3.5

Travaux Dirigs Algbre relationnelle

Soit le schma relationnel suivant : Individu(Num-Ind, Nom, Prnom) Jouer(Num-Ind, Num-Film, Rle) Film(Num-Film Num-Ind, Titre, Genre, Anne) Projection(Num-Cin, Num-Film, Date) Cinma(Num-Cin, Nom, Adresse) Le tableau 3.16 donne une instance de ce schma relationnel.

3.5.1

Exercices de comprhension de requtes

Dans les exercices qui suivent, donnez, sous forme de relation, le rsultat des requtes formules en algbre relationnelle. Slection, et un peu de logique . . . 1. (Anne<1996) Film e 2. (Anne<2000Genre=Drame) Film e 3. (Anne<1990Genre=Drame) Film e 4. ((Anne>2000Genre=Policier)) Film e 5. ((Anne>2000)) (Genre=Drame) Film e Projection 6. (Titre,Genre,Anne) Film e 7. (Genre) Film 8. (Genre) (Anne<2000) Film e Union 9. ((Nom,Prnom) (Prnom=John) Individu) ((Nom,Prnom) (Prnom=Paul) Individu) e e e e Intersection 10. ((Prnom) Individu) ((Role) Jouer) e Dirence 11. ((Nom) (Nom[TW]) Individu) ((Nom) (Prnom=John) Individu) e Remarque : est un oprateur de comparaison indiquant que llment qui suit nest pas une chane de caractres mais une expression rgulire (cf. section 4.5.8). Produit cartsien 12. ((Titre,Genre) (Anne1985) Film) ((Nom) Cinma) e e Jointure 13. (Titre,Nom,Prnom) (Film NumInd Individu) e

3.5. TRAVAUX DIRIGS ALGBRE RELATIONNELLE {S5}

63

Relation Individu Num-Ind Nom Prnom 01 Kidman Nicole 02 Bettany Paul 03 Watson Emily 04 Skarsgard Stellan 05 Travolta John 06 L. Jackson Samuel 07 Willis Bruce 08 Irons Jeremy 09 Spader James 10 Hunter Holly 11 Arquette Rosanna 12 Wayne John 13 von Trier Lars 14 Tarantino Quentin 15 Cronenberg David 16 Mazursky Paul 17 Jones Grace 18 Glen John Num-Film 05 04 03 02 01 06 07 Num-Ind 01 02 03 04 05 06 07 08 09 10 11 04 16 Num-Ind 13 13 14 15 15 12 18

Relation Projection Num-Cin Num-Film Date 02 05 01/05/2002 02 05 02/05/2002 02 05 03/05/2002 02 04 02/12/1996 01 01 07/05/1996 02 07 09/05/1985 01 04 02/08/1996 04 03 08/04/1994 03 06 02/12/1990 02 02 25/09/1990 03 03 05/11/1994 04 03 06/11/1994 01 06 05/07/1980 02 04 02/09/1996 04 06 01/08/2002 03 06 09/11/1960 01 02 12/03/1988

Relation Film Titre Dogville Breaking the waves Pulp Fiction Faux-Semblants Crash Alamo Dangereusement vtre Num-Cin 02 01 03 04

Genre Drame Drame Policier Epouvante Drame Western Espionnage

Anne 2002 1996 1994 1988 1996 1960 1985

Relation Jouer Num-Film Rle 05 Grace 05 Tom Edison 04 Bess 04 Jan 03 Vincent Vega 03 Jules Winneld 03 Butch Coolidge 02 Beverly & Elliot Mantle 01 James Ballard 01 Helen Remington 01 Gabrielle 05 Chuck 07 May Day

Relation Cinma e Nom Adresse Le Fontenelle 78160 Marly-le-Roi Le Renoir 13100 Aix-en-Provence Gaumont Wilson 31000 Toulouse Espace Cin 93800 Epinay-sur-Seine

T. 3.16 Exemple dinstance de schma relationnel

64

CHAPITRE 3. BASES DE DONNES RELATIONNELLES {S4-5}

Division 14. ((Nom,Prnom,Titre) (Film NumFilm Jouer NumInd Individu)) e /((Titre) (Film NumInd ((Prnom=Lars) Individu)) e

3.5.2

Trouver la bonne requte

15. Quels sont les titres des lms dont le genre est Drame ? 16. Quels lms sont projets au cinma Le Fontenelle ? 17. Quels sont les noms et prnoms des ralisateurs ? 18. Quels sont les noms et prnoms des acteurs ? 19. Quels sont les noms et prnoms des acteurs qui sont galement ralisateurs ? 20. Quels lms (titres) ont t projets en 2002 ? 21. Donnez le titre des lms raliss par Lars von Trier. 22. Quels sont les ralisateurs qui ont ralis des lms dpouvante et des lms dramatiques ? 23. Quels sont les titres des lms o Nicole Kidman a jou un rle et qui ont t projets au cinma Le Fontenelle ? 24. Quels sont les acteurs qui nont pas jou dans des lms dramatiques ? 25. Quels sont les noms et prnoms des individus dont le prnom est la fois celui dun acteur et celui dun ralisateur sans quil sagisse de la mme personne ? 26. Quels acteurs a-t-on pu voir au cinma Le Fontenelle depuis lan 2000 ? 27. Quels sont les lms qui ont encore t lache 5 annes aprs leur sortie ? 28. Quels sont les cinmas qui ont projet tous les lms ? 29. Quels sont les acteurs que lon a pu voir dans toutes les salles ?

Chapitre 4

Langage SQL
4.1
4.1.1

Introduction
Prsentation gnrale

Introduction Le langage SQL (Structured Query Language) peut tre considr comme le langage daccs normalis aux bases de donnes. Il est aujourdhui support par la plupart des produits commerciaux que ce soit par les systmes de gestion de bases de donnes micro tel que Access ou par les produits plus professionnels tels que Oracle. Il a fait lobjet de plusieurs normes ANSI/ISO dont la plus rpandue aujourdhui est la norme SQL2 qui a t dnie en 1992. Le succs du langage SQL est d essentiellement sa simplicit et au fait quil sappuie sur le schma conceptuel pour noncer des requtes en laissant le SGBD responsable de la stratgie dexcution. Le langage SQL propose un langage de requtes ensembliste et assertionnel. Nanmoins, le langage SQL ne possde pas la puissance dun langage de programmation : entres/sorties, instructions conditionnelles, boucles et aectations. Pour certains traitements il est donc ncessaire de coupler le langage SQL avec un langage de programmation plus complet. De manire synthtique, on peut dire que SQL est un langage relationnel, il manipule donc des tables (i.e. des relations, cest--dire des ensembles) par lintermdiaire de requtes qui produisent galement des tables. Historique rapide En 1970, E.F. CODD, directeur de recherche du centre IBM de San Jos, invente le modle relationnel qui repose sur une algbre relationnelle. Ce modle provoque une rvolution dans lapproche des bases des donnes. En 1977, cration du langage SEQUEL (Structured English Query Language) et mise en place du Systme R, prototype de base de donnes reposant sur la thorie de CODD. SEQUEL continue de senrichir pour devenir SQL (Structured Query Language). En 1981, la socit ORACLE CORP lance la premire version de son systme de gestion de base de donnes relationnelle (SGBDR), IBM sort SQL/DS et RTI lance INGRES. En 1982, IBM sort SQL/DS pour son environnement VM/CMS et lANSI (American National Standard Institute) lance un projet de normalisation dun langage relationnel. En 1983, IBM lance DB2 pour lenvironnement MVS. En 1986, la socite SYBASE lance son SGBDR conu selon le modle Client-Serveur. La premire norme SQL (SQL-1) de lISO (International Standard Organisation) apparat. Il existe dsormais plusieurs dizaines de produits proposant le langage SQL et tournant sur des machines allant des micros aux gros systmes. Depuis, les dirents produits phares ont volu, la norme SQL est passe SQL-2, puis SQL-3. SQL est dsormais un langage incontournable pour tout SGBD moderne. Par contre, bien quune

65

66

CHAPITRE 4. LANGAGE SQL

norme existe, on assiste une prolifration de dialectes propres chaque produit : soit des sousensembles de la norme (certaines fonctionnalits ntant pas implantes), soit des sur-ensembles (ajout de certaines fonctionnalits, propres chaque produit). Oracle et Informix dominent le march actuel, SQL-Server (de Microsoft) tente de simposer dans le monde des PC sous NT. ct des ces produits, trs chers, existent heureusement des systmes libres et gratuits : MySQL et PostgreSQL sont les plus connus. Bien que ces SGBDR naient pas la puissance des produits commerciaux, certains sen approchent de plus en plus. Les dirences notables concernent principalement les environnements de dveloppement qui sont de vritables ateliers logiciels sous Oracle et qui sont rduits des interfaces de programmation C, Python, Perl sous PostgreSQL. Il en va de mme pour les interfaces utilisateurs : il en existe pour PostgreSQL, mais ils nont certainement pas la puissance de leurs quivalents commerciaux. Terminologie Modle relationnel Franais Anglais Relation Relation Domaine Domain Attribut Attribute n-uplet tuple Cl primaire Primary key Standard SQL Table Domaine Colonne Ligne Primary key

4.1.2

Catgories dinstructions

Les instructions SQL sont regroupes en catgories en fonction de leur utilit et des entits manipules. Nous pouvons distinguer cinq catgories, qui permettent : 1. la dnition des lments dune base de donnes (tables, colonnes, clefs, index, contraintes, . . .), 2. la manipulation des donnes (insertion, suppression, modication, extraction, . . .), 3. la gestion des droits daccs aux donnes (acquisition et rvocation des droits), 4. la gestion des transactions, 5. et enn le SQL intgr. Langage de dnition de donnes Le langage de dnition de donnes (LDD, ou Data Denition Language, soit DDL en anglais) est un langage orient au niveau de la structure de la base de donnes. Le LDD permet de crer, modier, supprimer des objets. Il permet galement de dnir le domaine des donnes (nombre, chane de caractres, date, boolen, . . .) et dajouter des contraintes de valeur sur les donnes. Il permet enn dautoriser ou dinterdire laccs aux donnes et dactiver ou de dsactiver laudit pour un utilisateur donn. Les instructions du LDD sont : CREATE, ALTER, DROP, AUDIT, NOAUDIT, ANALYZE, RENAME, TRUNCATE. Langage de manipulation de donnes Le langage de manipulation de donnes (LMD, ou Data Manipulation Language, soit DML en anglais) est lensemble des commandes concernant la manipulation des donnes dans une base de donnes. Le LMD permet lajout, la suppression et la modication de lignes, la visualisation du contenu des tables et leur verrouillage. Les instructions du LMD sont : INSERT, UPDATE, DELETE, SELECT, EXPLAIN, PLAN, LOCK TABLE. Ces lments doivent tre valids par une transaction pour quils soient pris en compte.

4.1. INTRODUCTION {S6}

67

Langage de protections daccs Le langage de protections daccs (ou Data Control Language, soit DCL en anglais) soccupe de grer les droits daccs aux tables. Les instructions du DCL sont : GRANT, REVOKE.

Langage de contrle de transaction Le langage de contrle de transaction (ou Transaction Control Language, soit TCL en anglais) gre les modications faites par le LMD, cest--dire les caractristiques des transactions et la validation et lannulation des modications. Les instructions du TCL sont : COMMIT, SAVEPOINT, ROLLBACK, SET TRANSACTION

SQL intgr Le SQL intgr (Embedded SQL) permet dutiliser SQL dans un langage de troisime gnration (C, Java, Cobol, etc.) : dclaration dobjets ou dinstructions ; excution dinstructions ; gestion des variables et des curseurs ; traitement des erreurs. Les instructions du SQL intgr sont : DECLARE, TYPE, DESCRIBE, VAR, CONNECT, PREPARE, EXECUTE, OPEN, FETCH, CLOSE, WHENEVER.

4.1.3

PostgreSQL

Les systmes traditionnels de gestion de bases de donnes relationnelles (SGBDR) orent un modle de donnes compos dune collection de relations contenant des attributs relevant chacun dun type spcique. Les systmes commerciaux grent par exemple les nombres dcimaux, les entiers, les chanes de caractres, les monnaies et les dates. Il est communment admis que ce modle est inadquat pour les applications de traitement de donnes de lavenir car, si le modle relationnel a remplac avec succs les modles prcdents en partie grce sa simplicit spartiate , cette dernire complique cependant limplmentation de certaines applications. PostgreSQL apporte une puissance additionnelle substantielle en incorporant les quatre concepts de base suivants an que les utilisateurs puissent facilement tendre le systme : classes, hritage, types, fonctions. Dautres fonctionnalits accroissent la puissance et la souplesse : contraintes, dclencheurs, rgles, intgrit des transactions. Ces fonctionnalits placent PostgreSQL dans la catgorie des bases de donnes relationnel-objet. Ne confondez pas cette catgorie avec celle des serveurs dobjets qui ne tolre pas aussi bien les langages traditionnels daccs aux SGBDR. Ainsi, bien que PostgreSQL possde certaines fonctionnalits orientes objet, il appartient avant tout au monde des SGBDR. Cest essentiellement laspect SGBDR de PostgreSQL que nous aborderons dans ce cours. Lune des principales qualits de PostgreSQL est dtre un logiciel libre, cest--dire gratuit et dont les sources sont disponibles. Il est possible de linstaller sur les systmes Unix/Linux et Win32. PostgreSQL fonctionne selon une architecture client/serveur, il est ainsi constitu : dune partie serveur, cest--dire une application fonctionnant sur la machine hbergeant la base de donnes (le serveur de bases de donnes) capable de traiter les requtes des clients ; il sagit dans le cas de PostgreSQL dun programme rsident en mmoire appel postmaster ; dune partie client (psql) devant tre installe sur toutes les machines ncessitant daccder au serveur de base de donnes (un client peut ventuellement fonctionner sur le serveur lui-mme). Les clients (les machines sur lesquelles le client PostgreSQL est install) peuvent interroger le serveur de bases de donnes laide de requtes SQL.

68

CHAPITRE 4. LANGAGE SQL

4.2
4.2.1

Dnir une base Langage de dnition de donnes (LDD)


Introduction aux contraintes dintgrit

Soit le schma relationnel minimaliste suivant : Acteur(Num-Act, Nom, Prnom) Jouer(Num-Act, Num-Film) Film(Num-Film, Titre, Anne) Contrainte dintgrit de domaine Toute comparaison dattributs nest accepte que si ces attributs sont dnis sur le mme domaine. Le SGBD doit donc constamment sassurer de la validit des valeurs dun attribut. Cest pourquoi la commande de cration de table doit prciser, en plus du nom, le type de chaque colonne. Par exemple, pour la table Film, on prcisera que le Titre est une chane de caractres et lAnne une date. Lors de linsertion de n-uplets dans cette table, le systme sassurera que les dirents champs du n-uplet satisfont les contraintes dintgrit de domaine des attributs prcises lors de la cration de la base. Si les contraintes ne sont pas satisfaites, le n-uplet nest, tout simplement, pas insr dans la table. Contrainte dintgrit de relation (ou dentit) Lors de linsertion de n-uplets dans une table (i.e. une relation), il arrive quun attribut soit inconnu ou non dni. On introduit alors une valeur conventionnelle note NULL et appele valeur nulle. Cependant, une cl primaire ne peut avoir une valeur nulle. De la mme manire, une cl primaire doit toujours tre unique dans une table. Cette contrainte forte qui porte sur la cl primaire est appele contrainte dintgrit de relation. Tout SGBD relationnel doit vrier lunicit et le caractre dni (NOT NULL) des valeurs de la cl primaire. Contrainte dintgrit de rfrence Dans tout schma relationnel, il existe deux types de relation : les relations qui reprsentent des entits de lunivers modlis ; elles sont qualies de statiques, ou dindpendantes ; les relations Acteur et Film en sont des exemples ; les relations dont lexistence des n-uplets dpend des valeurs dattributs situes dans dautres relations ; il sagit de relations dynamiques ou dpendantes ; la relation Jouer en est un exemple. Lors de linsertion dun n-uplet dans la relation Jouer, le SGBD doit vrier que les valeurs Num-Act et Num-Film correspondent bien, respectivement, une valeur de Num-Act existant dans la relation Acteur et une valeur Num-Film existant dans la relation Film. Lors de la suppression dun n-uplet dans la relation Acteur, le SGBD doit vrier quaucun n-uplet de la relation Jouer ne fait rfrence, par lintermdiaire de lattribut Num-Act, au n-uplet que lon cherche supprimer. Le cas chant, cest--dire si une, ou plusieurs, valeur correspondante de Num-Act existe dans Jouer, quatre possibilits sont envisageables : interdire la suppression ; supprimer galement les n-uplets concerns dans Jouer ; avertir lutilisateur dune incohrence ; mettre les valeurs des attributs concerns une valeur nulle dans la table Jouer, si lopration est possible (ce qui nest pas le cas si ces valeurs interviennent dans une cl primaire) ;

4.2.2

Crer une table : CREATE TABLE

Introduction Une table est un ensemble de lignes et de colonnes. La cration consiste dnir (en fonction de lanalyse) le nom de ces colonnes, leur format (type), la valeur par dfaut la cration de la ligne (DEFAULT) et les rgles de gestion sappliquant la colonne (CONSTRAINT).

4.2. DFINIR UNE BASE LANGAGE DE DFINITION DE DONNES (LDD)

69

Cration simple La commande de cration de table la plus simple ne comportera que le nom et le type de chaque colonne de la table. A la cration, la table sera vide, mais un certain espace lui sera allou. La syntaxe est la suivante : CREATE TABLE nom_table (nom_col1 TYPE1, nom_col2 TYPE2, ...) Quand on cre une table, il faut dnir les contraintes dintgrit que devront respecter les donnes que lon mettra dans la table (cf. section 4.2.3). Les types de donnes Les types de donnes peuvent tre : INTEGER : Ce type permet de stocker des entiers signs cods sur 4 octets. BIGINT : Ce type permet de stocker des entiers signs cods sur 8 octets. REAL : Ce type permet de stocker des rels comportant 6 chires signicatifs cods sur 4 octets. DOUBLE PRECISION : Ce type permet de stocker des rels comportant 15 chires signicatifs cods sur 8 octets. NUMERIC[(prcision, [longueur])] : Ce type de donnes permet de stocker des donnes numriques la fois entires et relles avec une prcision de 1000 chires signicatifs. longueur prcise le nombre maximum de chires signicatifs stocks et prcision donne le nombre maximum de chires aprs la virgule. CHAR(longueur) : Ce type de donnes permet de stocker des chanes de caractres de longueur xe. longueur doit tre infrieur 255, sa valeur par dfaut est 1. VARCHAR(longueur) : Ce type de donnes permet de stocker des chanes de caractres de longueur variable. longueur doit tre infrieur 2000, il ny a pas de valeur par dfaut. DATE : Ce type de donnes permet de stocker des donnes constitues dune date. TIMESTAMP : Ce type de donnes permet de stocker des donnes constitues dune date et dune heure. BOOLEAN : Ce type de donnes permet de stocker des valeurs Boolenne. MONEY : Ce type de donnes permet de stocker des valeurs montaires. TEXT : Ce type de donnes permet des stocker des chanes de caractres de longueur variable. Cration avec Insertion de donnes On peut insrer des donnes dans une table lors de sa cration par la commande suivante : CREATE TABLE nom_table [(nom_col1, nom_col2, ...)] AS SELECT ... On peut ainsi, en un seul ordre SQL crer une table et la remplir avec des donnes provenant du rsultat dun SELECT (cf. section 4.5 et 4.7). Si les types des colonnes ne sont pas spcis, ils correspondront ceux du SELECT. Il en va de mme pour les noms des colonnes. Le SELECT peut contenir des fonctions de groupes mais pas dORDER BY (cf. section 4.7.2 et 4.5.6) car les lignes dune table ne peuvent pas tre classes.

4.2.3

Contraintes dintgrit

Syntaxe A la cration dune table, les contraintes dintgrit se dclarent de la faon suivante :

70

CHAPITRE 4. LANGAGE SQL

CREATE TABLE nom_table ( nom_col_1 type_1 [CONSTRAINT nom_1_1] contrainte_de_colonne_1_1 [CONSTRAINT nom_1_2] contrainte_de_colonne_1_2 ... ... [CONSTRAINT nom_1_m] contrainte_de_colonne_2_m, nom_col_2 type_2 [CONSTRAINT nom_2_1] contrainte_de_colonne_2_1 [CONSTRAINT nom_2_2] contrainte_de_colonne_2_2 ... ... [CONSTRAINT nom_2_m] contrainte_de_colonne_2_m, ... nom_col_n type_n [CONSTRAINT nom_n_1] contrainte_de_colonne_n_1 [CONSTRAINT nom_n_2] contrainte_de_colonne_n_2 ... ... [CONSTRAINT nom_n_m] contrainte_de_colonne_n_m, [CONSTRAINT nom_1] contrainte_de_table_1, [CONSTRAINT nom_2] contrainte_de_table_2, ... ... [CONSTRAINT nom_p] contrainte_de_table_p ) Contraintes de colonne Les direntes contraintes de colonne que lon peut dclarer sont les suivantes : NOT NULL ou NULL : Interdit (NOT NULL) ou autorise (NULL) linsertion de valeur NULL pour cet attribut. UNIQUE : Dsigne lattribut comme cl secondaire de la table. Deux n-uplets ne peuvent recevoir des valeurs identiques pour cet attribut, mais linsertion de valeur NULL est toutefois autorise. Cette contrainte peut apparatre plusieurs fois dans linstruction. PRIMARY KEY : Dsigne lattribut comme cl primaire de la table. La cl primaire tant unique, cette contrainte ne peut apparatre quune seule fois dans linstruction. La dnition dune cl primaire compose se fait par lintermdiaire dune contrainte de table. En fait, la contrainte PRIMARY KEY est totalement quivalente la contraite UNIQUE NOT NULL. REFERENCES table [(colonne)] [ON DELETE CASCADE] : Contrainte dintgrit rfrentielle pour lattribut de la table en cours de dnition. Les valeurs prises par cet attribut doivent exister dans lattribut colonne qui possde une contrainte PRIMARY KEY ou UNIQUE dans la table table. En labsence de prcision dattribut colonne, lattribut retenu est celui correspondant la cl primaire de la table table spcie. CHECK (condition) : Vrie lors de linsertion de n-uplets que lattribut ralise la condition condition. DEFAULT valeur : Permet de spcier la valeur par dfaut de lattribut. Contraintes de table Les direntes contraintes de table que lon peut dclarer sont les suivantes : PRIMARY KEY (colonne, ...) : Dsigne la concatnation des attributs cits comme cl primaire de la table. Cette contrainte ne peut apparatre quune seule fois dans linstruction. UNIQUE (colonne, ...) : Dsigne la concatnation des attributs cits comme cl secondaire de la table. Dans ce cas, au moins une des colonnes participant cette cl secondaire doit permettre de distinguer le n-uplet. Cette contrainte peut apparatre plusieurs fois dans linstruction. FOREIGN KEY (colonne, ...) REFERENCES table [(colonne, ...)] [ON DELETE CASCADE | SET NULL] : Contrainte dintgrit rfrentielle pour un ensemble dattributs de la table en cours de dnition. Les valeurs prises par ces attributs doivent exister dans lensemble dattributs spci et possder une contrainte PRIMARY KEY ou UNIQUE dans la table table.

4.3. MODIFIER UNE BASE LANGAGE DE MANIPULATION DE DONNES (LMD)

71

CHECK (condition) : Cette contrainte permet dexprimer une condition qui doit exister entre plusieurs attributs de la ligne. Les contraintes de tables portent sur plusieurs attributs de la table sur laquelle elles sont dnies. Il nest pas possible de dnir une contrainte dintgrit utilisant des attributs provenant de deux ou plusieurs tables. Ce type de contrainte sera mis en uvre par lintermdiaire de dclencheurs de base de donnes (trigger, cf. section ??). Complment sur les contraintes ON DELETE CASCADE : Demande la suppression des n-uplets dpendants, dans la table en cours de dnition, quand le n-uplet contenant la cl primaire rfrence est supprim dans la table matre. ON DELETE SET NULL : Demande la mise NULL des attributs constituant la cl trangre qui font rfrence au n-uplet supprim dans la table matre. La suppression dun n-uplet dans la table matre pourra tre impossible sil existe des n-uplets dans dautres tables rfrenant cette valeur de cl primaire et ne spciant pas lune de ces deux options.

4.2.4

Supprimer une table : DROP TABLE

Supprimer une table revient liminer sa structure et toutes les donnes quelle contient. Les index associs sont galement supprims. La syntaxe est la suivante : DROP TABLE nom_table

4.2.5

Modier une table : ALTER TABLE

Ajout ou modication de colonnes ALTER TABLE nom_table {ADD/MODIFY} ([nom_colonne type [contrainte], ...]) Ajout dune contrainte de table ALTER TABLE nom_table ADD [CONSTRAINT nom_contrainte] contrainte La syntaxe de dclaration de contrainte est identique celle vue lors de la cration de table. Si des donnes sont dj prsentes dans la table au moment o la contrainte dintgrit est ajoute, toutes les lignes doivent vrier la contrainte. Dans le cas contraire, la contrainte nest pas pose sur la table. Renommer une colonne ALTER TABLE nom_table RENAME COLUMN ancien_nom TO nouveau_nom Renommer une table ALTER TABLE nom_table RENAME TO nouveau_nom

4.3
4.3.1

Modier une base Langage de manipulation de donnes (LMD)


Insertion de n-uplets : INSERT INTO

La commande INSERT permet dinsrer une ligne dans une table en spciant les valeurs insrer. La syntaxe est la suivante :

72

CHAPITRE 4. LANGAGE SQL

INSERT INTO nom_table(nom_col_1, nom_col_2, ...) VALUES (val_1, val_2, ...) La liste des noms de colonne est optionnelle. Si elle est omise, la liste des colonnes sera par dfaut la liste de lensemble des colonnes de la table dans lordre de la cration de la table. Si une liste de colonnes est spcie, les colonnes ne gurant pas dans la liste auront la valeur NULL. Il est possible dinsrer dans une table des lignes provenant dune autre table. La syntaxe est la suivante : INSERT INTO nom_table(nom_col1, nom_col2, ...) SELECT ... Le SELECT (cf. section 4.5 et 4.7) peut contenir nimporte quelle clause sauf un ORDER BY (cf. section 4.5.6).

4.3.2

Modication de n-uplets : UPDATE

La commande UPDATE permet de modier les valeurs dune ou plusieurs colonnes, dans une ou plusieurs lignes existantes dune table. La syntaxe est la suivante : UPDATE nom_table SET nom_col_1 = {expression_1 | ( SELECT ...) }, nom_col_2 = {expression_2 | ( SELECT ...) }, ... nom_col_n = {expression_n | ( SELECT ...) } WHERE predicat Les valeurs des colonnes nom_col_1, nom_col_2, ..., nom_col_n sont modies dans toutes les lignes qui satisfont le prdicat predicat. En labsence dune clause WHERE, toutes les lignes sont mises jour. Les expressions expression_1, expression_2, ..., expression_n peuvent faire rfrence aux anciennes valeurs de la ligne.

4.3.3

Suppression de n-uplets : DELETE

La commande DELETE permet de supprimer des lignes dune table. La syntaxe est la suivante : DELETE FROM nom_table WHERE predicat Toutes les lignes pour lesquelles predicat est valu vrai sont supprimes. En labsence de clause WHERE, toutes les lignes de la table sont supprimes.

4.4. TRAVAUX PRATIQUES SQL : PREMIRE BASE DE DONNES {S6}

73

4.4
4.4.1

Travaux Pratiques PostgreSQL : Premire base de donnes


Informations pratiques concernant PostgreSQL

Initialisation et dmarrage de PostgreSQL Linitialisation de PostgreSQL consiste crer un cluster de bases de donnes de la manire suivante : /rpertoire_des_binaires/initdb -D /rpertoire_choisi_pour_la_base Il faut ensuite lancer le serveur PostgreSQL : /rpertoire_des_binaires/postmaster -D /rpertoire_choisi_pour_la_base Une meilleure solution consiste lancer le serveur PostgreSQL en tche de fond et diriger son ux de sortie vers un chier (logfile) : /rpertoire_des_binaires/postmaster -D /rpertoire_choisi_pour_la_base > logfile 2>&1 &

La cration proprement dite dune base de donnes dans le cluster se fait de la manire suivante : createdb nom_de_la_nouvelle_base Nous pouvons enn utiliser linterface en ligne de commande de PostgreSQL en dmarrant un client : psql nom_de_la_nouvelle_base Remarque concernant SELinux Attention, il y a des incompatibilits entre PostgreSQL et SELinux. Si vous rencontrez des problmes, essayez de dsactiver temporairement SELinux (setenforce 0). Cette solution nest pas la meilleure. Si elle marche, essayez de corriger le problme plus nement et de manire dnitive. Par exemple, sous une installation standard de Fedora Core 3, pour corriger le problme, procdez de la manire suivante : Cliquer sur : Menu principal > Paramtres de systme > Niveau de scurit ; Cliquer sur longlet SELinux puis dvelopper SELinux Service Protection et cocher la case Disable SELinux protection for postgresql daemon et valider. PostgreSQL lIUT lIUT, un seul cluster de base de donnes est cr et disponible pour tous les utilisateurs de PostgreSQL. Une seule base de donnes est aecte chaque utilisateur ; son nom tant lidentiant de lutilisateur (i.e. nom de login). Pour crer la base de donnes, il faut : ouvrir internet Galeon, puis cliquer sur Etat de votre base de donnes PostgreSQL et enn sur Crer la base de donnes . Le dmarrage du client se fait de la manire suivante : psql -h nom_serveur -p num_port ma_base identifiant En salle de TP, nom_serveur est aquanux ; les champs num_port, ma_base et identifiant sont optionnels et inutiles, pour information : num_port : 5432 ; ma_base : votre identiant ; identifiant : votre identiant. criture des commandes sous PostgreSQL Toutes les lignes de commandes SQL doivent se terminer par un ; ! Ce nest, par contre, pas le cas des mta-commandes dont il est question ci-dessous.

74

CHAPITRE 4. LANGAGE SQL

Mta-commandes sous PostgreSQL Mta-commandes \? \h \h nom_commande \df \cd nom_repertoire \! nom_commande \i nom_fichier \d \d nom_table \copy nom_table from nom_fichier Description Acher toutes les mta-commandes Acher toutes les commandes SQL Aide concernant une commande SQL particulire Acher toutes les fonctions postgresql Changer de rpertoire courant Excuter une commande shell Lire et excuter un script SQL Acher la liste des tables cres Information concernant une table cre Remplissage dune table partir dun chier texte

4.4.2

Premire base de donnes

1. Crez votre base de donnes en utilisant internet Galeon. 2. Dmarrez un client (psql -h aquanux) pour vous connecter PostgreSQL. 3. Tapez \ ? pour acher la liste des mta-commandes. 4. Tapez \h CREATE TABLE pour connatre la syntaxe de la commande SQL de cration de table. 5. Crez les tables du schma relationnel vu en travaux dirigs section 3.5. Schma relationnel : film (num_film, num_realisateur, titre, genre, annee) cinema (num_cinema, nom, adresse) individu (num_individu, nom prnom) jouer (num_acteur, num_film, role) projection (num_cinema, num_film, jour) Noubliez surtout pas : de choisir correctement le domaine de dnition (i.e. le type) de chacun des attributs ; de bien prciser la cl primaire de chaque relation ; les contraintes dintgrit rfrentielles (i.e. les clefs trangres). 6. Achez la liste des tables cres (\d). 7. Remplissez la main , cest--dire en utilisant la commande INSERT INTO, la table cinema en utilisant le tableau 3.16. 8. Remplissez les tables jouer, film, projection et individu laide des chiers fournis (jouer.txt, film.txt, projection.txt et individu.txt) en utilisant la mta-commande adquate (\copy nom_table from nom_fichier). Devez-vous respecter un ordre de remplissage des tables ? Pourquoi ? 9. Crez un chier cinema.txt permettant de remplir la table cinema en respectant le format des chiers qui vous ont t fournis. 10. Crez un script SQL (GenBDCine.sql) permettant de rgnrer votre base de donnes. Ce chier, compos de trois parties, doit permettre de : (a) eacer chacune des tables ; (b) crer chacune des tables comme dans lexercice 5 ; (c) remplir chacune des tables. 11. Restaurez votre base de donnes en utilisant le chier GenBDCine.sql. 12. Vous voulez eacer lacteur John Travolta de la base. Quelles oprations sont ncessaires pour mener bien cet suppression ? Ralisez cette suppression.

4.4. TRAVAUX PRATIQUES SQL : PREMIRE BASE DE DONNES {S6}

75

Remarque Pour acher lensemble des n-uplets dune table, vous pouvez utiliser la commande SQL : SELECT * FROM nom_table.

76

CHAPITRE 4. LANGAGE SQL

4.5
4.5.1

Interroger une base Langage de manipulation de donnes (LMD) : SELECT (1re partie)
Introduction la commande SELECT

Introduction La commande SELECT constitue, elle seule, le langage permettant dinterroger une base de donnes. Elle permet de : slectionner certaines colonnes dune table (projection) ; slectionner certaines lignes dune table en fonction de leur contenu (slection) ; combiner des informations venant de plusieurs tables (jointure, union, intersection, dirence et division) ; combiner entre elles ces direntes oprations. Une requte (i.e. une interrogation) est une combinaison doprations portant sur des tables (relations) et dont le rsultat est lui-mme une table dont lexistence est phmre (le temps de la requte). Syntaxe simplie de la commande SELECT Une requte se prsente gnralement sous la forme : SELECT [ ALL | DISTINCT ] { * | attribut [, ...] } FROM nom_table [, ...] [ WHERE condition ] la clause SELECT permet de spcier les attributs que lon dsire voir apparatre dans le rsultat de la requte ; le caractre toile (*) rcupre tous les attributs de la table gnre par la clause FROM de la requte ; la clause FROM spcie les tables sur lesquelles porte la requte ; la clause WHERE, qui est facultative, nonce une condition que doivent respecter les n-uplets slectionns. Par exemple, pour acher lensemble des n-uplets de la table film, vous pouvez utiliser la requte : SELECT * FROM film De manire synthtique, on peut dire que la clause SELECT permet de raliser la projection, la clause FROM le produit cartsien et la clause WHERE la slection (cf. section 4.5.2). Dlimiteurs : apostrophes simples et doubles Pour spcier littralement une chane de caractres, il faut lentourer dapostrophes (i.e. guillemets simples). Par exemple, pour slectionner les lms policiers, on utilise la requte : SELECT * FROM film WHERE genre=Policier Les date doivent galement tre entoure dapostrophes (ex : 01/01/2005). Comme lapostrophe est utilise pour dlimiter les chanes de caractres, pour la reprsenter dans une chane, il faut la ddoubler (exemple : larbre), ou la faire prcder dun antislash (exemple : l\arbre). Lorsque le nom dun lment dune base de donnes (un nom de table ou de colonne par exemple) est identique un mot clef du SQL, il convient de lentourer dapostrophes doubles. Par exemple, si la table achat possde un attribut date, on pourra crire : SELECT date FROM achat Bien entendu, les mots rservs du SQL sont dconseills pour nommer de tels objets. Les apostrophes doubles sont galement ncessaires lorsque le nom (dune colonne ou dune table) est compos de caractres particuliers tels que les blancs ou autres, ce qui est videmment dconseill.

4.5. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (1re PARTIE) {S7}77

4.5.2

Traduction des oprateurs de projection, slection, produit cartsien et quijointure de lalgbre relationnelle (1re partie)

Traduction de loprateur de projection Loprateur de projection (A1 , ...An ) (relation) se traduit tout simplement en SQL par la requte : SELECT DISTINCT A_1, ..., A_n FROM relation DISTINCT permet de ne retenir quune occurrence de n-uplet dans le cas o une requte produit plusieurs n-uplets identiques (cf. section 4.5.4). Traduction de loprateur de slection Loprateur de slection (prdicat) (relation) se traduit tout simplement en SQL par la requte : e SELECT * FROM relation WHERE prdicat De manire simplie, un prdicat est une expression logique sur des comparaisons. Reportez-vous la section 4.5.7 pour une description plus complte. Traduction de loprateur de produit cartsien Loprateur de produit cartsien relation1 relation2 se traduit en SQL par la requte : SELECT * FROM relation_1, relation_2 Nous reviendrons sur le produit cartsien dans les sections 4.5.5 et 4.7.1. Traduction de loprateur dqui-jointure Loprateur dqui-jointure relation1 A1 ,A2 relation2 se traduit en SQL par la requte : SELECT * FROM relation_1, relation_2 WHERE relation_1.A_1 = relation_2.A_2 Nous reviendrons sur les dirents types de jointure dans la section 4.7.1.

4.5.3

Syntaxe gnrale de la commande SELECT

Voici la syntaxe gnrale dune commande SELECT : SELECT [ ALL | DISTINCT ] { * | expression [ AS nom_affich ] } [, ...] FROM nom_table [ [ AS ] alias ] [, ...] [ WHERE prdicat ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ {UNION | INTERSECT | EXCEPT [ALL]} requte ] [ ORDER BY expression [ ASC | DESC ] [, ...] ] En fait lordre SQL SELECT est compos de 7 clauses dont 5 sont optionnelles : SELECT : Cette clause permet de spcier les attributs que lon dsire voir apparatre dans le rsultat de la requte (cf. section 4.5.4). FROM : Cette clause spcie les tables sur lesquelles porte la requte (cf. section 4.5.5 et 4.7.1). WHERE : Cette clause permet de ltrer les n-uplets en imposant une condition remplir pour quils soient prsents dans le rsultat de la requte (cf. section 4.5.7). GROUP BY : Cette clause permet de dnir des groupes (i.e. sous-ensemble ; cf. section 4.7.2). HAVING : Cette clause permet de spcier un ltre (condition de regroupement des n-uplets) portant sur les rsultats (cf. section 4.7.2). UNION, INTERSECT et EXCEPT : Cette clause permet deectuer des oprations ensemblistes entre plusieurs rsultats de requte (i.e. entre plusieurs SELECT) (cf. section 4.7.3). ORDER BY : Cette clause permet de trier les n-uplets du rsultat (cf. section 4.5.6).

78

CHAPITRE 4. LANGAGE SQL

4.5.4

La clause SELECT

Introduction Comme nous lavons dj dit, la clause SELECT permet de spcier les attributs que lon dsire voir apparatre dans le rsultat de la requte. Pour prciser explicitement les attributs que lon dsire conserver, il faut les lister en les sparant par une virgule. Cela revient en fait oprer une projection de la table intermdiaire gnre par le reste de la requte. Nous verrons dans cette section que la clause SELECT permet daller plus loin que la simple opration de projection. En eet, cette clause permet galement de renommer des colonnes, voire den crer de nouvelles partir des colonnes existantes. Pour illustrer par des exemples les sections qui suivent, nous utiliserons une table dont le schma est le suivant : employee(id_employee, surname, name, salary) Cette table contient respectivement lidentiant, le nom, le prnom et le salaire mensuel des employs dune compagnie. Loprateur toile (*) Le caractre toile (*) permet de rcuprer automatiquement tous les attributs de la table gnre par la clause FROM de la requte. Pour acher la table employee on peut utiliser la requte : SELECT * FROM employee Les oprateurs DISTINCT et ALL Lorsque le SGBD construit la rponse dune requte, il rapatrie toutes les lignes qui satisfont la requte, gnralement dans lordre ou il les trouve, mme si ces dernires sont en double (comportement ALL par dfaut). Cest pourquoi il est souvent ncessaire dutiliser le mot clef DISTINCT qui permet dliminer les doublons dans la rponse. Par exemple, pour acher la liste des prnoms, sans doublon, des employs de la compagnie, il faut utiliser la requte : SELECT DISTINCT name FROM employee Les oprations mathmatiques de base Il est possible dutiliser les oprateurs mathmatiques de base (i.e. +, -, * et /) pour gnrer de nouvelles colonnes partir, en gnrale, dune ou plusieurs colonnes existantes. Pour acher le nom, le prnom et le salaire annuel des employs, on peut utiliser la requte : SELECT surname, name, salary*12 FROM employee Loprateur AS Le mot clef AS permet de renommer une colonne, ou de nommer une colonne cre dans la requte. Pour acher le nom, le prnom et le salaire annuel des employs, on peut utiliser la requte : SELECT surname AS nom, name AS prnom, salary*12 AS salaire FROM employee Loprateur de concatnation Loprateur || (double barre verticale) permet de concatner des champs de type caractres. Pour acher le nom et le prnom sur une colonne, puis le salaire annuel des employs, on peut utiliser la requte : SELECT surname || || name AS nom, salary*12 AS salaire FROM employee

4.5. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (1re PARTIE) {S7}79

4.5.5

La clause FROM (1re partie)

Comportement Comme nous lavons dj dit, la clause FROM spcie les tables sur lesquelles porte la requte. Plus exactement, cette clause construit la table intermdiaire (i.e. virtuelle), partir dune ou de plusieurs tables, sur laquelle des modications seront apportes par les clauses WHERE, GROUP BY et HAVING pour gnrer la table nale rsultat de la requte. Quand plusieurs tables, spares par des virgules, sont numres dans la clause FROM, la table intermdiaire est le rsultat du produit cartsien de toutes les tables numres. Loprateur AS Le mot clef AS permet de renommer une table, ou de nommer une table cre dans la requte (cest dire une sous-requte) an de pouvoir ensuite y faire rfrence. Le renommage du nom dune table se fait de lune des deux manires suivantes : FROM nom_de_table AS nouveau_nom FROM nom_de_table nouveau_nom Une application typique du renommage de table est de simplier les noms trop long : SELECT * FROM nom_de_table_1 AS t1, nom_de_table_1 AS t2 WHERE t1.A_1 = t2.A_2 Attention, le nouveau nom remplace compltement lancien nom de la table dans la requte. Ainsi, quand une table a t renomme, il nest plus possible dy faire rfrence en utilisant son ancien nom. La requte suivante nest donc pas valide : SELECT * FROM nom_table AS t WHERE nom_table.a > 5 Sous-requte Les tables mentionnes dans la clause FROM peuvent trs bien correspondre des tables rsultant dune requte, spcie entre parenthses, plutt qu des tables existantes dans la base de donnes. Il faut toujours nommer les tables correspondant des sous-requtes en utilisant loprateur AS. Par exemple, les deux requtes suivantes sont quivalentes : SELECT * FROM table_1, table_2 SELECT * FROM (SELECT * FROM table_1) AS t1, table_2 Les jointures Nous traiterons cet aspect de la clause FROM dans la section 4.7.1.

4.5.6

La clause ORDER BY

Comme nous lavons dj dit, la clause ORDER BY permet de trier les n-uplets du rsultat et sa syntaxe est la suivante : ORDER BY expression [ ASC | DESC ] [, ...] expression dsigne soit une colonne, soit une opration mathmatique de base (nous avons abord ce type doprations dans la section 4.5.4 sur La clause SELECT ) sur les colonnes. ASC spcie lordre ascendant et DESC lordre descendant du tri. En labsence de prcision ASC ou DESC, cest lordre ascendant qui est utilis par dfaut. Quand plusieurs expressions, ou colonnes sont mentionnes, le tri se fait dabord selon les premires, puis suivant les suivantes pour les n-uplet qui sont gaux selon les premires. Le tri est un tri interne sur le rsultat nal de la requte, il ne faut donc placer dans cette clause que les noms des colonnes mentionns dans la clause SELECT.

80

CHAPITRE 4. LANGAGE SQL

La clause ORDER BY permet de trier le rsultat nal de la requte, elle est donc la dernire clause de tout ordre SQL et ne doit gurer quune seule fois dans le SELECT, mme sil existe des requtes imbriques ou un jeu de requtes ensemblistes (cf. section 4.7.3). En labsence de clause ORDER BY, lordre des n-uplet est alatoire et non garanti. Souvent, le fait de placer le mot clef DISTINCT sut tablir un tri puisque le SGBD doit se livrer une comparaison des lignes, mais ce mcanisme nest pas garanti car ce tri seectue dans un ordre non contrlable qui peut varier dun serveur lautre.

4.5.7

La clause WHERE

Comportement Comme nous lavons dj dit, la clause WHERE permet de ltrer les n-uplets en imposant une condition remplir pour quils soient prsents dans le rsultat de la requte ; sa syntaxe est la suivante : WHERE prdicat Concrtement, aprs que la table intermdiaire (i.e. virtuelle) de la clause FROM a t construite, chaque ligne de la table est confronte au prdicat prdicat an de vrier si la ligne satisfait (i.e. le prdicat est vrai pour cette ligne) ou ne satisfait pas (i.e. le prdicat est faux ou NULL pour cette ligne) le prdicat. Les lignes qui ne satisfont pas le prdicat sont supprimes de la table intermdiaire. Le prdicat nest rien dautre quune expression logique. En principe, celle-ci fait intervenir une ou plusieurs lignes de la table gnre par la clause FROM, cela nest pas impratif mais, dans le cas contraire, lutilit de la clause WHERE serait nulle. Expression simple Une expression simple peut tre une variable dsigne par un nom de colonne ou une constante. Si la variable dsigne un nom de colonne, la valeur de la variable sera la valeur situe dans la table lintersection de la colonne et de la ligne dont le SGBD cherche vrier si elle satisfait le prdicat de la clause WHERE. Les expressions simples peuvent tre de trois types : numrique, chane de caractres ou date. Une expression simple peut galement tre le rsultat dune sous-requte, spcie entre parenthses, qui retourne une table ne contenant quune seule ligne et quune seule colonne (i.e. une sous-requte retournant une valeur unique). Prdicat simple Un prdicat simple peut tre le rsultat de la comparaison de deux expressions simples au moyen de lun des oprateurs suivants : = != < <= > >= gal dirent strictement infrieur infrieur ou gal strictement suprieur suprieur ou gal

Dans ce cas, les trois types dexpressions (numrique, chane de caractres et date) peuvent tre compars. Pour les types date, la relation dordre est lordre chronologique. Pour les caractres, la relation dordre est lordre lexicographique. Un prdicat simple peut galement correspondre un test de description dune chane de caractres par une expression rgulire : ~ ~* !~ !~* dcrit par lexpression rgulire comme LIKE mais sans tenir compte de la casse non dcrit par lexpression rgulire comme NOT LIKE mais sans tenir compte de la casse

4.5. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (1re PARTIE) {S7}81

Dans ce cas, la chane de caractres faisant lobjet du test est gauche et correspond une expression simple du type chane de caractres, il sagit gnralement dun nom de colonne. Lexpression rgulire, qui scrit entre apostrophe simple, comme une chane de caractres, est situe droite de loprateur. La section 4.5.8 donne une description dtaille du formalisme des expressions rgulires. Un prdicat simple peut enn correspondre lun des tests suivants : test sur lindtermination de expr comparaison de expr une liste de valeurs test dabsence dune liste de valeurs mme chose, mais la liste de valeurs est le rsultat dune sous-requte qui doit imprativement retourner une table ne contenant quune colonne EXIST (requte) vraie si la sous-requte retourne au moins un n-uplet vraie si au moins un n-uplet de la sous-requte vrie la expr operateur ANY (requte) comparaison expr oprateur n-uplet ; la sous-requte doit imprativement retourner une table ne contenant quune colonne ; IN est quivalent = ANY vraie si tous les n-uplets de la sous-requte vrient la expr operateur ALL (requte) comparaison expr oprateur n-uplet ; la sous-requte doit imprativement retourner une table ne contenant quune colonne expr IS NULL expr IN (expr_1 [, ...]) expr NOT IN (expr_1 [, ...]) expr IN (requte) expr NOT IN (requte) Dans ce tableau, expr dsigne une expression simple et requte une sous-requte. Prdicat compos Les prdicats simples peuvent tre combins au sein dexpression logiques en utilisant les oprateurs logiques AND (et logique), OR (ou logique) et NOT (ngation logique).

4.5.8

Les expressions rgulires

Introduction Le terme expression rgulire est issu de la thorie informatique et fait rfrence un ensemble de rgles permettant de dnir un ensemble de chanes de caractres. Une expression rgulire constitue donc une manire compacte de dnir un ensemble de chanes de caractres. Nous dirons quune chane de caractres est dcrite par une expression rgulire si cette chane est un lment de lensemble de chanes de caractres dni par lexpression rgulire. PostgreSQL dispose de trois oprateurs de description par une expression rgulire : 1. LIKE ou ~~ 2. ~ 3. SIMILAR TO La syntaxe et le pouvoir expressif des expressions rgulires dirent pour ces trois oprateurs. Nous ne dcrirons ici que la syntaxe du formalisme le plus standard et le plus puissant, celui que lon retrouve sous Unix avec les commandes egrep, sed et awk. Ce formalisme est celui associ loprateur ~. Avec PostgreSQL, le test dgalit avec une chane de caractres scrit : expression=chaine De manire quivalente, le test de description par une expression rgulire scrit : expression~expression_rgulire Loprateur de description ~ est sensible la casse, loprateur de description insensible la casse est ~*. Loprateur de non description sensible la casse est !~, son quivalent insensible la casse se note !~*.

82

CHAPITRE 4. LANGAGE SQL

Formalisme Comme nous allons le voir, dans une expression rgulire, certains symboles ont une signication spciale. Dans ce qui suit, expreg, expreg_1, expreg_2 dsignent des expressions rgulires, caractre un caractre quelconque et liste_de_caractres une liste de caractres quelconque. caractre : un caractre est une expression rgulire qui dsigne le caractre lui-mme, except pour les caractres ., ?, +, *, {, |, (, ), ^, $, \, [, ]. Ces derniers sont des mta-caractres et ont une signication spciale. Pour dsigner ces mta-caractres, il faut les faire prcder dun antislash (\., \?, \+, \*, \{, \|, \(, \), \^, \$, \\, \[, \]). [liste_de_caractres] : est une expression rgulire qui dcrit lun des caractres de la liste de caractres, par exemple [abcdf] dcrit le caractre a, le b, le c, le d ou le f ; le caractre - permet de dcrire des ensembles de caractres conscutifs, par exemple [a-df] est quivalent [abcdf] ; la plupart des mta-caractres perdent leur signication spciale dans une liste, pour insrer un ] dans une liste, il faut le mettre en tte de liste, pour inclure un ^, il faut le mettre nimporte o sauf en tte de liste, enn un - se place la n de la liste. [liste_de_caractres] : est une expression rgulire qui dcrit les caractres qui ne sont pas dans la liste de caractres. [ :alnum :] : lintrieur dune liste, dcrit un caractre alpha-numrique ([[:alnum:]] est quivalent [0-9A-Za-z]) ; sur le mme principe, on a galement [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:] et [:xdigit:]. . : est une expression rgulire et un mta-caractre qui dsigne nimporte quel caractre. : est une expression rgulire et un mta-caractre qui dsigne le dbut dune chane de caractres. $ : est une expression rgulire et un mta-caractre qui dsigne la n dune chane de caractres. expreg ? : est une expression rgulire qui dcrit zro ou une fois expreg. expreg* : est une expression rgulire qui dcrit expreg un nombre quelconque de fois, zro compris. expreg+ : est une expression rgulire qui dcrit expreg au moins une fois. expreg{n} : est une expression rgulire qui dcrit expreg n fois. expreg{n,} : est une expression rgulire qui dcrit expreg au moins n fois. expreg{n,m} : dcrit expreg au moins n fois et au plus m fois. expreg_1expreg_2 : est une expression rgulire qui dcrit une chane constitue de la concatnation de deux sous-chanes respectivement dcrites par expreg_1 et expreg_2. expreg_1|expreg_2 : est une expression rgulire qui dcrit toute chane dcrite par expreg_1 ou par expreg_2. (expreg) : est une expression rgulire qui dcrit ce que dcrit expreg. \n : o n est un chire, est une expression rgulire qui dcrit la sous-chane dcrite par la ne sousexpression parenthse de lexpression rgulire. Remarque : la concatnation de deux expressions rgulires (expreg_1expreg_2) est une opration prioritaire sur lunion (expreg_1|expreg_2). Exemples Un caractre, qui nest pas un mta-caractre, se dcrit lui-mme. Ce qui signie que si vous cherchez une chane qui contient voiture , vous devez utiliser lexpression rgulire voiture. Si vous ne cherchez que les motifs situs en dbut de ligne, utilisez le symbole ^. Pour chercher toutes les chanes qui commencent par voiture , utilisez ^voiture. Le signe $ (dollar) indique que vous souhaitez trouver les motifs en n de ligne. Ainsi : voiture$ permet de trouver toutes les chanes nissant par voiture . Le symbole . (point) remplace nimporte quel caractre. Pour trouver toutes les occurrences du motif compos des lettres vo, de trois lettres quelconques, et de la lettre e, utilisez : vo...e. Cette commande permet de trouver des chanes comme : voyagent, voyage, voyager, voyageur, vous e.

4.5. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (1re PARTIE) {S7}83

Vous pouvez aussi dnir un ensemble de lettres en les insrant entre crochets [ ]. Pour chercher toutes les chanes qui contiennent les lettres P ou p suivies de rince, utilisez :[Pp]rince. Si vous voulez spcier un intervalle de caractres, servez-vous dun trait dunion pour dlimiter le dbut et la n de lintervalle. Vous pouvez aussi dnir plusieurs intervalles simultanment. Par exemple [A-Za-z] dsigne toutes les lettres de lalphabet, hormis les caractres accentus, quelque soit la casse. Notez bien quun intervalle ne correspond qu un caractre dans le texte. Le symbole * est utilis pour dnir zro ou plusieurs occurrences du motif prcdent. Par exemple, lexpression rgulire ^Pa(pa)*$ dcrit les chanes : Pa, Papa, Papapa, Papapapapapapa, . . . Si vous souhaitez quun symbole soit interprt littralement, il faut le prxer par un \. Pour trouver toutes les lignes qui contiennent le symbole $, utilisez : \$

84

CHAPITRE 4. LANGAGE SQL

4.6

Travaux Pratiques PostgreSQL : Premires requtes

Dans les exercices de cette section, lobjectif est de trouver les requtes SQL permettant de rpondre aux problmes poss. Nous utilisons ici la base de donnes sur les lms (cf. sance de travaux pratiques 4.4).

4.6.1

Premires requtes

1. Quel est le contenu de la table individu ? 2. Quels sont les prnoms des individus en conservant les doublons ? 3. Quels sont les prnoms des individus en conservant les doublons, mais en les classant par ordre alphabtique ? 4. Quels sont les prnoms des individus sans doublons ? Observez le rsultat en eectuant un classement alphabtique et sans eectuer de classement. 5. Quels sont les individus dont le prnom est John ? 6. Quel est le nom des individus dont le prnom est John ? 7. Dressez la liste de toutes les associations possibles entre un individu et un lm (il ny a pas ncessairement de lien entre lindividu et le lm quon lui associe). Observez le nombre de lignes retournes. tait-il prvisible ? 8. Quels sont les individus qui sont des acteurs ? 9. Dressez la liste de toutes les associations possibles entre un acteur et un lm (il ny a pas ncessairement de lien entre lacteur et le lm quon lui associe). Observez le nombre de lignes retournes. 10. Dressez la liste de toutes les interprtations, en prcisant le rle, dacteur, dont on prcisera le nom et le prnom, ayant jou dans des lms dont on prcisera le titre. Le rsultat sera de la forme : prenom | nom | role | titre --------+----------+--------------+-------------Nicole | Kidman | Grace | Dogville Paul | Bettany | Tom Edison | Dogville 11. Mme question que la prcdente, mais en formattant le rsultat de la manire suivante : listing -----------------------------------------------------------------Nicole Kidman a jou le rle de Grace dans le film Dogville Paul Bettany a jou le rle de Tom Edison dans le film Dogville

4.6.2

Requtes dj rsolues en utilisant lalgbre relationnelle (cf. travaux dirigs section 3.5.2)

12. Quels sont les titres des lms dont le genre est Drame ? 13. Quels lms (titres) ont t projets en 2002 ? 14. Donnez le titre des lms raliss par Lars von Trier. 15. Quels lms sont projets au cinma Le Fontenelle ? 16. Quels sont les noms et prnoms des ralisateurs ? 17. Quels sont les noms et prnoms des acteurs ? 18. Quels sont les noms et prnoms des acteurs qui sont galement ralisateurs ? Remarque : vous ne pouvez utiliser le mot clef INTERSECT puisque nous ne lavons pas encore vu. 19. Quels acteurs a-t-on pu voir au cinma Le Fontenelle depuis lan 2000 ? 20. Quels sont les titres des lms o Nicole Kidman a jou un rle et qui ont t projets au cinma Le Fontenelle ?

4.6. TRAVAUX PRATIQUES SQL : PREMIRES REQUTES {S7}

85

4.6.3

Utilisation des expressions rgulires

21. Quels sont les prnoms des individus qui contiennent la lettre s ? 22. Mme question que la prcdente mais sans distinguer les lettres en fonction de la casse. 23. Quels sont les prnoms des individus dont le prnom commence par la lettre s sans tenir compte de la casse ? 24. Quels sont les prnoms des individus dont le prnom se termine par la lettre s sans tenir compte de la casse ? 25. Quels sont les prnoms des individus dont le prnom contient la lettre e sans commencer ou nir par cette lettre et sans tenir compte de la casse ? 26. Quels sont les prnoms des individus qui ne contiennent pas la lettre e ? 27. Quels sont les prnoms des individus qui contiennent les lettres a et l dans un ordre quelconque et sans tenir compte de la casse ? 28. Quels sont les noms des individus qui contiennent la chane an ou la chane on ? Rpondez en utilisant : (a) loprateur | des expressions rgulires ; (b) les listes de caractres des expressions rgulires ; (c) loprateur OR de la clause WHERE. 29. Quels sont les titres des lms qui contiennent au moins trois e ?

86

CHAPITRE 4. LANGAGE SQL

4.7

Interroger une base Langage de manipulation de donnes (LMD) : SELECT (2e partie)
La clause FROM (2e partie) : les jointures

4.7.1

Recommandation Dans la mesure du possible, et contrairement ce que nous avons fait jusqu prsent, il est prfrable dutiliser un oprateur de jointure normalis SQL2 (mot-clef JOIN) pour eectuer une jointure. En eet, les jointures faites dans la clause WHERE (ancienne syntaxe datant de 1986) ne permettent pas de faire la distinction, de prime abord, entre ce qui relve de la slection et ce qui relve de la jointure puisque tout est regroup dans une seule clause (la clause WHERE). La lisibilit des requtes est plus grande en utilisant la syntaxe de loprateur JOIN qui permet disoler les conditions de slections (clause WHERE) de celles de jointures (clauses JOIN), et qui permet galement de cloisonner les conditions de jointures entre chaque couples de table. De plus, loptimisation dexcution de la requte est souvent plus pointue lorsque lon utilise loprateur JOIN. Enn, lorsque lon utilise lancienne syntaxe, la suppression de la clause WHERE des ns de tests pose videmment des problmes.

Le produit cartsien Prenons une opration de jointure entre deux tables R1 et R2 selon une expression logique E. En algbre relationnelle, cette opration se note : R1 E R2 Dans la section 3.4.8, nous avons vu que la jointure nest rien dautre quun produit cartsien suivi dune slection : R1 E R2 = E (R1 R2 ) On peut galement dire que le produit cartsien nest rien dautre quune jointure dans laquelle lexpression logique E est toujours vraie : R1 R2 = R1 true R2 Nous avons vu section 4.5.5 que le produit cartsien entre deux tables table_1 et table_2 peut scrire en SQL : SELECT * FROM table_1, table_2 Il peut galement scrire en utilisant le mot-cl JOIN ddi aux jointures de la manire suivante : SELECT * FROM table_1 CROSS JOIN table_2 En fait, sous PostgreSQL, les quatre critures suivantes sont quivalentes : SELECT SELECT SELECT SELECT * * * * FROM FROM FROM FROM table_1, table_2 table_1 CROSS JOIN table_2 table_1 JOIN table_2 ON TRUE table_1 INNER JOIN table_2 ON TRUE

Les deux dernires critures prendront un sens dans les sections qui suivent.

4.7. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (2e PARTIE) {S8}87

Syntaxe gnrale des jointures Sans compter loprateur CROSS JOIN, voici les trois syntaxes possibles de lexpression dune jointure dans la clause FROM en SQL : table_1 { [INNER] { LEFT | RIGHT | FULL } [OUTER] } JOIN table_2 ON predicat [...] table_1 { [INNER] { LEFT | RIGHT | FULL } [OUTER] } JOIN table_2 USING (colonnes) [...] table_1 NATURAL { [INNER] { LEFT | RIGHT | FULL } [OUTER] } JOIN table_2 [...] Ces trois syntaxes dirent par la condition de jointure spcie par les clause ON ou USING, ou implicite dans le cas dune jointure naturelle introduite par le mot-cl NATURAL. ON : La clause ON correspond la condition de jointure la plus gnrale. Le prdicat predicat est une expression logique de la mme nature que celle de la clause WHERE dcrite dans la section 4.5.7. USING : La clause USING est une notation abrge correspondant un cas particulier de la clause ON. Les deux tables, sur lesquelles portent la jointure, doivent possder toutes les colonnes qui sont mentionnes, en les sparant par des virgules, dans la liste spcie entre parenthses juste aprs le mot-cl USING. La condition de jointure sera lgalit des colonnes au sein de chacune des paires de colonnes. De plus, les paires de colonnes seront fusionnes en une colonne unique dans la table rsultat de la jointure. Par rapport une jointure classique, la table rsultat comportera autant de colonnes de moins que de colonnes spcies dans la liste de la clause USING. NATURAL : Il sagit dune notation abrge de la clause USING dans laquelle la liste de colonnes est implicite et correspond la liste des colonnes communes aux deux tables participant la jointure. Tout comme dans le cas de la clause USING, les colonnes communes napparaissent quune fois dans la table rsultat. INNER et OUTER : Les mots-cl INNER et OUTER permettent de prciser sil sagit dune jointure interne ou externe. INNER et OUTER sont toujours optionnels. En eet, le comportement par dfaut est celui de la jointure interne (INNER) et les mots clefs LEFT, RIGHT et FULL impliquent forcment une jointure externe (OUTER). INNER JOIN : La table rsultat est constitue de toutes les juxtapositions possibles dune ligne de la table table_1 avec une ligne de la table table_2 qui satisfont la condition de jointure. LEFT OUTER JOIN : Dans un premier temps, une jointure interne (i.e. de type INNER JOIN) est eectue. Ensuite, chacune des lignes de la table table_1 qui ne satisfait pas la condition de jointure avec aucune des lignes de la table table_2 (i.e. les lignes de table_1 qui napparaissent pas dans la table rsultat de la jointure interne) est ajoute la table rsultats. Les attributs correspondant la table table_2, pour cette ligne, sont aects de la valeur NULL. Ainsi, la table rsultat contient au moins autant de lignes que la table table_1. RIGHT OUTER JOIN : Mme scnario que pour lopration de jointure de type LEFT OUTER JOIN, mais en inversant les rles des tables table_1 et table_2. FULL OUTER JOIN : La jointure externe bilatrale est la combinaison des deux oprations prcdentes (LEFT OUTER JOIN et RIGHT OUTER JOIN) an que la table rsultat contienne au moins une occurrence de chacune des lignes des deux tables impliques dans lopration de jointure. La jointure externe droite peut tre obtenue par une jointure externe gauche dans laquelle on inverse lordre des tables (et vice-versa). La jointure externe bilatrale peut tre obtenue par la combinaison de deux jointures externes unilatrales avec loprateur ensembliste UNION que nous verrons dans la section 4.7.3. Des jointures de nimporte quel type peuvent tre chanes les unes derrires les autres. Les jointures peuvent galement tre imbriques tant donn que les tables table_1 et table_2 peuvent trs bien tre elles-mmes le rsultat de jointures de nimporte quel type. Les oprations de jointures peuvent tre parenthses an de prciser lordre dans lequel elles sont eectues. En labsence de parenthses, les jointures seectuent de gauche droite.

88

CHAPITRE 4. LANGAGE SQL

Dnition de deux tables pour les exemples qui suivent An dillustrer les oprations de jointure, considrons les tables realisateur et film dnies de la manire suivante : create table realisateur ( id_real integer primary key, nom varchar(16), prenom varchar(16) ); create table film ( num_film integer primary key, id_real integer, titre varchar(32) ); On notera que dans la table film, lattribut id_real correspond une clef trangre et aurait d tre dni de la manire suivante : id_real integer references realisateur. Nous ne lavons pas fait dans le but dintroduire des lms dont le ralisateur nexiste pas dans la table realisateur an dillustrer les direntes facettes des oprations de jointure. La table realisateur contient les lignes suivantes : id_real | nom | prenom ---------+-----------+--------1 | von Trier | Lars 4 | Tarantino | Quentin 3 | Eastwood | Clint 2 | Parker | Alan La table film contient les lignes suivantes : id_film | id_real | titre ---------+---------+---------------------------1 | 1 | Dogville 2 | 1 | Breaking the waves 3 | 5 | Faux-Semblants 4 | 5 | Crash 5 | 3 | Chasseur blanc, coeur noir Exemples de jointures internes La jointure naturelle entre les tables film et ralisateur peut scrire indiremment de lune des manires suivante : SELECT SELECT SELECT SELECT * * * * FROM FROM FROM FROM film film film film NATURAL JOIN realisateur NATURAL INNER JOIN realisateur; JOIN realisateur USING (id_real); INNER JOIN realisateur USING (id_real);

pour produire le rsultat suivant : id_real | id_film | titre | nom | prenom ---------+---------+----------------------------+-----------+-------1 | 1 | Dogville | von Trier | Lars 1 | 2 | Breaking the waves | von Trier | Lars 3 | 5 | Chasseur blanc, coeur noir | Eastwood | Clint Nous aurions galement pu eectuer une qui-jointure en crivant :

4.7. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (2e PARTIE) {S8}89

SELECT * FROM film, realisateur WHERE film.id_real = realisateur.id_real; SELECT * FROM film JOIN realisateur ON film.id_real = realisateur.id_real; SELECT * FROM film INNER JOIN realisateur ON film.id_real = realisateur.id_real; Mais la colonne id_real aurait t duplique : id_film | id_real | titre | id_real | nom | prenom ---------+---------+----------------------------+---------+-----------+-------1 | 1 | Dogville | 1 | von Trier | Lars 2 | 1 | Breaking the waves | 1 | von Trier | Lars 5 | 3 | Chasseur blanc, coeur noir | 3 | Eastwood | Clint Exemples de jointures externes gauches La jointure externe gauche entre les tables film et ralisateur permet de conserver, dans la table rsultat, une trace des lms dont le ralisateur napparat pas dans la table realisateur. Une telle jointure peut scrire indiremment comme suit : SELECT SELECT SELECT SELECT * * * * FROM FROM FROM FROM film film film film NATURAL LEFT JOIN realisateur; NATURAL LEFT OUTER JOIN realisateur; LEFT JOIN realisateur USING (id_real); LEFT OUTER JOIN realisateur USING (id_real);

Elle produit le rsultat suivant : id_real | id_film | titre | nom | prenom ---------+---------+----------------------------+-----------+-------1 | 1 | Dogville | von Trier | Lars 1 | 2 | Breaking the waves | von Trier | Lars 5 | 3 | Faux-Semblants | | 5 | 4 | Crash | | 3 | 5 | Chasseur blanc, coeur noir | Eastwood | Clint Naturellement, en crivant : SELECT * FROM film LEFT JOIN realisateur ON film.id_real = realisateur.id_real; SELECT * FROM film LEFT OUTER JOIN realisateur ON film.id_real = realisateur.id_real; la colonne id_real serait duplique : id_film | id_real | titre | id_real | nom | prenom ---------+---------+----------------------------+---------+-----------+-------1 | 1 | Dogville | 1 | von Trier | Lars 2 | 1 | Breaking the waves | 1 | von Trier | Lars 3 | 5 | Faux-Semblants | | | 4 | 5 | Crash | | | 5 | 3 | Chasseur blanc, coeur noir | 3 | Eastwood | Clint Exemples de jointures externes droites La jointure externe droite entre les tables film et ralisateur permet de conserver, dans la table rsultat, une trace des ralisateurs dont aucun lm napparat dans la table film. Une telle jointure peut scrire indiremment comme suit : SELECT SELECT SELECT SELECT * * * * FROM FROM FROM FROM film film film film NATURAL RIGHT JOIN realisateur; NATURAL RIGHT OUTER JOIN realisateur; RIGHT JOIN realisateur USING (id_real); RIGHT OUTER JOIN realisateur USING (id_real);

90

CHAPITRE 4. LANGAGE SQL

Elle produit le rsultat suivant : id_real | id_film | titre | nom | prenom ---------+---------+----------------------------+-----------+--------1 | 1 | Dogville | von Trier | Lars 1 | 2 | Breaking the waves | von Trier | Lars 2 | | | Parker | Alan 3 | 5 | Chasseur blanc, coeur noir | Eastwood | Clint 4 | | | Tarantino | Quentin Exemples de jointures externes bilatrales La jointure externe bilatrale entre les tables film et ralisateur permet de conserver, dans la table rsultat, une trace de tous les ralisateurs et de tous les lms. Une telle jointure peut indiremment scrire : SELECT SELECT SELECT SELECT * * * * FROM FROM FROM FROM film film film film NATURAL FULL JOIN realisateur; NATURAL FULL OUTER JOIN realisateur; FULL JOIN realisateur USING (id_real); FULL OUTER JOIN realisateur USING (id_real);

Elle produit le rsultat suivant : id_real | id_film | titre | nom | prenom ---------+---------+----------------------------+-----------+--------1 | 1 | Dogville | von Trier | Lars 1 | 2 | Breaking the waves | von Trier | Lars 2 | | | Parker | Alan 3 | 5 | Chasseur blanc, coeur noir | Eastwood | Clint 4 | | | Tarantino | Quentin 5 | 3 | Faux-Semblants | | 5 | 4 | Crash | |

4.7.2

Les clauses GROUP BY et HAVING et les fonctions dagrgation

Syntaxe La syntaxe dune requte faisant ventuellement intervenir des fonctions dagrgation, une clause GROUP BY et une clause HAVING est la suivante : SELECT expression_1, [...,] expression_N [, fonction_agrgation [, ...] ] FROM nom_table [ [ AS ] alias ] [, ...] [ WHERE prdicat ] [ GROUP BY expression_1, [...,] expression_N ] [ HAVING condition_regroupement ] La clause GROUP BY La commande GROUP BY permet de dnir des regroupements (i.e. des agrgats) qui sont projets dans la table rsultat (un regroupement correspond une ligne) et deectuer des calculs statistiques, dnis par les expressions fonction_agrgation [, ...], pour chacun des regroupements. La liste dexpressions expression_1, [...,] expression_N correspond gnralement une liste de colonnes colonne_1, [...,] colonne_N. La liste de colonnes spcie derrire la commande SELECT doit tre identique la liste de colonnes de regroupement spcie derrire la commande GROUP BY. A la place des noms de colonne il est possible de spcier des oprations mathmatiques de base sur les colonnes (comme dnies dans la section 4.5.4). Dans ce cas, les regroupements doivent porter sur les mmes expressions.

4.7. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (2e PARTIE) {S8}91

Si les regroupements sont eectus selon une expression unique, les groupes sont dnis par les ensembles de lignes pour lesquelles cette expression prend la mme valeur. Si plusieurs expressions sont spcies (expression_1, expression_2, . . .) les groupes sont dnis de la faon suivante : parmi toutes les lignes pour lesquelles expression_1 prend la mme valeur, on regroupe celles ayant expression_2 identique, etc. Un SELECT avec une clause GROUP BY produit une table rsultat comportant une ligne pour chaque groupe. Les fonctions dagrgation AVG( [ DISTINCT | ALL ] expression ) : Calcule la moyenne des valeurs de lexpression expression. COUNT( * | [DISTINCT | ALL] expression ) : Dnombre le nombre de lignes du rsultat de la requte. Si expression est prsent, on ne compte que les lignes pour lesquelles cette expression nest pas NULL. MAX( [ DISTINCT | ALL ] expression ) : Retourne la plus petite des valeurs de lexpression expression. MIN([ DISTINCT | ALL ] expression ) : Retourne la plus grande des valeurs de lexpression expression. STDDEV([ DISTINCT | ALL ] expression) : Calcule lcart-type des valeurs de lexpression expression. SUM([ DISTINCT | ALL ] expression) : Calcule la somme des valeurs de lexpression expression. VARIANCE([ DISTINCT | ALL ] expression) : Calcule la variance des valeurs de lexpression expression. DISTINCT indique la fonction de groupe de ne prendre en compte que des valeurs distinctes. ALL indique la fonction de groupe de prendre en compte toutes les valeurs, cest la valeur par dfaut. Aucune des fonctions de groupe ne tient compte des valeurs NULL lexception de COUNT(*). Ainsi, SUM(col) est la somme des valeurs non NULL de la colonne col. De mme AVG est la somme des valeurs non NULL divise par le nombre de valeurs non NULL. Il est tout fait possible dutiliser des fonctions dagrgation sans clause GROUP BY. Dans ce cas, la clause SELECT ne doit comporter que des fonctions dagrgation et aucun nom de colonne. Le rsultat dune telle requte ne contient quune ligne. Exemples Reprenons la base de donnes de la sance de travaux pratiques 4.4 dont le schma relationnel tait : film (num_film, num_realisateur, titre, genre, annee) cinema (num_cinema, nom, adresse) individu (num_individu, nom prenom) jouer (num_acteur, num_film, role) projection (num_cinema, num_film, jour) Pour connatre le nombre de fois que chacun des lms a t projet on utilise la requte : SELECT num_film, titre, COUNT(*) FROM film NATURAL JOIN projection GROUP BY num_film, titre; Si lon veut galement connatre la date de la premire et de la dernire projection, on utilise : SELECT num_film, titre, COUNT(*), MIN(jour), MAX(jour) FROM film NATURAL JOIN projection GROUP BY num_film, titre; Pour connatre le nombre total de lms projets au cinma Le Fontenelle, ainsi que la date de la premire et de la dernire projection dans ce cinma, la requte ne contient pas de clause GROUP BY mais elle contient des fonctions dagrgation : SELECT COUNT(*), MIN(jour), MAX(jour) FROM film NATURAL JOIN projection NATURAL JOIN cinema WHERE cinema.nom = Le Fontenelle;

92

CHAPITRE 4. LANGAGE SQL

La clause HAVING De la mme faon quil est possible de slectionner certaines lignes au moyen de la clause WHERE, il est possible, dans un SELECT comportant une fonction de groupe, de slectionner certains groupes par la clause HAVING. Celle-ci se place aprs la clause GROUP BY. Le prdicat dans la clause HAVING suit les mmes rgles de syntaxe quun prdicat gurant dans une clause WHERE. Cependant, il ne peut porter que sur des caractristiques du groupe : fonction dagrgation ou expression gurant dans la clause GROUP BY. Une requte de groupe (i.e. comportant une clause GROUP BY) peut contenir la fois une clause WHERE et une clause HAVING. La clause WHERE sera dabord applique pour slectionner les lignes, puis les groupes seront constitus partir des lignes slectionnes, les fonctions de groupe seront ensuite values et la clause HAVING sera enn applique pour slectionner les groupes. Exemples Pour connatre le nombre de fois que chacun des lms a t projet en ne sintressant quaux lms projets plus de 2 fois, on utilise la requte : SELECT num_film, titre, COUNT(*) FROM film NATURAL JOIN projection GROUP BY num_film, titre HAVING COUNT(*)>2; Si en plus, on ne sintresse quaux lms projets au cinma Le Fontenelle, il faut ajouter une clause WHERE : SELECT num_film, titre, COUNT(*) FROM film NATURAL JOIN projection NATURAL JOIN cinema WHERE cinema.nom = Le Fontenelle GROUP BY num_film, titre HAVING COUNT(*)>2;

4.7.3

Oprateurs ensemblistes : UNION, INTERSECT et EXCEPT

Les rsultats de deux requtes peuvent tre combins en utilisant les oprateurs ensemblistes dunion (UNION), dintersection (INTERSECT) et de dirence (EXCEPT). La syntaxe dune telle requte est la suivante : requte_1 { UNION | INTERSECT | EXCEPT } [ALL] requte_2 [...] Pour que lopration ensembliste soit possible, il faut que requte_1 et requte_2 aient le mme schma, cest dire le mme nombre de colonnes respectivement du mme type. Les noms de colonnes (titres) sont ceux de la premire requte (requte_1). Il est tout fait possible de chaner plusieurs oprations ensemblistes. Dans ce cas, lexpression est value de gauche droite, mais on peut modier lordre dvaluation en utilisant des parenthses. Dans une requte on ne peut trouver quune seule instruction ORDER BY. Si elle est prsente, elle doit tre place dans la dernire requte (cf. section 4.5.6). La clause ORDER BY ne peut faire rfrence quaux numros des colonnes (la premire portant le numro 1), et non pas leurs noms, car les noms peuvent tre dirents dans chacune des requtes sur lesquelles porte le ou les oprateurs ensemblistes. Les oprateurs UNION et INTERSECT sont commutatifs. Contrairement la commande SELECT, le comportement par dfaut des oprateurs ensemblistes limine les doublons. Pour les conserver, il faut utiliser le mot-clef ALL. Attention, il sagit bien doprateurs portant sur des tables gnres par des requtes. On ne peut pas faire directement lunion de deux tables de la base de donnes.

4.7.4

Traduction des oprateurs dunion, dintersection, de dirence et de division de lalgbre relationnelle (2e partie)

Traduction de loprateur dunion Loprateur dunion relation1 relation2 se traduit tout simplement en SQL par la requte :

4.7. INTERROGER UNE BASE LANGAGE DE MANIPULATION DE DONNES : SELECT (2e PARTIE) {S8}93

SELECT * FROM relation_1 UNION SELECT * FROM relation_2 Traduction de loprateur dintersection Loprateur dintersection R1 R2 se traduit tout simplement en SQL par la requte : SELECT * FROM relation_1 INTERSECT SELECT * FROM relation_2 Traduction de loprateur de dirence Loprateur de dirence R1 R2 se traduit tout simplement en SQL par la requte : SELECT * FROM relation_1 EXCEPT SELECT * FROM relation_2 Traduction de loprateur de division Il nexiste pas de commande SQL permettant de raliser directement une division. Prenons la requte : Quels sont les acteurs qui ont jou dans tous les lms de Lars von Trier ? Cela peut se reformuler par : Quels sont les acteurs qui vrient : quel que soit un lm de Lars von Trier, lacteur a jou dans ce lm. Malheureusement, le quanticateur universel () nexiste pas en SQL. Par contre, le quanticateur existentiel () existe : EXISTS. Or, la logique des prdicats nous donne lquivalence suivante : xP(x) = xP(x) On peut donc reformuler le problme de la manire suivante : Quels sont les acteurs qui vrient : il est faux quil existe un lm de Lars von Trier dans lequel lacteur na pas jou. Ce qui correspond la requte SQL : SELECT DISTINCT nom, prenom FROM individu AS acteur_tous_lars WHERE NOT EXISTS ( SELECT * FROM ( film JOIN individu ON num_realisateur = num_individu AND nom = von Trier AND prenom = Lars ) AS film_lars WHERE NOT EXISTS ( SELECT * FROM individu JOIN jouer ON num_individu = num_acteur AND num_individu = acteur_tous_lars.num_individu AND num_film = film_lars.num_film ) ); En prenant le problme dun autre point de vue, on peut le reformuler de la manire suivante : Quels sont les acteurs qui vrient : le nombre de lms raliss par Lars von Trier dans lequel lacteur jou est gal au nombre de lms raliss par Lars von Trier. Ce qui peut se traduire en SQL indiremment par lune des deux requtes suivantes : SELECT acteur.nom, acteur.prenom FROM individu AS acteur JOIN jouer ON acteur.num_individu = jouer.num_acteur JOIN film ON jouer.num_film = film.num_film JOIN individu AS realisateur ON film.num_realisateur = realisateur.num_individu WHERE realisateur.nom = von Trier AND realisateur.prenom = Lars GROUP BY acteur.nom, acteur.prenom

94

CHAPITRE 4. LANGAGE SQL

HAVING COUNT (DISTINCT film.num_film) = ( SELECT DISTINCT COUNT(*) FROM film JOIN individu ON num_realisateur = num_individu WHERE nom = von Trier AND prenom = Lars ); SELECT DISTINCT acteur_tous_lars.nom, acteur_tous_lars.prenom FROM individu AS acteur_tous_lars WHERE ( SELECT DISTINCT COUNT(*) FROM jouer JOIN film ON jouer.num_film = film.num_film JOIN individu ON num_realisateur = num_individu WHERE nom = von Trier AND prenom = Lars AND jouer.num_acteur = acteur_tous_lars.num_individu ) = ( SELECT DISTINCT COUNT(*) FROM film JOIN individu ON num_realisateur = num_individu WHERE nom = von Trier AND prenom = Lars );

4.8. TRAVAUX PRATIQUES SQL : REQUTES AVANCES {S8}

95

4.8

Travaux Pratiques PostgreSQL : Requtes avances

Dans les exercices de cette section, lobjectif est de trouver les requtes SQL permettant de rpondre aux problmes poss. Nous utilisons la base de donnes sur le cinma (cf. sance de travaux pratiques 4.4). Contrairement la sance de travaux pratiques 4.6, nous utilisons maintenant la commande JOIN pour toutes les jointures des requtes.

4.8.1

Prix de GROUP

1. Dressez la liste de toutes les interprtations, en prcisant le rle, dacteur, dont on prcisera le nom et le prnom, ayant jou dans des lms dont on prcisera le titre. 2. On dsire connatre le nom et le prnom des acteurs et le nombre de lms dans lesquels ils ont jou. 3. On dsire connatre le nom et le prnom des acteurs, le nombre de lms dans lequel ils ont jou ainsi que lanne du lm de leur premier et de leur dernier rle. 4. On dsire connatre le nom et le prnom des acteurs et le nombre de lms dans lesquels ils ont jou pour les acteurs ayant jou dans strictement plus dun lm. 5. On dsire connatre le nom et le prnom des acteurs et le nombre de drames dans lesquels ils ont jou.

4.8.2

Requtes dj rsolues en utilisant lalgbre relationnelle (cf. travaux dirigs section 3.5.2)

6. Quels sont les noms et prnoms des acteurs qui sont galement ralisateurs ? Remarque : vous devez utiliser le mot clef INTERSECT puisque nous lavons maintenant vu. 7. Quels sont les ralisateurs qui ont ralis des lms dpouvante et des lms dramatiques ? 8. Quels sont les acteurs qui nont pas jou dans des lms dramatiques ? 9. Quels sont les cinmas qui ont projet tous les lms ? 10. Quels sont les acteurs que lon a pu voir dans toutes les cinmas ?

4.8.3 GROUP toujours !


11. Quel est le nombre de lms raliss par chacun des ralisateurs ? 12. Combien de lms ralis le ralisateur qui en a le plus raliss ? 13. Quel sont les ralisateurs (il peut y en avoir un ou plusieurs execo) ayant ralis le plus de lms ? Comment serait-il possible de simplier cette requte ? 14. Quel est le nombre de lms raliss par les ralisateurs, dont on dsire connatre le nom et le prnom, ayant ralis au moins un lm du mme genre que lun des lms raliss par David Cronenberg ? 15. On suppose que les ttes dache dun lm sont les acteurs recenss pour ce lm dans la base de donnes. Quel est le nombre de ttes dache et le ralisateur de chacun des lms ?

16. En supposant quun lm cote 1000000  plus 200000  par tte dache, donnez le prix moyen des lms raliss par chacun des ralisateurs.

96

CHAPITRE 4. LANGAGE SQL

4.9
4.9.1

Nouveaux objets Langage de dnition de donnes (LDD)


Squences (CREATE SEQUENCE) et type SERIAL

Cration dune squence Une squence est en fait une table spciale contenant une seule ligne. Cet objet est utilis pour crer une suite de nombres entiers dont lvolution, gnralement croissante, est rgie par un certain nombre de paramtres. Voici la syntaxe de cration dune squence : CREATE SEQUENCE nom [ INCREMENT [ BY ] incrment ] [ MINVALUE valeurmin ] [ MAXVALUE valeurmax ] [ START [ WITH ] dbut ] [ [ NO ] CYCLE ] La commande CREATE SEQUENCE cre un nouveau gnrateur de nombre. Ceci implique la cration et linitialisation dune nouvelle table portant le nom nom. INCREMENT BY : La clause optionnelle INCREMENT BY incrment spcie la valeur ajoute la valeur de la squence courante pour crer une nouvelle valeur. Une valeur positive crera une squence ascendante, une ngative en crera une descendante. La valeur par dfaut est 1. MINVALUE : La clause optionnelle MINVALUE valeurmin prcise la valeur minimale quune squence peut gnrer. Si cette clause nest pas fournie, alors les valeurs par dfaut seront utilises. Les valeurs par dfaut sont 1 et 263 1 pour les squences respectivement ascendantes et descendantes. MAXVALUE : La clause optionnelle MAXVALUE valeurmax prcise la valeur maximale pour la squence. Si cette clause nest pas fournie, alors les valeurs par dfaut seront utilises. Les valeurs par dfaut sont 263 1 et 1 pour les squences respectivement ascendantes et descendantes. START WITH : La clause optionnelle START WITH dbut prcise la valeur dinitialisation de la squence. La valeur de dbut par dfaut est valeurmin pour les squences ascendantes et valeurmax pour les squences descendantes. [ NO ] CYCLE : Loption CYCLE autorise la squence recommencer au dbut lorsque valeurmax ou valeurmin a t atteinte par une squence respectivement ascendante ou descendante. Si la limite est atteinte, le prochain nombre gnr sera respectivement valeurmin ou valeurmax. Si NO CYCLE est spci, tout appel nextval aprs que la squence a atteint la valeur minimale renverra une erreur. NO CYCLE est le comportement par dfaut. Utilisation dune squence Bien que vous ne pouvez pas mettre jour directement une squence, vous pouvez toujours utiliser une requte comme : SELECT * FROM nom_sequence; Aprs la cration dune squence, il faut utiliser les fonctions nextval(), currval() et setval() pour la manipuler. nextval(nom_sequence) : incrmente la valeur courante de la squence nom_sequence (except la premire fois) et retourne cette valeur. currval(nom_sequence) : retourne la valeur courante de la squence nom_sequence ; cette fonction ne peut tre appele que si nextval() la t au moins une fois. setval(nom_sequence, nombre) : Initialise la valeur courante de la squence nom_sequence nombre.

4.9. NOUVEAUX OBJETS LANGAGE DE DFINITION DE DONNES (LDD) {S9}

97

Vous pouvez appeler ces direntes fonctions de la manire suivante : SELECT nextval(nom_sequence); SELECT currval(nom_sequence); SELECT setval(nom_sequence, nombre); Utilisez DROP SEQUENCE pour supprimer une squence. Type SERIAL Le type de donne SERIAL nest pas un vrai type, mais plutt un raccourci de notation pour dcrire une colonne didentiants uniques. Ainsi, la commande CREATE TABLE nom_de_table ( nom_de_colonne SERIAL ); est quivalente la commande : CREATE SEQUENCE nom_de_sequence; CREATE TABLE nom_de_table ( nom_de_colonne integer DEFAULT nextval(nom_de_sequence) NOT NULL ); Ainsi, nous avons cr une colonne dentiers et fait en sorte que ses valeurs par dfaut soient assignes par un gnrateur de squence. Une contrainte NOT NULL est ajoute pour sassurer quune valeur nulle ne puisse pas tre explicitement insre. Dans la plupart des cas, on ajoute galement une contrainte UNIQUE ou PRIMARY KEY pour interdire que des doublons soient crs par accident. Pour insrer la valeur suivante de la squence dans la colonne de type SERIAL, il faut faire en sorte dutiliser la valeur par dfaut de la colonne. Cela peut se faire de deux faons : soit en excluant cette colonne de la liste des colonnes de la commande INSERT, ou en utilisant le mot cl DEFAULT.

4.9.2

Rgles (CREATE RULE)

Description Le systme de rgles autorise la dnition dactions alternatives raliser sur les insertions, mises jour ou suppressions dans les tables de la base de donnes. Concrtement, une rgle permet dexcuter des commandes supplmentaires lorsquune commande donne est excute sur une table donne. Autrement dit, une rgle peut remplacer une commande donne par une autre ou faire quune commande ne soit pas excute. Les rgles sont aussi utilises pour implmenter les vues de tables (cf. section 4.9.3). Syntaxe de dnition Voici la syntaxe de cration dune rgle : CREATE [ OR REPLACE ] RULE nom AS ON vnement TO table [ WHERE condition ] DO [ INSTEAD ] { NOTHING | commande | ( commande ; commande ... ) } CREATE RULE : dnit une nouvelle rgle sappliquant une table ou une vue. CREATE OR REPLACE RULE : dnit une nouvelle rgle, ou, le cas chant, remplace une rgle existante du mme nom pour la mme table. nom : dsigne le nom dune rgle crer. Elle doit tre distincte du nom de toute autre rgle sur la mme table. Lorsque plusieurs rgles portent sur la mme table et le mme type dvnement, elles sont appliques dans lordre alphabtique de leur nom.

98

CHAPITRE 4. LANGAGE SQL

vnement : SELECT, INSERT, UPDATE ou DELETE. Les rgles qui sont dnies sur INSERT, UPDATE ou DELETE sont appeles des rgles de mise jour. Les rgles dnies sur SELECT permettent la cration de vues (cf. section 4.9.3). table : Le nom (pouvant tre quali par le nom du schma) de la table ou de la vue o sapplique la rgle. condition : Toute expression SQL conditionnelle (i.e. de type boolean). Lexpression de condition ne peut pas rfrer une table autre que NEW et OLD et ne peut pas contenir de fonction dagrgat. commande : Zone de spcication des commandes ralisant laction de la rgle. Les commandes valides sont SELECT, INSERT, UPDATE, DELETE ou NOTIFY. Le mot-cl NOTHING permet de spcier que lon ne veut rien faire. INSTEAD : Si ce mot-cl est utilis, la ou les commandes sont excutes la place de la requte dclenchante. En labsence de INSTEAD, la ou les commandes sont excutes aprs la requte dclenchante dans le cas ON INSERT (pour permettre aux commandes de voir les lignes insres) et avant dans le cas ON UPDATE ou ON DELETE (pour permettre aux commandes de voir les lignes mettre jour ou supprimer). lintrieur dune condition et dune commande, deux tables spciales, NEW et OLD, peuvent tre utilises pour se rfrer la table sur laquelle porte la rgle. NEW est valide dans les rgles ON INSERT et ON UPDATE pour dsigner la nouvelle ligne en cours dinsertion ou de mise jour. OLD est valide dans les rgles ON UPDATE et ON DELETE pour dsigner la ligne existante en cours de modication ou de suppression. Syntaxe de suppression DROP RULE nom ON relation [ CASCADE | RESTRICT ] DROP RULE : Supprime une rgle de rcriture. nom : Le nom de la rgle supprimer. relation : Le nom (quali ou non du nom du schma) de la table ou vue o sapplique la rgle. CASCADE : Supprime automatiquement les objets dpendant de la rgle. RESTRICT : Refuse de supprimer la rgle si un objet en dpend. Ceci est la valeur par dfaut.

4.9.3

Vues (CREATE VIEW)

Description Les vues sont des tables virtuelles qui contiennent le rsultat dune requte SELECT. Lun des intrts de lutilisation des vues vient du fait que la vue ne stocke pas les donnes, mais fait rfrence une ou plusieurs tables dorigine travers une requte SELECT, requte qui est excute chaque fois que la vue est rfrence. De ce fait, toute modication de donnes dans les tables dorigine est immdiatement visible dans la vue ds que celle-ci est nouveau rfrence dans une requte. Les utilisations possibles dune vue sont multiples : Cacher aux utilisateurs certaines colonnes ou certaines lignes en mettant leur disposition des vues de projection ou de slection. Ceci permet de fournir un niveau de condentialit et de scurit supplmentaire. Simplier lutilisation de tables comportant de nombreuses colonnes, de nombreuses lignes ou des noms complexes, en crant des vues avec des structures plus simples et des noms plus intelligibles. Nommer des requtes frquemment utilises pour simplier et acclrer lcriture de requte y faisant rfrence.

4.9. NOUVEAUX OBJETS LANGAGE DE DFINITION DE DONNES (LDD) {S9}

99

Syntaxe de dnition Voici la syntaxe de cration dune vue : CREATE [ OR REPLACE ] VIEW nom [ ( nom_colonne [, ...] ) ] AS requte CREATE VIEW : dnit une nouvelle vue. CREATE OR REPLACE VIEW : dnit une nouvelle vue, ou la remplace si une vue du mme nom existe dj. Vous pouvez seulement remplacer une vue avec une nouvelle requte qui gnre un ensemble de colonnes identiques. nom : Le nom de la vue crer (quali ou non du nom du schma). Si un nom de schma (cf. section 4.9.4) est donn (par exemple CREATE VIEW monschema.mavue ...), alors la vue est cre dans le schma donn. Dans les autres cas, elle est cre dans le schma courant. Le nom de la vue doit tre dirent du nom des autres vues, tables, squences ou index du mme schma. nom_colonne : Une liste optionnelle de noms utiliser pour les colonnes de la vue. Si elle nest pas donne, le nom des colonnes sera dduit de la requte. requte : Une requte (cest--dire une instruction SELECT) qui dnit les colonnes et les lignes de la vue. La norme SQL propose un ensemble important de restrictions pour la modication ou linsertion ou la modication des donnes dans les vues. Les systmes de gestion de base de donnes ont aussi chacun leur implantation de ce concept et chacun leurs contraintes et restrictions. En particulier, peu doprations sont autorises ds quune vue porte sur plusieurs tables ; aucune nest possible si la vue comporte des oprateurs dagrgation. Avec PostgreSQL les vues ne sont que consultables par des instructions SELECT (i.e. lecture seule). Aucune autre opration nest possible (insertion, mise jour ou suppression de lignes). Par contre, la notion de rgles permet, avec PostgreSQL, dimplmenter ces fonctionnalits. Cette notion savre plus souple et puissante que les restrictions communment appliques aux SGBD classiques. Implmentation interne Avec PostgreSQL, les vues sont implmentes en utilisant le systme de rgles. En fait, il ny aucune dirence entre CREATE VIEW mavue AS SELECT * FROM matable; et ces deux commandes CREATE TABLE mavue (liste de colonnes identique celle de matable); CREATE RULE "_RETURN" AS ON SELECT TO mavue DO INSTEAD SELECT * FROM matable; parce que cest exactement ce que fait la commande CREATE VIEW en interne. Ainsi, pour lanalyseur, il ny a aucune dirence entre une table et une vue : il sagit de relations. Syntaxe de suppression DROP VIEW nom [, ...] [ CASCADE | RESTRICT ] DROP VIEW : Supprime une vue existante. nom : Le nom de la vue supprimer (quali ou non du nom du schma). CASCADE : Supprime automatiquement les objets qui dpendent de la vue (comme par exemple dautres vues). RESTRICT : Refuse de supprimer la vue si un objet en dpend. Ceci est la valeur par dfaut.

100

CHAPITRE 4. LANGAGE SQL

4.9.4

Schmas (CREATE SCHEMA)

Description Les schmas sont des espaces dans lesquels sont rfrencs des lments (tables, vues, index...). La notion de schma est trs lie la notion dutilisateur ou de groupe dutilisateurs. Syntaxe de dnition CREATE SCHEMA nom_schma CREATE SCHEMA cre un nouveau schma dans la base de donnes en cours. Le nom du schma doit tre distinct du nom des dirents schmas existants dans la base de donnes en cours. Le paramtre nom_schma est le nom du schma crer. Accs aux tables Lorsquune table nom_table est dans un schma nom_schema, pour la dsigner, il faut faire prcder son nom par le nom du schma qui la contient de la manire suivante : nom_schema.nom_table. Cest ce que lon appel un nom quali. Le Chemin de Recherche de Schma Les noms qualis sont pnibles crire et il est, de toute faon, prfrable de ne pas coder un nom de schma dans une application. Donc, les tables sont souvent appeles par des noms non qualis (i.e. nom de la table lui mme). Le systme dtermine quelle table est appele en suivant un chemin de recherche qui est une liste de schmas regarder. La premire table correspondante est considre comme la table voulue. Sil ny a pas de correspondance, une erreur est leve, mme si des noms de table correspondants existent dans dautres schmas dans la base. Le premier schma dans le chemin de recherche est appel le schma courant. En plus dtre le premier schma parcouru, il est aussi le schma dans lequel de nouvelles tables seront cres si la commande CREATE TABLE ne prcise pas de nom de schma. Pour voir le chemin de recherche courant, utilisez la commande suivante : SHOW search_path; Pour ajouter un nouveau schma mon_schema dans le chemin tout en conservant dans ce chemin le schma par dfaut (public), nous utilisons la commande : SET search_path TO mon_schema,public; Syntaxe de suppression La commande DROP SCHEMA permet de supprimer des schmas de la base de donnes. La syntaxe de la commande est la suivante : DROP SCHEMA nom [, ...] [ CASCADE | RESTRICT ] Un schma peut seulement tre supprim par son propritaire ou par un super utilisateur. nom : Le nom du schma CASCADE : Supprime automatiquement les objets (tables, fonctions, etc.) contenus dans le schma. RESTRICT : Refuse de supprimer le schma sil contient un objet. Ceci est la valeur par dfaut.

4.10. TRAVAUX PRATIQUES SQL : NOUVEAUX OBJETS {S9}

101

4.10
4.10.1

Travaux Pratiques PostgreSQL : Manipulation des nouveaux objets


Squences

1. Crez une squence test_sequence cyclique commenant 10 de pas dincrment 2 et de valeur maximum 20. 2. Testez cette squence (avec la fonction nextval) et observez son comportement. Le cycle recommencet-il 10 ? Pourquoi ? 3. Testez galement les fonctions currval et setval. Eacez la squence de la table. 4. Modiez votre chier GenBDCine.sql an que la colonne num_individu de la table individu soit du type serial. Rechargez votre base. 5. Tentez dinsrer un nouvel individu sans prciser son num_individu. Quel est le problme ? Comment pouvez-vous y remdier ?

4.10.2

Schma et vues

6. Crez un schma vue. 7. Dans ce schma, crez deux vues, lune correspondant la liste des acteurs, lautre la liste des ralisateurs. Les schmas respectifs de ces relations seront : acteur(num_acteur, nom, prenom) ; realisateur(num_realisateur, nom, prenom).

4.10.3

Rgles

8. Crez une rgle insertion_acteur qui insre un individu dans la table individu la place de linsrer dans la table vue.acteur quand on tente de linsrer dans la table vue.acteur. 9. Quel est le problme de cette rgle ? 10. Crez une nouvelle ligne dans la table film. Il sagit dun lm ctif : num_film 0 num_realisateur titre 0 NULL genre NULL annee NULL

Quel problme rencontrez-vous ? Trouvez une solution. 11. Ainsi, quand un nouvel acteur est insr, il est possible de mettre jour la table jouer en faisant rfrence ce lm ctif. Corrigez votre rgle insertion_acteur pour mettre en uvre cette nouvelle logique. Vriez quun nouvel acteur insr dans la vue vue.acteur apparaisse bien dans cette vue une fois lopration eectue.

4.10.4

Toujours des requtes

Dans les exercices qui suivent, pour rpondre, utilisez les vues vue.acteur et vue.realisateur quand cela permet de simplier lcriture des requtes. 12. Quels sont les individus qui ne sont ni des acteurs, ni des ralisateurs. 13. Quels sont les noms et prnoms des acteurs qui sont galement ralisateurs ? Remarque : cette requte a dj t rsolue en utilisant lalgbre relationnelle (cf. travaux dirigs section 3.5.2) et le langage SQL (cf. travaux pratiques 4.6 et 4.8) : 14. Quels sont les noms et prnoms des individus dont le prnom est la fois celui dun acteur et celui dun ralisateur sans quil sagisse de la mme personne ? Remarque : cette requte a dj t rsolue en utilisant lalgbre relationnelle (cf. travaux dirigs section 3.5.2).

102

CHAPITRE 4. LANGAGE SQL

4.11
4.11.1

SQL intgr
Introduction

Ce chapitre dcrit le pacquage SQL embarqu pour PostgreSQL ECPG. Il est compatible avec les langages C et C++ et a t dvelopp par Linus Tolke et Michael Meskes. Un programme SQL embarqu est en fait un programme ordinaire, dans notre cas un programme en langage C, dans lequel nous insrons des commandes SQL incluses dans des sections spcialement marques. Ainsi les instructions Embedded SQL commencent par les mots EXEC SQL et se terminent par un point-virgule ( ; ). Pour gnrer lexcutable, le code source est dabord traduit par le prprocesseur SQL qui convertit les sections SQL en code source C ou C++, aprs quoi il peut tre compil de manire classique. Le SQL embarqu prsente des avantages par rapport dautres mthodes pour prendre en compte des commandes SQL dans du code C. Par exemple, le passage des informations de et vers les variables du programme C est entirement pris en charge. Ensuite, le code SQL du programme est vri syntaxiquement au moment de la prcompilation. Enn, le SQL embarqu en C est spci dans le standard SQL et support par de nombreux systmes de bases de donnes SQL. Limplmentation PostgreSQL est conue pour correspondre ce standard autant que possible, an de rendre le code facilement portable vers des SGBD autre que PostgreSQL. Comme alternative au SQL intgr, on peut citer lutilisation dune API (Application Programming Interface) permettant au programme de communiquer directement avec le SGBD via des fonctions fournies par lAPI. Dans ce cas de gure, il ny a pas de prcompilation eectuer. Se rfrer la documentation PostgreSQL (The PostgreSQL Global Development Group, 2005) pour plus dinformation ce sujet : Chapitre 27. libpq Bibliothque C.

4.11.2

Connexion au serveur de bases de donnes

Introduction Quelque soit le langage utilis (C, Java, PHP, etc.), pour pouvoir eectuer un traitement sur une base de donnes, il faut respecter les tapes suivantes : 1. tablir une connexion avec la base de donnes ; 2. rcuprer les informations relatives la connexion ; 3. eectuer les traitements dsirs (requtes ou autres commandes SQL) ; 4. fermer la connexion avec la base de donnes. Nous allons voir dans cette section comment ouvrir et fermer une connexion, et nous verrons dans les sections suivantes comment eectuer des traitements. Ouverture de connexion La connexion une base de donnes se fait en utilisant linstruction suivante : EXEC SQL CONNECT TO cible [AS nom_connexion] [USER utilisateur]; La cible cible peut tre spcie de lune des faons suivantes : nom_base[@nom_hte ][:port] ; tcp:postgresql://nom_hte [:port ] [/nom_base][? options] ; unix:postgresql://nom_hte[: port][/nom_base ][? options] ; une chane SQL littrale contenant une des formes ci-dessus ; une rfrence une variable contenant une des formes ci-dessus ; DEFAULT. En pratique, utiliser une chane littrale (entre guillemets simples) ou une variable de rfrence gnre moins derreurs. La cible de connexion DEFAULT initie une connexion sur la base de donnes par dfaut

4.11. SQL INTGR {S10}

103

avec lutilisateur par dfaut. Aucun nom dutilisateur ou nom de connexion ne pourrait tre spci isolment dans ce cas. Il existe galement direntes faons de prciser lutilisateur utilisateur : nom_utilisateur nom_utilisateur/ mot_de_passe nom_utilisateur IDENTIFIED BY mot_de_passe nom_utilisateur USING mot_de_passe nom_utilisateur et mot_de_passe peuvent tre un identicateur SQL, une chane SQL littrale ou une rfrence une variable de type caractre. nom_connexion est utilis pour grer plusieurs connexions dans un mme programme. Il peut tre omis si un programme nutilise quune seule connexion. La dernire connexion ouverte devient la connexion courante, utilise par dfaut lorsquune instruction SQL est excuter. Fermeture de connexion Pour fermer une connexion, utilisez linstruction suivante : EXEC SQL DISCONNECT [connexion]; Le paramtre connexion peut prendre lune des valeurs suivantes : nom_connexion DEFAULT CURRENT ALL Si aucun nom de connexion nest spci, cest la connexion courante qui est ferme. Il est prfrable de toujours fermer explicitement chaque connexion ouverte.

4.11.3

Excuter des commandes SQL

Toute commande SQL, incluse dans des sections spcialement marques, peut tre excute lintrieur dune application SQL embarqu. Ces sections se prsentent toujours de la manire suivante : EXEC SQL instructions_SQL ; Dans le mode par dfaut, les instructions ne sont valides que lorsque EXEC SQL COMMIT est excut. Linterface SQL embarqu supporte aussi la validation automatique des transactions via linstruction EXEC SQL SET AUTOCOMMIT TO ON. Dans ce cas, chaque commande est automatiquement valide. Ce mode peut tre explicitement dsactiv en utilisant EXEC SQL SET AUTOCOMMIT TO OFF. Voici un exemple permettant de crer une table : EXEC SQL create table individu ( num_individu integer primary key, nom varchar(64), prenom varchar(64) ); EXEC SQL COMMIT;

4.11.4

Les variables htes

Introduction aux variables htes La transmission de donnes entre le programme C et le serveur de base de donnes est particulirement simple en SQL embarqu. En eet, il est possible dutiliser une variable C, dans une instruction SQL, simplement en la prxant par le caractre deux-points ( : ). Par exemple, pour insrer une ligne dans la table individu on peut crire : EXEC SQL INSERT INTO individu VALUES (:var_num, Poustopol, :var_prenom); Cette instruction fait rfrence deux variables C nommes var_num et var_prenom et utilise aussi une chane littrale SQL (Poustopol) pour illustrer que vous ntes pas restreint utiliser un type de donnes plutt quun autre. Dans lenvironnement SQL, nous appelons les rfrences des variables C des variables htes.

104

CHAPITRE 4. LANGAGE SQL

Dclaration des variables htes Les variables htes sont des variables de langage C identies auprs du prprocesseur SQL. Ainsi, pour tre dnies, les variables htes doivent tre places dans une section de dclaration, comme suit : EXEC SQL BEGIN DECLARE SECTION; declarations_des_variables_C EXEC SQL END DECLARE SECTION; Vous pouvez avoir autant de sections de dclaration dans un programme que vous le souhaitez. Les variables htes peuvent remplacer les constantes dans nimporte quelle instruction SQL. Lorsque le serveur de base de donnes excute la commande, il utilise la valeur de la variable hte. Notez toutefois quune variable hte ne peut pas remplacer un nom de table ou de colonne. Comme nous lavons dj dit, dans une instruction SQL, le nom de la variable est prcd du signe deux-points ( : ) pour le distinguer dautres identicateurs admis dans linstruction. Les initialisations sur les variables sont admises dans une section de dclaration. Les sections de dclarations sont traites comme des variables C normales dans le chier de sortie du prcompilateur. Il ne faut donc pas les rednir en dehors des sections de dclaration. Les variables qui nont pas pour but dtre utilises dans des commandes SQL peuvent tre normalement dclares en dehors des sections de dclaration. Les variables en langage C ont leur porte normale au sein du bloc dans lequel elles sont dnies. Toutefois, le prprocesseur SQL nanalyse pas le code en langage C. Par consquent, il ne respecte pas les blocs C. Aussi, pour le prprocesseur SQL, les variables htes sont globales : il nest pas possible que deux de ces variables portent le mme nom. Types des variables htes Seul un nombre limit de types de donnes du langage C est support pour les variables htes. En outre, certains types de variable hte nont pas de type correspondant en langage C. Dans ce cas, des macros prdnies peuvent tre utilises pour dclarer les variables htes. Par exemple, le type prdni VARCHAR est la structure adquate pour interfacer des donnes SQL de type varchar. Une dclaration comme VARCHAR var[180]; est en fait convertie par le prprocesseur en une structure : struct varchar_var { int len; char arr[180]; } var; Utilisation dune variable hte : clause INTO Dans le cas dune requte de ligne unique, cest dire qui nextrait pas plus dune ligne de la base de donnes, les valeurs renvoyes peuvent tre stockes directement dans des variables htes. Cependant, contrairement au langage C ou C++, le SQL est un langage ensembliste : une requte peut trs bien retourner plus dune ligne. Dans ce cas, il faut faire appel la notion de curseur que nous abordons dans la section 4.11.7. Dans le cas dune requte de ligne unique, une nouvelle clause INTO est intercale entre la clause SELECT et la clause FROM. La clause INTO contient une liste de variables htes destine recevoir la valeur de chacune des colonnes mentionnes dans la clause SELECT. Le nombre de variables htes doit tre identique au nombre de colonnes de la clause SELECT. Les variables htes peuvent tre accompagnes de variables indicateur an de prendre en compte les rsultats NULL (cf. section 4.11.5). Lors de lexcution de linstruction SELECT, le serveur de base de donnes rcupre les rsultats et les place dans les variables htes. Si le rsultat de la requte contient plusieurs lignes, le serveur renvoie une erreur. Si la requte naboutit pas la slection dune ligne, un avertissement est renvoy. Les erreurs et les avertissements sont renvoys dans la structure SQLCA, comme dcrit dans la section 4.11.6. Par exemple, en reprenons la base de donnes de la sance de travaux pratiques 4.4 et une requte que nous avons dj rencontre section 4.7.2 : nombre de fois que chacun des lms a t projet . Nous

4.11. SQL INTGR {S10}

105

pouvons rcuprer les rsultats de cette requte de ligne unique dans des variables htes de la manire suivante : EXEC SQL BEGIN DECLARE SECTION; VARCHAR titre[128]; int id_film; int nb_proj; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT num_film, titre, COUNT(*) INTO :id_film, :titre, :nb_proj FROM film NATURAL JOIN projection GROUP BY num_film, titre;

4.11.5

Variables indicateur

Prsentation Les variables indicateur sont des variables en langage C qui fournissent des informations complmentaires pour les oprations de lecture ou dinsertion de donnes. Il existe plusieurs types dutilisation pour ces variables. Valeurs NULL : Pour permettre aux applications de grer les valeurs NULL. Troncature de chanes : Pour permettre aux applications de grer les cas o les valeurs lues doivent tre tronques pour tenir dans les variables htes. Erreurs de conversion : Pour stocker les informations relatives aux erreurs. Une variable indicateur est une variable hte de type int suivant immdiatement une variable hte normale dans une instruction SQL. Utilisation de variables indicateur Dans les donnes SQL, la valeur NULL reprsente un attribut inconnu ou une information non applicable. Il ne faut pas confondre la valeur NULL de SQL avec la constante du langage C qui porte le mme nom (NULL). Cette dernire reprsente un pointeur non initialis, incorrect ou ne pointant pas vers un contenu valide de zone mmoire. La valeur NULL nquivaut aucune autre valeur du type dni pour les colonnes. Ainsi, si une valeur NULL est lue dans la base de donnes et quaucune variable indicateur nest fournie, une erreur est gnre (SQLE_NO_INDICATOR). Pour transmettre des valeurs NULL la base de donnes ou en recevoir des rsultats NULL, des variables htes dun type particulier sont requises : les variables indicateur. Par exemple, dans lexemple prcdent, une erreur est gnre si, pour une raison quelconque, le titre du lm nexiste pas et que sa valeur est NULL. Pour saranchir de ce problme, on utilise une variable indicateur de la manire suivante : EXEC SQL BEGIN DECLARE SECTION; VARCHAR titre[128]; int id_film; int nb_proj; int val_ind; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT num_film, titre, COUNT(*) INTO :id_film, :titre :val_ind, :nb_proj FROM film NATURAL JOIN projection GROUP BY num_film, titre; Dans cet exemple, la variable indicateur val_ind vaudra zro si la valeur retourne nest pas NULL et elle sera ngative si la valeur est NULL. Si la valeur de lindicateur est positive, cela signie que la valeur retourne nest pas NULL mais que la chane a t tronque pour tenir dans la variable hte.

106

CHAPITRE 4. LANGAGE SQL

4.11.6

Gestion des erreurs

Congurer des rappels : instruction WHENEVER Linstruction WHENEVER est une mthode simple pour intercepter les erreurs, les avertissements et les conditions exceptionnelles rencontrs par la base de donnes lors du traitement dinstructions SQL. Elle consiste congurer une action spcique excuter chaque fois quune condition particulire survient. Cette opration seectue de la manire suivante : EXEC SQL WHENEVER condition action; Le paramtre condition peut prendre une des valeurs suivantes : SQLERROR : Laction spcie est appele lorsquune erreur survient pendant lexcution dune instruction SQL. SQLWARNING : Laction spcie est appele lorsquun avertissement survient pendant lexcution dune instruction SQL. NOT FOUND : Laction spcie est appele lorsquune instruction ne rcupre ou naecte aucune ligne. Le paramtre action peut avoir une des valeurs suivantes : CONTINUE : Signie eectivement que la condition est ignore. Cest laction par dfaut. SQLPRINT : Ache un message sur la sortie standard. Ceci est utile pour des programmes simples ou lors dun prototypage. Les dtails du message ne peuvent pas tre congurs. STOP : Appel de exit(1), ce qui terminera le programme. BREAK : Excute linstruction C break. Cette action est utile dans des boucles ou dans des instructions switch. GOTO label et GO TO label : Saute au label spci (en utilisant une instruction C goto). CALL nom (args) et DO nom (args) : Appelle les fonctions C spcies avec les arguments spcis. Le standard SQL ne dnit que les actions CONTINUE et GOTO ou GO TO. Linstruction WHENEVER peut tre insre en un endroit quelconque dun programme SQL embarqu. Cette instruction indique au prprocesseur de gnrer du code aprs chaque instruction SQL. Leet de cette instruction reste actif pour toutes les instructions en SQL embarqu situes entre la ligne de linstruction WHENEVER et linstruction WHENEVER suivante contenant la mme condition condition derreur, ou jusqu la n du chier source. Les conditions derreur sont fonction du positionnement dans le chier source de langage C et non du moment o linstruction est excute. Cette instruction est fournie pour vous faciliter le dveloppement de programmes simples. Il est plus rigoureux de contrler les conditions derreur en vriant directement le champ sqlcode de la zone SQLCA (cf. section suivante). Dans ce cas, linstruction WHENEVER est inutile. En fait, linstruction WHENEVER se contente de demander au prprocesseur de gnrer un test if ( SQLCODE ) aprs chaque instruction SQL. Zone de communication SQL (SQLCA) La zone de communication SQL (SQLCA) est une zone de mmoire qui permet, pour chaque demande adresse la base de donnes, de communiquer des statistiques et de signaler des erreurs. En consultant la zone SQLCA, vous pouvez tester un code derreur spcique. Un code derreur sache dans les champs sqlcode et sqlstate lorsquune requte adresse la base de donnes provoque une erreur. Une variable SQLCA globale (sqlca) est dnie dans la bibliothque dinterface, elle a la structure suivante : struct char long long { sqlcaid[8]; sqlabc; sqlcode;

4.11. SQL INTGR {S10}

107

struct { int sqlerrml; char sqlerrmc[70]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; char sqlwarn[8]; char sqlstate[5]; } sqlca; SQLCA couvre la fois les avertissements et les erreurs. Si plusieurs avertissements ou erreurs surviennent lors de lexcution dune instruction, alors sqlca ne contient que les informations relatives la dernire. Si aucune erreur ne survient dans la dernire instruction SQL, sqlca.sqlcode vaut 0 et sqlca.sqlstate vaut "00000". Si un avertissement ou une erreur a eu lieu, alors sqlca.sqlcode sera ngatif et sqlca.sqlstate sera dirent de "00000". Les champs sqlca.sqlstate et sqlca.sqlcode sont deux schmas dirents fournissant des codes derreur. Les deux sont spcis dans le standard SQL mais sqlcode est indiqu comme obsolte dans ldition de 1992 du standard et a t supprim dans celle de 1999. Du coup, les nouvelles applications sont fortement encourages utiliser sqlstate.

4.11.7

Curseurs pour rsultats lignes multiples

Prsentation Lorsque vous excutez une requte dans une application, le jeu de rsultats est constitu dun certain nombre de lignes. En gnral, vous ne connaissez pas le nombre de lignes que lapplication recevra avant dexcuter la requte. Les curseurs constituent un moyen de grer les jeux de rsultats dune requte lignes multiples. Les curseurs vous permettent de naviguer dans les rsultats dune requte et deectuer des insertions, des mises jour et des suppressions de donnes sous-jacentes en tout point dun jeu de rsultats. Pour grer un curseur vous devez respecter les tapes suivantes : 1. Dclarer un curseur pour une instruction SELECT donne laide de linstruction DECLARE : EXEC SQL DECLARE nom_curseur CURSOR FOR requte_select ; 2. Ouvrir le curseur laide de linstruction OPEN : EXEC SQL OPEN nom_curseur ; 3. Rcuprer une par une les lignes du curseur laide de linstruction FETCH : FETCH [ [ NEXT | PRIOR | FIRST | LAST | { ABSOLUTE | RELATIVE } nombre ] { FROM | IN } ] nom_curseur INTO liste_variables NEXT : Rcupre la ligne suivante. Ceci est la valeur par dfaut. PRIOR : Rcupre la ligne prcdente. FIRST : Rcupre la premire ligne de la requte (identique ABSOLUTE 1). LAST : Rcupre la dernire ligne de la requte (identique ABSOLUTE -1). ABSOLUTE nombre : Rcupre la nombree ligne de la requte ou la abs(nombre)e ligne partir de la n si nombre est ngatif. La position avant la premire ligne ou aprs la dernire si nombre est en-dehors de lchelle ; en particulier, ABSOLUTE 0 se positionne avant la premire ligne. RELATIVE nombre : Rcupre la nombree ligne ou la abs(nombre)e ligne avant si nombre est ngatif. RELATIVE 0 rcupre de nouveau la ligne actuelle si elle existe. nom_curseur : Le nom dun curseur ouvert.

108

CHAPITRE 4. LANGAGE SQL

liste_variables : La liste des variables htes destines recevoir la valeur de chacun des attributs de la ligne courante. Le nombre de variables htes doit tre identique au nombre de colonnes de la table rsultat. 4. Continuez lextraction des lignes tant quil y en a. 5. Fermer le curseur laide de linstruction CLOSE : CLOSE nom_curseur Lors de son ouverture, un curseur est plac avant la premire ligne. Par dfaut, les curseurs sont automatiquement referms la n dune transaction. Voici un exemple utilisant la commande FETCH : EXEC SQL BEGIN DECLARE SECTION; int v1; VARCHAR v2; EXEC SQL END DECLARE SECTION; ... EXEC SQL DECLARE foo CURSOR FOR SELECT a, b FROM test; EXEC SQL OPEN foo; while (...) { EXEC SQL FETCH NEXT FROM foo INTO :v1, :v2; ... }

4.11.8

Prcompilation et compilation

Inclusion de chiers Pour inclure un chier externe SQL embarqu dans votre programme, utilisez la commande : EXEC SQL INCLUDE nom_fichier; Cette commande indique au prprocesseur du SQL embarqu de chercher un chier nomm nom_fichier.h, de traiter et de linclure dans le chier C gnr. Du coup, les instructions SQL embarqu du chier inclus sont gres correctement. En utilisant la directive classique #include <nom_fichier.h> le chier nom_fichier.h ne serait pas sujet au pr-traitement des commandes SQL. Naturellement, vous pouvez continuer utiliser la directive #include pour inclure dautres chiers den-tte. Prcompilation et compilation La premire tape consiste traduire les sections SQL embarqu en code source C, cest--dire en appels de fonctions de la librairie libecpg. Cette tape est assure par le prprocesseur appel ecpg qui est inclus dans une installation standard de PostgreSQL. Les programmes SQL embarqu sont nomms typiquement avec une extension .pgc. Si vous avez un chier programme nomm prog.pgc, vous pouvez le passer au prprocesseur par la simple commande : ecpg prog1.pgc Cette tape permet de crer le chier prog.c. Si vos chiers en entre ne suivent pas le modle de nommage suggr, vous pouvez spcier le chier de sortie explicitement en utilisant loption -o. Le chier trait par le prprocesseur peut alors tre compil de faon classique, par exemple : cc -c prog.c

4.11. SQL INTGR {S10}

109

Cette tape permet de crer le chier prog.o. Les chiers sources en C gnrs incluent les chiers dentte provenant de linstallation de PostgreSQL. Si vous avez install PostgreSQL un emplacement qui nest pas parcouru par dfaut, vous devez ajouter une option comme -I/usr/local/pgsql/include sur la ligne de commande de la compilation. Vous devez enn lier le programme avec la bibliothque libecpg qui contient les fonctions ncessaires. Ces fonctions rcuprent linformation provenant des arguments, excutent la commande SQL en utilisant linterface libpq et placent le rsultat dans les arguments spcis pour la sortie. Pour lier un programme SQL embarqu, vous devez donc inclure la bibliothque libecpg : cc -o monprog prog.o -lecpg De nouveau, vous pourriez avoir besoin dajouter une option comme -L/usr/local/pgsql/lib sur la ligne de commande.

4.11.9

Exemple complet

Voici un exemple complet qui eectue les oprations suivantes : connexion la base ; vrication de la russite de la connexion ; achage du contenu de la table individu en utilisant un curseur ; fermeture de la connexion. #include <stdio.h> // ____ pour grer les erreurs EXEC SQL INCLUDE sqlca; // ____ Dfinition des variables htes EXEC SQL BEGIN DECLARE SECTION; char var_nom[256]; char var_prenom[256]; int var_num; EXEC SQL END DECLARE SECTION; int main(void){ // ____ Ouverture de la connexion la base de donnes EXEC SQL CONNECT TO nom_base@aquanux; if(sqlca.sqlcode) { printf("erreur %s\n",sqlca.sqlerrm.sqlerrmc); exit(0); } printf(" connexion russie \n"); // ____ Utilisation dun curseur pour afficher le contenu de la table individu EXEC SQL DECLARE curseur_individu CURSOR FOR SELECT num_individu, nom, prenom FROM individu; EXEC SQL OPEN curseur_individu; // Boucle daffichage while(SQLCODE==0) { EXEC SQL FETCH FROM curseur_individu INTO :var_num, :var_nom, :var_prenom; printf("Li-ndividu %d est %s %s\n", var_num, var_prenom, var_nom); } EXEC SQL CLOSE curseur_individu; // ____ Fermeture de connexion printf(" Dconnexion \n"); EXEC SQL DISCONNECT; return 0; }

110

CHAPITRE 4. LANGAGE SQL

En supposant que ce programme est enregistr dans un chier nomm prog.pgc, lexcutable est obtenu de la manire suivante : ecpg prog.pgc cc -c prog.c cc -o prog prog.o -lecpg

Chapitre 5

Corrections

111

112

CHAPITRE 5. CORRECTIONS

Bibliographie
Akoka, J. & Comyn-Wattiau, I. (2001). Conception des bases de donnes relationnelles. Vuibert informatique. Articles en ligne sur Developpez.com. (2005a). LE SQL de A Z : Le simple ( ?) SELECT et les fonctions SQL. (http :// sql.developpez.com/ sqlaz/ select). Articles en ligne sur Developpez.com. (2005b). LE SQL de A Z : Les jointures, ou comment interroger plusieurs tables. (http :// sql.developpez.com/ sqlaz/ jointures). Banos, D. & Mouyssinat, M. (1990). De merise aux bases de donnes. Eyrolles. Bourda, Y. (2005a). Le langage SQL. (http :// wwwlsi.supelec.fr/ www/ yb/ poly_bd/ sql/ tdm_sql.html). Bourda, Y. (2005b). Systmes de Gestion de Bases de Donnes Relationnelles. (http :// wwwlsi.supelec.fr/ www/ yb/ poly_bd/ poly.html). Chen, P. (1976, March). The Entity-Relationship Model : Toward a Unied View of Data. ACM Transactions on Database Systems, 1(1), 936. Codd, E. F. (1970, June). A Relational Model of Data for Large Shared Data Banks. Communications of the ACM, 377387. Crescenzo, P. (2005). Un support de cours magistraux de Bases de donnes. (http :// www.crescenzo.nom.fr/ CMBasesDeDonnees). Date, C. (2000). Introduction aux bases de donnes. Vuibert. Delisle, P. (2002). 8inf224 - informatique, planication et contrle. Support de cours. ((http :// wwwens.uqac.ca/ ~pdelisle/ 8inf224/)) Dionisi, D. (1993). Lessentiel sur merise. Eyrolles. Encyclopdie Wikipdia. (2005). Articles en ligne sur Wikipdia. (http ://fr.wikipedia.org). Gabillaud, J. (2004). SQL et algbre relationnelle - Notions de base. ENI. Godin, R. (2000a). Systmes de gestion de bases de donnes (Vol. 2). Loze-Dion. Godin, R. (2000b). Systmes de gestion de bases de donnes (Vol. 1). Loze-Dion. Gruau, C. (2006). Conception dune base de donnes. (http :// cyril-gruau.developpez.com/ uml/ tutoriel/ ConceptionBD/). Guzlou, P. (2006). Modlisation des donnes : Approche pour la conception des bases des donnes. (http ://philippe.guezelou.free.fr /mcd /mcd.htm). Hernandez, M. J. & Viescas, J. L. (2001). Introduction aux requtes SQL. Eyrolles. Kauman, J., Matsik, B. & Spencer, K. (2001). Matrisez SQL (Wrox Press, Ed.). CampusPress.

113

114

Bibliographie

Labb, C. (2002). Modliser les donnes. Pratiko. Marre, D. (1996, January). Introduction aux systmes de gestion de bases de donnes. Support de cours. Petrucci, L. (2006). Base de donnes. Prsentation projette et travaux dirigs. (IUT GTR Villetaneuse) Saglio, J.-M. (2002). dombd.html). Dominante informatique : Module bases de donnes. (http :// www.bd.enst.fr/

SQL Anywhere Studio. (2005a). ASA - Guide de programmation : Programmation avec Embedded SQL. (http :// www.ianywhere.com/ developer/ product_manuals/ sqlanywhere/ 0901/ fr/ html/ dbpgfr9/ 00000171.htm). SQL Anywhere Studio. (2005b). ASA - Guide de programmation : Utilisation de SQL dans les applications. (http :// www.ianywhere.com/ developer/ product_manuals/ sqlanywhere/ 0901/ fr/ html/ dbpgfr9/ 00000018.htm). Szulman, S. (2005). Base de donnes et SGBD. Prsentation projette. The PostgreSQL Global Development Group. (2005). Documentation PostgreSQL 7.4.7. (http :// traduc.postgresqlfr.org/ pgsql-fr/ index.html).

Vous aimerez peut-être aussi