You are on page 1of 88

Base de Donnes et Langage SQL

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 fiables permet aux organisations de toutes tailles de grer des donnes efficacement, 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. Cependant, il est difficile de modliser un domaine directement sous une forme base de donnes relationnelle. Une modlisation intermdiaire est gnralement indispensable. Le modle entits-associations permet une description naturelle du monde rel partir des concepts dentit et dassociation. Aprs une courte introduction (chapitre 1), nous prsenterons et utiliserons le modle entitsassociations pour aborder le problme de la conception des bases de donnes (chapitre 2). Nous dcrivons ensuite le modle relationnel, le passage du modle entits-associations au modle relationnel et enfin 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 dfinition de donnes et celles du langage de manipulation de donnes. Cette premire bauche de cours est parue dans sa version finalise, largement augmente et corrige, chez Ellipses collection Info+ sous le titre Base de donnes et langage SQL : cours et atelier. Ce support a t ralis en utilisant les ouvrages cits en bibliographie.

Table des matires

Chapitre 1 Introduction aux bases de donnes o 1.1 Quest-ce quune base de donnes ? 1.1.1 Notion de base de donnes 1.1.2 Modle de base de donnes o 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 Chapitre 2 Conception des bases de donnes (modle E-A) o 2.1 Introduction 2.1.1 Pourquoi une modlisation pralable ? 2.1.2 Merise o 2.2 lments constitutifs du modle entits-associations 2.2.1 Entit 2.2.2 Attribut ou proprit, valeur 2.2.3 Identifiant ou cl 2.2.4 Association ou relation 2.2.5 Cardinalit o 2.3 Complments sur les associations 2.3.1 Associations plurielles 2.3.2 Association rflexive 2.3.3 Association n-aire (n>2) o 2.4 Rgles de bonne formation dun modle entits-associations 2.4.1 Rgles portant sur les noms 2.4.2 Rgles de normalisation des attributs 2.4.3 Rgles de fusion/suppression dentits/associations 2.4.4 Normalisation des type-entits et type-associations o 2.5 laboration dun modle entits-associations 2.5.1 tapes de conceptions dun modle entits-associations 2.5.2 Conseils divers Chapitre 3 Bases de donnes relationnelles o 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 o 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 o 3.3 Algbre relationnelle 3.3.1 Introduction 3.3.2 Slection 3.3.3 Projection 3.3.4 Union 3.3.5 Intersection 3.3.6 Diffrence 3.3.7 Produit cartsien

3.3.8 Jointure, theta-jointure, equi-jointure, jointure naturelle 3.3.9 Division Chapitre 4 Langage SQL o 4.1 Introduction 4.1.1 Prsentation gnrale 4.1.2 Catgories dinstructions 4.1.3 PostgreSQL o 4.2 Dfinir une base Langage de dfinition 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 Modifier une table : ALTER TABLE o 4.3 Modifier une base Langage de manipulation de donnes (LMD) 4.3.1 Insertion de n-uplets : INSERT INTO 4.3.2 Modification de n-uplets : UPDATE 4.3.3 Suppression de n-uplets : DELETE re o 4.4 Interroger une base (LMD) : SELECT (1 partie) 4.4.1 Introduction la commande SELECT re 4.4.2 Traduction des oprateurs de lalgbre relationnelle (1 partie) 4.4.3 Syntaxe gnrale de la commande SELECT 4.4.4 La clause SELECT re 4.4.5 La clause FROM (1 partie) 4.4.6 La clause ORDER BY 4.4.7 La clause WHERE 4.4.8 Les expressions rgulires me o 4.5 Interroger une base (LMD) : SELECT (2 partie) me 4.5.1 La clause FROM (2 partie) : les jointures 4.5.2 Les clauses GROUP BY et HAVING et les fonctions dagrgation 4.5.3 Oprateurs ensemblistes : UNION, INTERSECT et EXCEPT me 4.5.4 Traduction des oprateurs de lalgbre relationnelle (2 partie) o 4.6 Nouveaux objets Langage de dfinition de donnes (LDD) 4.6.1 Squences (CREATE SEQUENCE) et type SERIAL 4.6.2 Rgles (CREATE RULE) 4.6.3 Vues (CREATE VIEW) 4.6.4 Schmas (CREATE SCHEMA) o 4.7 SQL intgr 4.7.1 Introduction 4.7.2 Connexion au serveur de bases de donnes 4.7.3 Excuter des commandes SQL 4.7.4 Les variables htes 4.7.5 Variables indicateur 4.7.6 Gestion des erreurs 4.7.7 Curseurs pour rsultats lignes multiples 4.7.8 Prcompilation et compilation 4.7.9 Exemple complet

Chapitre 1 Introduction aux bases de donnes


1.1 Quest-ce quune base de donnes ?
1.1.1 Notion de base de donnes
Description gnrale Il est difficile de donner une dfinition exacte de la notion de base de donnes. Une dfinition trs gnrale pourrait tre : Dfinition 1 -Base de donnes- Un ensemble organis dinformations avec un objectif commun.

Peu importe le support utilis pour rassembler et stocker les donnes (papier, fichiers, etc.), ds lors que des donnes sont rassembles et stockes dune manire organise dans un but spcifique, 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 afin 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 Dfinition 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 dfinir 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 spcifie, on peut y insrer des donnes, les rcuprer, les modifier et les dtruire. Cest ce quon appelle manipuler les donnes. Les donnes peuvent tre manipules non seulement par un Langage spcifique de Manipulation des Donnes (LMD) mais aussi par des langages de programmation classiques. 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 spcifiques, notamment pour grer les donnes en mmoire secondaire (i.e. disques durs)2. En effet, 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 vrifie 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 tra-octets 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 diffrents 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 diffrents types de donnes peuvent rendre trs simple la rponse certaines questions, mais trs difficile 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 difficults 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 fin 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 spcifiques des mathmatiques (la thorie des ensembles et la logique des prdicats du premier ordre) pour rsoudre des difficults 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, Codd70 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 efficace 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 cf. section 1.1.2 pour une prsentation gnrale de plusieurs modles de donnes. Le modle entitsassociations est prsent dans la section 2 et le modle relationnel dans la section 3.1 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)


1.2.1 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 modification 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 diffrents. 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 fixs aux SGBD ds lorigine de ceux-ci et ce, afin de rsoudre les problmes causs par la dmarche classique. Ces objectifs sont les suivants : Indpendance physique : La faon dont les donnes sont dfinies doit tre indpendante des structures de stockage utilises. Indpendance logique : Un mme ensemble de donnes peut tre vu diffremment par des utilisateurs diffrents. 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 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 effet, des visions diffrentes des donnes (entre autres) se rsolvent plus facilement si les donnes sont administres de faon centralise. Non redondance des donnes : Afin 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 dfinissent un tat cohrent de la base. Elles doivent pouvoir tre exprimes simplement et vrifies automatiquement chaque insertion, modification 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 modifications dans un contexte multi-utilisateurs car il faut : permettre deux (ou plus) utilisateurs de modifier la mme donne en mme temps et assurer un rsultat dinterrogation cohrent pour un utilisateur consultant une table pendant quun autre la modifie. 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 modification, si certains fichiers contenant les donnes deviennent illisibles ? Il faut pouvoir rcuprer une base dans un tat sain . Ainsi, aprs une panne intervenant au milieu dune modification deux solutions sont possibles : soit rcuprer les donnes dans ltat dans lequel elles taient avant la modification, 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 dfinis 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 diffrentes 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 fichiers pour dfinir la politique de stockage ainsi que le placement des donnes. Le niveau physique est donc responsable du choix de lorganisation physique des fichiers 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 ;

MySQL :
http://www.mysql.org/

dans le domaine public ; de Oracle Corporation ;

Oracle :
http://www.oracle.com/

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/

Chapitre 2 Conception des bases de donnes : le modle entits-associations


2.1 Introduction
2.1.1 Pourquoi une modlisation pralable ?
Il est difficile 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 Chen76, 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 spcification 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 quantifier les solutions retenues, de mettre en uvre des techniques doptimisation et enfin de guider jusqu limplmentation. Reconnu comme standard, Merise devient un outil de communication. En effet, Merise russit le compromis difficile entre le souci dune modlisation prcise et formelle, et la capacit doffrir 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 effet, 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 dfinir comment 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 effectus 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). 1 Dans la littrature, on utilise indiffremment 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).

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

Figure 2.1: Reprsentation graphique dun exemple de type-entit. Dfinition 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. Dfinition 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 effet, 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 figure 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 fiscale, ne peuvent pas tre regroups car ils ne partagent leurs proprits (le prnom est une chane de caractres et la puissance fiscale 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

Figure 2.2: Reprsentation graphique dun exemple de type-entit comportant trois attributs Dfinition 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. Dfinition 4 -valeur- Au niveau du type-entit ou du type-association, chaque attribut possde un domaine qui dfinit 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 figure 2.2 montre la reprsentation graphique dun exemple de type-entit (Personne) avec trois attributs. Rgle 5 Un attribut ne peut en aucun cas tre partag par plusieurs type-entits ou type-associations. Rgle 6 Un attribut est une donne lmentaire, ce qui exclut des donnes calcules ou drives. Rgle 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 typeassociation.

2.2.3 Identifiant ou cl

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

Dfinition 8 -identifiant, cl- Un identifiant (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 lidentifiant dun type-entit (respectivement typeassociation) prennent la mme valeur pour deux entits (respectivement deux associations) distinctes. Exemples didentifiant : 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). Rgle 9 Chaque type-entit possde au moins un identifiant, ventuellement form de plusieurs attributs. Ainsi, chaque type-entit possde au moins un attribut qui, sil est seul, est donc forcment lidentifiant. Dans la reprsentation graphique, les attributs qui constituent lidentifiant sont souligns et placs en tte (cf. figure 2.3).

2.2.4 Association ou relation

Figure 2.4: Reprsentation graphique dun exemple de type-association liant deux type-entits. Dfinition 10 -association- Une association (ou une relation) est un lien entre plusieurs entits.

Exemples dassociation : lemprunt par ltudiant Tanidute du 3 me exemplaire du livre Matrisez SQL . Les associations ne sont gnralement pas reprsentes graphiquement. Dfinition 11 -type-association- Un type-associati on (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 dfinis laide dattributs qui prennent leur valeur dans les associations. Rgle 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 figure 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. Dfinition 13 -participant- Les type-entits intervenant dans un type-association sont appels les participants de ce type-association. Dfinition 14 -collection- Lensemble des participants dun type-association est appel la collection de ce type-association. 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 typeassociation ternaire, ). Dfinition 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 identifiant, quil soit explicite ou non. Rgle 16 La concatnation des identifiants des type-entits lis un type-association constitue un identifiant de ce type-association et cet identifiant 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 identifiants des type-entits lis suffit identifier le typeassociation. On admet galement un identifiant plus naturel et explicite, condition quil ne soit quun moyen dexprimer plus simplement cette concatnation.

2.2.5 Cardinalit

Figure 2.5: Reprsentation graphique des cardinalits dun type-association. Dans cet exemple pdagogique, on suppose quun livre ne peut possder quun auteur. Dfinition 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 type-association. 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. figure 2.5). Rgle 18 Lexpression de la cardinalit est obligatoire pour chaque patte dun type-association. Rgle 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 effet, 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. Enfin, une cardinalit maximale de 0 na pas de sens car elle rendrait le type-association inutile. Les seuls cardinalits admises sont donc : 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 justifier 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 effet, 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 diffrence entre une cardinalit minimale de 0 ou de 1. Remarques La seule difficult 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 typeassociations binaires et lendroit pour les n-aires avec n>2. La notion de cardinalit nest pas dfinie 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).

2.3 Complments sur les associations


2.3.1 Associations plurielles

Figure 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 figure 2.6).

2.3.2 Association rflexive

Figure 2.7: Exemple dassociations reflexives 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.

Les type-associations rflexifs sont prsents dans la plupart des modles. Dfinition 20 -Type-association rflexif- Un type-association est qualifi de rflexif quand il matrialise une relation entre un type-entit et lui-mme (cf. figure 2.7). Une occurrence de ce type-association (i.e. une association) associe gnralement une occurrence du typeassociation (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 figure 2.7, ou ne pas ltre, comme le type-association Etre parent sur cette mme figure. 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 figure 2.7. Lambigut pose par la non-symtrie dun type-association rflexif 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 difficiles manipuler et interprter, notamment au niveau des cardinalits. Exemple dassociation n-aire inapproprie

Figure 2.8: Exemple de type-association ternaire inappropri.

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

Figure 2.9: Type-association ternaire de la figure 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 figure 2.9. Dcomposition dune association n-aire

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

nnnnnn Figure 2.11: Transformation du type-association ternaire de la figure 2.10 en un type-entit et trois typeassociations binaires.

La figure 2.10 nous montre un exemple de type-association ternaire entre les type-entits Crneau horaire, Salle et Film. Il est toujours possible de saffranchir 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 identifiant. 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 figure 2.11 illustre le rsultat de cette transformation sur le schma de la figure 2.10. Lavantage du schma de la figure 2.11 est de rendre plus inte lligible 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 figure 2.10 (cf. rgle 27). Ainsi, le mcanisme, que nous venons de dtailler ci-dessus, 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.4.2).

Dtection dune erreur de modlisation par dcomposition dune association n-aire

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

Figure 2.13: Transformation du type-association ternaire de la figure 2.12 en un type-entit et trois typeassociations binaires. N nn Finngure 2.14: Modle de la figure 2.13 corrig au niveau des cardinalits. nnn

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 figure 2.12. La transformation consistant supprimer le type-association ternaire du modle de la figure 2.12 produit le modle de la figure 2.13. Ce modle fait immdiatement apparatre une erreur de conception qui tait jusque l difficile diagnostiquer : gnralement, un vol donn sont affects 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 figure 2.14 o le type-entit Vol ne peut tre transform en un type-association ternaire Vol comme sur la figure 2.12.

2.4 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.4.1 Rgles portant sur les noms


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

Figure 2.15: 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 25 pour plus de prcisions concernant cette erreur de modlisation.

Figure 2.16: 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 effet, que faire si, dans le cadre dune occurrence du type-association Correspondre, la valeurs des deux attributs Adresse de facturation diffrent ?

Figure 2.17: 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.

Lorsque des attributs portent le mme nom, cest parfois le signe dune modlisation inacheve (figure 2.15) ou dune redondance (figure 2.16). Sinon, il faut simplement ajouter au nom de lattribut le nom du typeentit ou du type-association dans lequel il se trouve (figure 2.17). 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 diffrents.

2.4.2 Rgles de normalisation des attributs


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

Figure 2.18: Remplacement des attributs multiples en un type-association et un type-entit et dcomposition des attributs composites.

En effet, les attributs multiples posent rgulirement des problmes dvolutivit du modle. Par exemple, sur le modle de gauche de la figure 2.18, 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 effet difficile dcrire une requte portant sur la ville o habitent les employs si cette information est noye dans un unique attribut Adresse. Rgle 23 Il ne faut jamais ajouter un attribut driv dautres attributs, que ces autres attributs se trouvent dans le mme type-entit ou pas.

Figure 2.19: 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 effet, les attributs drivs induisent un risque dincohrence entre les valeurs des attributs de base et celles des attributs drivs. La figure 2.19 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 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 12), les attributs dun type-association doivent dpendre directement des identifiants de tous les type-entits de la collection du type-association.

Figure 2.20: 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 figure 2.19, lattribut Quantit du type-association Contenir dpend bien la fois de lidentifiant N commande et de N article des type-entits de la collection de Contenir. Inversement, sur cette mme figure, 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. figure 2.20). Rgle 24 Un attribut correspondant un type numr est gnralement avantageusement remplac par un type-entit. Par exemple, sur la figure 2.21, lattribut Type caractrise le type dune mission et peut prendre des valeurs comme : actualit, culturelle, reportage, divertissement, etc. Remplacer cet attribut par un type-entit permet, dune part, daugmenter la cohrence (en saffranchissant, par exemple, des variations du genre culturelle, culture, Culture, ) et dautre part, si les cardinalits le permettent, de pouvoir affecter plusieurs types une mme entit (ex : actualit et culturelle)

Figure 2.21: Un attribut correspondant un type numr est gnralement avantageusement remplac par un type-entit..

2.4.3 Rgles de fusion/suppression dentits/associations

Rgle 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 (figure 2.22).

Figure 2.22: 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 final de la figure 2.23, 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.

Figure 2.23: Il faut factoriser les type-entits quand cest possible, mais lintroduction dun attribut supplmentaire nest pas toujours ncessaire. Remarque : ce diagramme est intentionnellement simplifi outrance. Rgle 26 Il faut factoriser les type-associations quand cest possible. Cette rgles est le pendant pour les type-associations de la rgle 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.

Figure 2.24: Un seul type-association suffit pour remplacer les quatre type-associations Jouer en tant que

La figure 2.24 montre un exemple de multiplication inutile de type-associations. Rgle 27 Un type-entit remplaable par un type-association doit tre remplac. Par exemple, le type-entit Projection de la figure 2.11 page ?? doit tre remplac par le type-association ternaire Projeter pour aboutir au schma de la figure 2.10 page ??. Rgle 28 Lorsque les cardinalits dun type-association sont toutes 1,1 cest que le type-association na pas lieu dtre. Il faut aussi se poser la question de lintrt du type-association quand les cardinalits maximale sont toutes de 1.

Figure 2.25: Lorsque les cardinalits dun type-association sont toutes 1,1 cest quil sagit dun type-

association 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 figure 2.25. 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 figure 2.26.

Figure 2.26: Mme si toutes les cardinalits maximale sont de 1, il vaut mieux conserver le type-association Etre. Rgle 29 Il faut veiller viter les type-associations redondants. En effet, sil existe deux chemins pour se rendre dun type-entit un autre, alors ces deux chemins doivent avoir deux significations ou deux dures de vie distinctes. Dans le cas contraire, il faut supprimer le chemin le plus court puisquil est dductible des autres chemins.

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

Figure 2.28: Solution au problme de la redondance du type-association de la figure 2.27.

Figure 2.29: Dans le modle de la figure 2.27, si un client peut rgler la facture dun autre client, il faut remplacer le type-entit Rglement par un type-association Rgler.

Par exemple, dans le modle reprsent sur la figure 2.27, 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 du modle (cf. figure 2.28). On pourra toujours retrouver le client qui a effectu un rglement en passant par la facture correspondante. Par contre, si un client peut rgler la facture dun autre client, alors cest la rgle 27 quil faut appliquer : on remplace le type-entit Rglement par un type-association Rgler (cf. figure 2.29).

2.4.4 Normalisation des type-entits et type-associations


Introduction Les formes normales sont diffrent stades de qualit qui permettent dviter la redondance, source danomalies. La normalisation peut tre aussi bien effectue 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 n1. 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.4.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 dfinition des dpendances fonctionnelle, multivalue et de jointure. Nous irons alors jusqu la cinquime forme normale.

Premire forme normale (1FN)

Figure 2.30: Exemple de normalisation en premire forme normale. Dfinition 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 figure 2.30) ou faire lobjet dune entit supplmentaire (comme lattribut Occupants sur la figure 2.30. 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 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 deffectuer un regroupement. Deuxime forme normale (2FN)

Figure 2.31: Exemple de normalisation en deuxime forme normale. On suppose quun mme fournisseur peut fournir plusieurs produits et quun mme produit peut tre fourni par diffrents fournisseurs. Dfinition 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 dfinition, forcment en deuxime forme normale. La figure 2.31 montre un type-entit Article dcrivant des produits provenant de diffrents fournisseurs. On suppose quun mme fournisseur peut fournir plusieurs produits et quun mme produit peut tre fourni par diffrents fournisseurs. Dans ce cas, les attributs Produit ou Fournisseur ne peuvent constituer un identifiant du type-entit Article. Par contre, le couple Produit/Fournisseur constitue bien un identifiant 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)

Figure 2.32: Exemple de normalisation en troisime forme normale. Dans cet exemple, lattribut Adresse fournisseur dpend de lattribut Fournisseur. Dfinition 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 figure 2.32. Un type-entit ou un type-association en deuxime forme normale avec au plus un attribut qui nappartient pas la cl est, par dfinition, forcment en troisime forme normale. Forme normale de Boyce-Codd (BCNF)

Figure 2.33: Exemple de normalisation en forme normale de Boyce-Codd. Dfinition 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. figure 2.33), 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 diffrents. 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 suffisante 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.

3 Le code postal en France identifie le bureau distributeur qui achemine le courrier dans une commune. En consquence et daprs cette dfinition, il nexiste pas de relation entre le code postal et le code du dpartement de la commune. Par exemple, 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.

2.5 laboration dun modle entits-associations


2.5.1 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. 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 effet, les attributs ne doivent pas tre redondants. Par exemple, si dans le langage de lentreprise on peut parler indiffremment 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). Identification des type-entits Le reprage dattributs pouvant servir didentifiant permet souvent de reprer un type-entit. Les attributs de ce type-entit sont alors les attributs qui dpendent des attributs pouvant servir didentifiant. 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 didentifiant pour un type-entit, il faut se demander sil ne sagit pas en fait dun type-association. Si ce nest pas le cas, un identifiant arbitraire numrique entier peut faire laffaire.

Identification des type-associations Identifiez les type-associations reliant les type-entits du modle. Le cas chant, leur affecter les attributs correspondant. Il est parfois difficile 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 typeentit 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 typeassociation portent la cardinalit 1,1, il faut se demander si ce type-association et les type-entits lis ne dcrivent pas en fait un seul type-entit (cf. rgle 2.25). Vrification du modle Vrifiez que le modle respecte bien les rgles que nous avons noncs et les dfinitions concernant la normalisation des type-entits et des type-associations. Le cas chant, oprez les modifications ncessaires pour que le modle soit bien form.
Remarque :

pour faciliter la lecture du schma, il est assez courant de ne pas y faire figurer les attributs ou de ne conserver que ceux qui font partie des identifiants. Les attributs cachs doivent alors absolument tre spcifis dans un document part.

2.5.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. Pour les type-association, choisissez un verbe linfinitif, 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 identifiants des type-entits vitez les identifiants composs de plusieurs attributs (comme, par exemple, un identifiant 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 finit gnralement, tt ou tard, par tre dmentie !

vitez les identifiants susceptibles de changer au cours du temps (comme la plaque dimmatriculation dun vhicule). vitez les identifiants du type chane de caractre. En fait, il est souvent prfrable de choisir un identifiant arbitraire de type entier pour les type-entits. Cet identifiant 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 diffrents. Malgr cette inconvnient, cette politique de lidentifiant reste largement avantageuse dans la pratique et permet, en outre, de saffranchir (en la satisfaisant automatiquement) de la deuxime forme normale (cf. section 2.4.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 typeassociation dans le schma entits-associations.

Chapitre 3 Bases de donnes relationnelles


3.1 Introduction au modle relationnel
3.1.1 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 (fichiers 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 confidentialit ; fournir une approche mthodologique dans la construction des schmas.

De faon informelle, on peut dfinir 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 dfini 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


Dfinition 1 une base. -attribut- Un attribut est un identificateur (un nom) dcrivant une information stocke dans

Exemples dattribut : lge dune personne, le nom dune personne, le numro de scurit sociale. Dfinition 2 -Domaine- Le domaine dun attribut est lensemble, fini ou infini, de ses valeurs possibles.

Par exemple, lattribut numro de scurit sociale a pour domaine lensemble des combinaisons de quinze chiffres 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). Dfinition 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. Dfinition 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 Nom Prnom 354338532195874 Durand Caroline 345353545435811 Dubois Jacques 173354684513546 Dupont Lisa 973564213535435 Dubois Rose-Marie Tableau 3.1: Exemple de relation de schma Personne(N scu : Entier, Nom : Chane, Prnom : Chane) Dfinition 5 -degr- Le degr dune relation est son nombre dattributs. Dfinition 6 -occurrence ou n-uplets ou tuples- Une occurrence, ou n-uplets, ou tuples, est un lment de lensemble figur par une relation. Autrement dit, une occurrence est une ligne du tableau qui reprsente la relation. Dfinition 7 -cardinalit- La cardinalit dune relation est son nombre doccurrences. Dfinition 8 -cl candidate- Une cl candidate dune relation est un ensemble minimal des attributs de la relation dont les valeurs identifient 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 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 fin. Dfinition 10 -cl primaire- La cl primaire dune relation est une de ses cls candidates. Pour signaler la cl primaire, ses attributs sont gnralement souligns. Dfinition 11 -cl trangre- Une cl trangre dans une relation est forme dun ou plusieurs attributs qui constituent une cl primaire dans une autre relation. Dfinition 12 -schma relationnel- Un schma relationnel est constitu par lensemble des schmas de relation. Dfinition 13 -base de donnes relationnelle- Une base de donnes relationnelle est constitue par lensemble des n-uplets des diffrentes relations du schma relationnel.

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 effectue avant le passage au modle relationnel (cf. section 2.4.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. Lidentifiant 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. Lidentifiant, sil est prcis, est conserv en tant que cl de la relation, sinon cette cl est forme par la concatnation des identifiants 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 effet 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) lidentifiant de lautre type-entit. Cas particulier dun type-assocuation du type 1 vers 1

Figure 3.1: Reprise de lexemple de la figure 2.26 dun type-association Etre o toutes les cardinalits maximales sont de 1.

Dans lexemple de la figure 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 ci-dessus 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 NumCandidat 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 figure 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. 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.

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

Par exemple, le type-entit Date de la figure 3.2 ne doit pas se traduire par une relation. Le schma relationnel adquat correspondant au modle entits-associations de la figure 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

Figure 3.3: Exemple trs simplifi de modlisation entits-associations

Comme exemple dapplication, voici les relations dduites du schma entits-associations de la figure 3.3 :

Patient(Num-Patient, Nom-Patient, Num-Mutuelle) Mutuelle(Num-Mutuelle, Nom-Mutuelle) Mdecin(Num-Mdecin, Nom-Mdecin, Prnom-Mdecin) Affection(Num-Affection, Nom-Affection) Hospitaliser(Num-Patient, Num-Affection, Num-Mdecin, Date-Entre, Chambre, DureHospitalisation)

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).

3.2 Normalisation
3.2.1 Introduction
Les formes normales sont diffrents stades de qualit qui permettent dviter la redondance dans les bases de donnes relationnelles afin dviter ou de limiter : les pertes de donnes, les incohrences au sein des donnes, leffondrement des performances des traitements. Le processus de normalisation consiste remplacer une relation donne par certaines projections afin 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 dfinies dans les sections 3.3.3 et 3.3.8. Il existe une hirarchie dans les rgles de normalisation : une relation en 5 me forme normale est forcment en 4 me forme normale, une relation en 4 me forme normale est forcment en forme normale de BoyceCodd, 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 effectue, et cest prfrable, pendant la phase de conception sur le modle entits-associations (cf. section 2.4.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 vrifier 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, vrifier 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.4.4 dans le cadre du modle entits-associations, 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 spcifies dans la dfinition de la base de donnes afin 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 dfinir les premires formes normales jusqu la forme normale de Boyce-Codd (1FN, 2FN, 3FN et BCNF). La dpendance multivalue permet de dfinir la quatrime forme normale (4FN) et la dpendance de jointure la cinquime forme normale (5FN).

3.2.2 Dpendance fonctionnelle (DF)


Dfinition 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. Dfinition 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. Autrement dit, une dpendance fonctionnelle est lmentaire si la cible est un attribut unique et si la source ne comporte pas dattributs superflus. La question sur llmentarit dune dpendance fonctionnelle ne doit donc se poser que lorsque la partie gauche de la dpendance fonctionnelle comporte plusieurs attributs. Dfinition 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 signifie 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 Dfinition 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 dfinition 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 Dfinition 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. 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 dfinition, forcment en deuxime forme normale.

3.2.4 Troisime forme normale


Dfinition 19 -Troisime forme normale (3FN)- Une relation est en troisime forme normale si, et seulement si elle est en deuxime forme normale et tout attribut nappartenant pas la cl nest pas en dpendance fonctionnelle directe avec un ensemble dattributs 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 dfinition, forcment en troisime forme normale.

3.2.5 Forme normale de BOYCE-CODD


Dfinition 20 -forme normale de BOYCE-CODD (BCNF)- Une relation est en forme normale de BoyceCodd (BCNF) si, et seulement si, les seules dpendances fonctionnelles lmentaires sont celles dans lesquelles une cl dtermine un attribut non-cl. Cette forme normale permet de renforcer certaines lacunes de la troisime forme normale. 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 : quatrime et cinquime forme normale


Dpendance multivalue (DM) Dfinition 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 sousensembles (i.e. une affectation 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 Y X Ai(X Y). Comme illustration, supposons une situation o un employ dun garage est qualifi pour effectuer un certain type dintervention sur certaines marques de voiture. Cette situation est modlise par le schma relationnel suivant :

Employ(Nom-Employ) Intervention(Type-Intervetion) Constructeur(Marque) Intervenir(Nom-Employ, Type-Intervetion, Marque)

Supposons maintenant quun employ qui effectue un ensemble de types dinterventions pour un ensemble de marques de voiture, est capable deffectuer chacun de ces types dinterventions sur chacune de ces marques de voitures. Dans ce cas, il existe des dpendances multivalues dans la relation Intervenir : NomEmploy Type-Intervetion et Nom-Employ Marque. Quatrime forme normale Dfinition 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 Type-Intervetion Marque Tussier Dpannage Peugeot Tussier Dpannage Citron Martin lectricit Citron Martin lectricit Renault

Martin Martin Piquard Piquard Piquard Piquard Piquard Piquard

Mcanique Mcanique Carrosserie Carrosserie Alarme Alarme lectricit lectricit

Citron Renault Fiat Ford Fiat Ford Fiat Ford

Tableau 3.2: 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.2 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 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 dfinies plus loin (cf. section 3.3). Dfinition 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 Dfinition 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) Dfinition 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 superflu de dcomposer de ce point de vue. Cette forme normale est finale 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 effectuant 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 Tableau 3.3: Exemple de relation ntant pas en cinquime forme normale.

Prenons, comme illustration2, la relation Fournisseur (table 3.3) 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 conflit dintrt. Un fournisseur fournit un certain nombre darticles (par exemple f1 fournit a1 et a2). Le mme article peut tre fourni par plusieurs fournisseurs (par exemple a1 est fourni par f1 et f2). Un fournisseur peut tre attitr plusieurs organismes (par exemple f1 est attitr o1 et o2). Un organisme peut avoir plusieurs fournisseurs (par exemple o1 est servi par f1 et f2). 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 f1 fournit a1), le fournisseur est attitr lorganisme (comme f1 est attitr o1), et lorganisme utilise un article (comme o1 utilise a1), alors ncessairement, le fournisseur fournit larticle lorganisme (f1 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 f1 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 f1 est attitr o1 est aussi rpt deux reprises. Il en est de mme pour o1 qui utilise a1. La relation Fournisseur souffre 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.4).

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

Tableau 3.4: Dcomposition de la relation Fournisseur (table 3.3) 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 suffit 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 finale (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.

2 Exemple tir de [15].

3.3 Algbre relationnelle


3.3.1 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 Diffrence) : 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.3.2 Slection
Dfinition 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.6 montre un exemple de slection.

Numro Nom Prnom 5 Durand Caroline 1 Germain Stan 12 Dupont Lisa 3 Germain Rose-Marie Tableau 3.5: Exemple de relation Personne

Numro Nom Prnom 5 Durand Caroline 12 Dupont Lisa Tableau 3.6: Exemple de slection sur la relation Personne du tableau 3.5 : (Numro5)Personne

3.3.3 Projection
Dfinition 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 : 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.7 montre un exemple de slection.

Nom Durand Germain Dupont Tableau 3.7: Exemple de projection sur la relation Personne du tableau 3.5 : (Nom)Personne

3.3.4 Union
Dfinition 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.8 montre un exemple dunion.

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

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

Tableau 3.8: Exemple dunion : R = R1 R2

3.3.5 Intersection
Dfinition 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.9 montre un exemple dintersection.

Relation R1 Nom Prnom

Relation R2 Nom Prnom Dupont Lisa Juny Fourt Carole Lisa

Relation R Nom Prnom Durand Caroline Dupont Lisa Juny Carole

Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Juny Carole

Durand Caroline

Tableau 3.9: Exemple dintersection : R = R1 R2

3.3.6 Diffrence
Dfinition 30 -diffrence- La diffrence 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 diffrence est une nouvelle relation qui a les mmes attributs que R1 et R2. Si R1 est vide, la relation qui rsulte de la diffrence est vide. Si R2 est vide, la relation qui rsulte de la diffrence est identique R1. Le tableau 3.10 montre un exemple de diffrence.

Relation R1 Nom Prnom

Relation R2 Nom Prnom

Relation R Nom Prnom

Durand Caroline Germain Stan Dupont Lisa Germain Rose-Marie Juny Carole

Dupont Lisa Juny Fourt Carole Lisa

Germain Stan Germain Rose-Marie

Durand Caroline

Tableau 3.10: Exemple de diffrence : R = R1 R2

3.3.7 Produit cartsien


Dfinition 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.11 montre un exemple de produit cartsien.

Relation Amie Nom Prnom Fourt Lisa Juny Carole

Relation Cadeau Article livre poupe montre Prix 45 25 87

Relation R Nom Prnom Article Prix Fourt Lisa Fourt Lisa Fourt Lisa Juny Carole Juny Carole livre 45

poupe 25 montre 87 livre 45

poupe 25

Juny Carole

montre 87

Tableau 3.11: Exemple de produit cartsien : R = Amie Cadeau

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


Jointure Dfinition 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.12 montre un exemple de jointure.

Relation Famille Nom Prnom Age Fourt Lisa Juny Carole Fidus Laure 6 42 16

Relation Cadeau AgeC 99 6 20 10 Article livre poupe baladeur Prix 30 60 45

Relation R Nom Prnom Age AgeC Fourt Lisa Fourt Lisa Fourt Lisa Juny Carole Fidus Laure Fidus Laure 6 6 6 42 16 16 99 20 10 99 99 20 Article livre baladeur Prix 30 45

dguisement 15 livre livre baladeur 30 30 45

dguisement 15

Tableau 3.12: Exemple de jointure : R = Famille ((Age AgeC) (Prix < 50)) Cadeau

Theta-jointure Dfinition 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 thetajointure est note R1 E R2. Equi-jointure Dfinition 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. Remarque : Il vaut mieux crire R1 A1=A2 R2 que R1 A1,A2 R2 car cette dernire notation peut prter confusion avec une jointure naturelle explicite. Jointure naturelle Dfinition 35 -jointure naturelle- Une jointure naturelle est une jointure dans laquelle lexpression logique E est un test dgalit entre les attributs qui portent le mme nom dans les relations R1 et R2. Dans la relation construite, ces attributs ne sont pas dupliqus mais fusionns en une seul colonne par couple dattributs. La jointure naturelle est note R1 R2. On peut prciser explicitement les attributs communs R1 et R2 sur lesquels porte la jointure : R1 A1, , An R2. Gnralement, R1 et R2 nont quun attribut en commun. Dans ce cas, une jointure naturelle est quivalente une equi-jointure dans laquelle lattribut de R1 et celui de R2 sont justement les deux attributs qui portent le mme nom. Lorsque lon dsire effectuer une jointure naturelle entre R1 et R2 sur un attribut A1 commun R1 et R2, il vaut mieux crire R1 A1 R2 que R1 R2. En effet, si R1 et R2 possdent deux attributs portant un nom commun, A1 et A2, R1 A1 R2 est bien une jointure naturelle sur lattribut A1, mais R1 R2 est une jointure naturelle sur le couple dattributs A1, A2, ce qui produit un rsultat trs diffrent ! Le tableau 3.13 montre un exemple de jointure naturelle.

Relation Famille Nom Prnom Age Fourt Juny Fidus Lisa Carole Laure 6 40 20 6

Relation Cadeau Age Article Prix 40 6 20 livre 45

Relation R Nom Prnom Age Article Prix Fourt Juny Fidus Lisa Carole Laure 6 40 20 6 poupe 25 livre 45

poupe 25 montre 87

montre 87 poupe 25

Choupy Emma

Choupy Emma

Tableau 3.13: Exemple de jointure naturelle : R = Famille Cadeau ou R = Famille Age Cadeau

3.3.9 Division
Dfinition 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.14 montre un exemple de division.

Relation Enseignement Enseignant Etudiant Germain Fidus Robert Germain Fidus Germain Robert Dubois Pascal Dubois Pascal Dubois Durand Durand

Relation Etudiant Nom Dubois Pascal

Relation R Enseignant Germain Fidus

Tableau 3.14: 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.

Chapitre 4 Langage SQL


4.1 Introduction
4.1.1 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 dfinie 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 affectations. 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 diffrents 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 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 diffrences 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 Standard SQL Relation Relation Table Domaine Domain Domaine Attribut Attribute Colonne n-uplet tuple Ligne Cl primaire Primary key 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 dfinition des lments dune base de donnes (tables, colonnes, clefs, index, contraintes, ),

2. 3. 4. 5.

la manipulation des donnes (insertion, suppression, modification, extraction, ), la gestion des droits daccs aux donnes (acquisition et rvocation des droits), la gestion des transactions, et enfin le SQL intgr.

Langage de dfinition de donnes Le langage de dfinition de donnes (LDD, ou Data Definition Language, soit DDL en anglais) est un langage orient au niveau de la structure de la base de donnes. Le LDD permet de crer, modifier, supprimer des objets. Il permet galement de dfinir le domaine des donnes (nombre, chane de caractres, date, boolen, ) et dajouter des contraintes de valeur sur les donnes. Il permet enfin 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 modification 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. 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 modifications faites par le LMD, cest--dire les caractristiques des transactions et la validation et lannulation des modifications. 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) offrent un modle de donnes compos dune collection de relations contenant des attributs relevant chacun dun type spcifique. 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 afin 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.

4.2 Dfinir une base Langage de dfinition de donnes (LDD)


4.2.1 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 dfinis 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 diffrents 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 table (ou 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 dfini. 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 vrifier lunicit et le caractre dfini (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 qualifies 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 vrifier 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 vrifier 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) ;
TABLE

4.2.2 Crer une table : CREATE


Introduction

Une table est un ensemble de lignes et de colonnes. La cration consiste dfinir (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). 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 dfinir 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 chiffres significatifs cods sur 4 octets. DOUBLE PRECISION : Ce type permet de stocker des rels comportant 15 chiffres significatifs 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 chiffres significatifs. longueur prcise le nombre maximum de chiffres significatifs stocks et prcision donne le nombre maximum de chiffres aprs la virgule. CHAR(longueur) : Ce type de donnes permet de stocker des chanes de caractres de longueur fixe. 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.4 et 4.5). Si les types des colonnes ne sont pas spcifis, 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.5.2 et 4.4.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 :
CREATE TABLE nom_table ( nom_col_1 type_1 [CONSTRAINT [CONSTRAINT ... [CONSTRAINT nom_col_2 type_2 [CONSTRAINT [CONSTRAINT ... nom_1_1] contrainte_de_colonne_1_1 nom_1_2] contrainte_de_colonne_1_2 ... nom_1_m] contrainte_de_colonne_2_m, nom_2_1] contrainte_de_colonne_2_1 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 diffrentes 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 dfinition 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 dfinition. 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 spcifie. CHECK (condition) : Vrifie lors de linsertion de n-uplets que lattribut ralise la condition condition. DEFAULT valeur : Permet de spcifier la valeur par dfaut de lattribut. Contraintes de table Les diffrentes 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 dfinition. Les valeurs prises par ces attributs doivent exister dans lensemble dattributs spcifi et possder une contrainte PRIMARY KEY ou UNIQUE dans la table table. 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 dfinies. Il nest pas possible de dfinir 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). Complment sur les contraintes
ON DELETE CASCADE

: Demande la suppression des n-uplets dpendants, dans la table en cours de dfinition, quand le nuplet 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 spcifiant 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 Modifier une table : ALTER


Ajout ou modification de colonne

TABLE

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 vrifier 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 Modifier une base Langage de manipulation de donnes (LMD)


4.3.1 Insertion de n-uplets : INSERT
INTO

La commande INSERT permet dinsrer une ligne dans une table en spcifiant les valeurs insrer. La syntaxe est la suivante :
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 spcifie, les colonnes ne figurant 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.4 et 4.5) peut contenir nimporte quelle clause sauf un ORDER BY (cf. section 4.4.6).

4.3.2 Modification de n-uplets : UPDATE


La commande UPDATE permet de modifier 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 modifies 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 Interroger une base Langage de manipulation de donnes (LMD) : SELECT (1 re partie)
4.4.1 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, diffrence et division) ; combiner entre elles ces diffrentes 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 simplifie 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 spcifier 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 spcifie 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 afficher 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.4.2). Dlimiteurs : apostrophes simples et doubles Pour spcifier littralement une chane de caractres, il faut lentourer dapostrophes (i.e. guillemets simples). Par exemple, pour slectionner les films 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.4.2 Traduction des oprateurs de projection, slection, produit cartsien et qui-jointure de lalgbre relationnelle (1 re 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

permet de ne retenir quune occurrence de n-uplet dans le cas o une requte produit plusieurs nuplets identiques (cf. section 4.4.4).
DISTINCT

Traduction de loprateur de slection Loprateur de slection (prdicat)(relation) se traduit tout simplement en SQL par la requte :
SELECT * FROM relation WHERE prdicat

De manire simplifie, un prdicat est une expression logique sur des comparaisons. Reportez-vous la section 4.4.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.4.5 et 4.5.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 diffrents types de jointure dans la section 4.5.1.

4.4.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 spcifier les attributs que lon dsire voir apparatre dans le rsultat de la requte (cf. section 4.4.4).

FROM

Cette clause spcifie les tables sur lesquelles porte la requte (cf. section 4.4.5 et 4.5.1). WHERE : Cette clause permet de filtrer les n-uplets en imposant une condition remplir pour quils soient prsents dans le rsultat de la requte (cf. section 4.4.7). GROUP BY :

Cette clause permet de dfinir des groupes (i.e. sous-ensemble ; cf. section 4.5.2). HAVING : Cette clause permet de spcifier un filtre (condition de regroupement des n-uplets) portant sur les rsultats (cf. section 4.5.2). UNION, INTERSECT et EXCEPT : Cette clause permet deffectuer des oprations ensemblistes entre plusieurs rsultats de requte (i.e. entre plusieurs SELECT) (cf. section 4.5.3). ORDER BY : Cette clause permet de trier les n-uplets du rsultat (cf. section 4.4.6).

4.4.4 La clause SELECT


Introduction Comme nous lavons dj dit, la clause SELECT permet de spcifier 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 effet, 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 lidentifiant, 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 afficher 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 afficher 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 afficher 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 afficher 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 afficher 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.4.5 La clause FROM (1 re partie)


Comportement Comme nous lavons dj dit, la clause FROM spcifie 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 modifications seront apportes par les clauses SELECT, WHERE, GROUP BY et HAVING pour gnrer la table finale 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) afin 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 simplifier 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, spcifie 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.5.1.

4.4.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.4.4 sur La clause SELECT ) sur les colonnes. spcifie lordre ascendant et DESC lordre descendant du tri. En labsence de prcision ASC ou DESC, cest lordre ascendant qui est utilis par dfaut.
ASC

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 final de la requte, il ne faut donc placer dans cette clause que les noms des colonnes mentionns dans la clause SELECT. La clause ORDER BY permet de trier le rsultat final de la requte, elle est donc la dernire clause de tout ordre SQL et ne doit figurer quune seule fois dans le SELECT, mme sil existe des requtes imbriques ou un jeu de requtes ensemblistes (cf. section 4.5.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 suffit tablir un tri puisque le SGBD doit se livrer une comparaison des lignes, mais ce mcanisme nest pas garanti car ce tri seffectue dans un ordre non contrlable qui peut varier dun serveur lautre.

4.4.7 La clause WHERE


Comportement Comme nous lavons dj dit, la clause WHERE permet de filtrer 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 afin de vrifier 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 vrifier 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, spcifie 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 != diffrent < 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
~ =

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.4.8 donne une description dtaille du formalisme des expressions rgulires. Un prdicat simple peut enfin correspondre lun des tests suivants : test sur lindtermination de expr expr IN (expr_1 [, ...]) comparaison de expr une liste de valeurs expr NOT IN (expr_1 [, ...]) test dabsence dune liste de valeurs expr IN (requte) mme chose, mais la liste de valeurs est le rsultat dune expr NOT IN (requte) 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
expr IS NULL

vraie si au moins un n-uplet de la sous-requte vrifie 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 vrifient la expr operateur ALL (requte) comparaison expr oprateur n-uplet ; la sous-requte doit imprativement retourner une table ne contenant quune colonne 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.4.8 Les expressions rgulires


Introduction Le terme expression rgulire est issu de la thorie informatique et fait rfrence un ensemble de rgles permettant de dfinir un ensemble de chanes de caractres. Une expression rgulire constitue donc une manire compacte de dfinir 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 dfini 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 diffrent 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 !~*. Formalisme Comme nous allons le voir, dans une expression rgulire, certains symboles ont une signification 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 signification 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 mtacaractres perdent leur signification 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, enfin un se place la fin 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-9AZa-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 fin 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 souschanes 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 chiffre, est une expression rgulire qui dcrit la sous-chane dcrite par la n me 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 signifie 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 fin de ligne. Ainsi : 'voiture$' permet de trouver toutes les chanes finissant 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. Vous pouvez aussi dfinir 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 spcifier un intervalle de caractres, servez-vous dun trait dunion pour dlimiter le dbut et la fin de lintervalle. Vous pouvez aussi dfinir 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 dfinir 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 prfixer par un \. Pour trouver toutes les lignes qui contiennent le symbole $, utilisez : \$

4.5 Interroger une base Langage de manipulation de donnes (LMD) : SELECT (2 me partie)
4.5.1 La clause FROM (2 me partie) : les jointures
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 effectuer une jointure. En effet, 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. Enfin, lorsque lon utilise lancienne syntaxe, la suppression de la clause WHERE des fins 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.3.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.4.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. 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 diffrent par la condition de jointure spcifie 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.4.7. USING : La clause USING est une notation correspondant un cas particulier de la clause ON qui, de plus supprime les colonnes superflues. 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 spcifie 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 spcifies 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 effet, 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 effectue. Ensuite, chacune des lignes de la table table_1 qui ne satisfait 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 affects 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) afin 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.5.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 afin de prciser lordre dans lequel elles sont effectues. En labsence de parenthses, les jointures seffectuent de gauche droite. Dfinition de deux tables pour les exemples qui suivent Afin dillustrer les oprations de jointure, considrons les tables realisateur et film dfinies 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 dfini de la manire suivante : id_real integer references realisateur. Nous ne lavons pas fait dans le but dintroduire des films dont le ralisateur nexiste pas dans la table realisateur afin dillustrer les diffrentes 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 indiffremment 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 effectuer une qui-jointure en crivant :


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 films dont le ralisateur napparat pas dans la table realisateur. Une telle jointure peut scrire indiffremment 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 film napparat dans la table film. Une telle jointure peut scrire indiffremment 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);

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 films. Une telle jointure peut indiffremment 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 2 3 4 5 5

| | | | | | |

1 | Dogville | 2 | Breaking the waves | | | 5 | Chasseur blanc, coeur noir | | | 3 | Faux-Semblants | 4 | Crash | BY

von Trier von Trier Parker Eastwood Tarantino

| | | | | | |

Lars Lars Alan Clint Quentin

4.5.2 Les clauses GROUP


Notion de groupe

et HAVING et les fonctions dagrgation

Un groupe est un sous-ensemble des lignes dune table ayant la mme valeur pour un attribut. Par exemple, on peut grouper les films en fonction de leur ralisateur. Un groupe est dtermin par la clause GROUP BY suivie du nom du ou des attributs sur lesquels seffectuent le regroupement. 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 dfinir des regroupements (i.e. des agrgats) qui sont projets dans la table rsultat (un regroupement correspond une ligne) et deffectuer des calculs statistiques, dfinis 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 spcifie derrire la commande SELECT (expression_1, [...,] expression_N) doit tre identique la liste de colonnes de regroupement spcifie derrire la commande GROUP BY (expression_1, [...,] expression_N). A la place des noms de colonne il est possible de spcifier des oprations mathmatiques de base sur les colonnes (comme dfinies dans la section 4.4.4). Dans ce cas, les regroupements doivent porter sur les mmes expressions. Si les regroupements sont effectus selon une expression unique, les groupes sont dfinis par les ensembles de lignes pour lesquelles cette expression prend la mme valeur. Si plusieurs expressions sont spcifies (expression_1, expression_2, ) les groupes sont dfinis 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 groupe. 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 Soit la base de donnes sur les films et les cinmas suivante :
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 films 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 films 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';

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 figurant dans une clause WHERE. Cependant, il ne peut porter que sur des caractristiques du groupe : fonction dagrgation ou expression figurant 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 enfin applique pour slectionner les groupes. Exemples Pour connatre le nombre de fois que chacun des films a t projet en ne sintressant quaux films 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 films 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.5.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 diffrence (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 modifier 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.4.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 diffrents 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.5.4 Traduction des oprateurs dunion, dintersection, de diffrence et de division de lalgbre relationnelle (2 me partie)
Traduction de loprateur dunion Loprateur dunion relation1 relation2 se traduit tout simplement en SQL par la requte :
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 diffrence Loprateur de diffrence 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 films de Lars von Trier ? Cela peut se reformuler par : Quels sont les acteurs qui vrifient : quel que soit un film de Lars von Trier, lacteur a jou dans ce film. Malheureusement, le quantificateur universel () nexiste pas en SQL. Par contre, le quantificateur existentiel () existe : EXISTS. Or, la logique des prdicats nous donne lquivalence suivante : x P(x) = x P(x) On peut donc reformuler le problme de la manire suivante : Quels sont les acteurs qui vrifient : il est faux quil existe un film 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 vrifient : le nombre de films raliss par Lars von Trier dans lequel lacteur jou est gal au nombre de films raliss par Lars von Trier. Ce qui peut se traduire en SQL indiffremment 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 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.6 Nouveaux objets Langage de dfinition de donnes (LDD)


4.6.1 Squences (CREATE
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 ] SEQUENCE)

et type SERIAL

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 spcifie 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 2631 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 2631 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 spcifi, 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. Vous pouvez appeler ces diffrentes 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 didentifiants 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.6.2 Rgles (CREATE


Description

RULE)

Le systme de rgles autorise la dfinition 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.6.3). Syntaxe de dfinition 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 :

dfinit une nouvelle rgle sappliquant une table ou une vue. CREATE OR REPLACE RULE : dfinit 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. vnement : SELECT, INSERT, UPDATE ou DELETE. Les rgles qui sont dfinies sur INSERT, UPDATE ou DELETE sont appeles des rgles de mise jour. Les rgles dfinies sur SELECT permettent la cration de vues (cf. section 4.6.3). table : Le nom (pouvant tre qualifi 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 spcification des commandes ralisant laction de la rgle. Les commandes valides sont SELECT, INSERT, UPDATE, DELETE ou NOTIFY. Le mot-cl NOTHING permet de spcifier 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 modification 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. : Le nom (qualifi 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.
relation

4.6.3 Vues (CREATE


Description

VIEW)

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 modification 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 confidentialit et de scurit supplmentaire. Simplifier 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 simplifier et acclrer lcriture de requte y faisant rfrence.

Syntaxe de dfinition Voici la syntaxe de cration dune vue :


CREATE [ OR REPLACE ] VIEW nom [ ( nom_colonne [, ...] ) ] AS requte CREATE VIEW : CREATE OR REPLACE VIEW

dfinit une nouvelle vue. : dfinit 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 (qualifi ou non du nom du schma). Si un nom de schma (cf. section 4.6.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 diffrent 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 dfinit les colonnes et les lignes de la vue. La norme SQL propose un ensemble important de restrictions pour la modification ou linsertion ou la modification 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 diffrence 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 diffrence 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 (qualifi ou non du nom du schma). : 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.
CASCADE

4.6.4 Schmas (CREATE


Description

SCHEMA)

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 dfinition
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 diffrents 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 qualifi. Le Chemin de Recherche de Schma Les noms qualifis 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 qualifis (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 : 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.
CASCADE

4.7 SQL intgr

4.7.1 Introduction
Ce chapitre dcrit le pacquage SQL intgr (ou 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 intgr 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 intgr 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 vrifi syntaxiquement au moment de la prcompilation. Enfin, le SQL intgr en C est spcifi 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, afin 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 figure, il ny a pas de prcompilation effectuer. Se rfrer la documentation PostgreSQL [28] pour plus dinformation ce sujet : Chapitre 27. libpq Bibliothque C.

4.7.2 Connexion au serveur de bases de donnes


Introduction Quelque soit le langage utilis (C, Java, PHP, etc.), pour pouvoir effectuer un traitement sur une base de donnes, il faut respecter les tapes suivantes : 1. 2. 3. 4. tablir une connexion avec la base de donnes ; rcuprer les informations relatives la connexion ; effectuer les traitements dsirs (requtes ou autres commandes SQL) ; 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 effectuer 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 spcifie 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 avec lutilisateur par dfaut. Aucun nom dutilisateur ou nom de connexion ne pourrait tre spcifi isolment dans ce cas. Il existe galement diffrentes 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 identificateur 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 spcifi, cest la connexion courante qui est ferme. Il est prfrable de toujours fermer explicitement chaque connexion ouverte.

4.7.3 Excuter des commandes SQL


Toute commande SQL, incluse dans des sections spcialement marques, peut tre excute lintrieur dune application SQL intgr. 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 intgr 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.7.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 intgr. En effet, il est possible dutiliser une variable C, dans une instruction SQL, simplement en la prfixant 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. Dclaration des variables htes Les variables htes sont des variables de langage C identifies auprs du prprocesseur SQL. Ainsi, pour tre dfinies, 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 identificateurs 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 fichier de sortie du prcompilateur. Il ne faut donc pas les redfinir 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 dfinies. 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 prdfinies peuvent tre utilises pour dclarer les variables htes. Par exemple, le type prdfini 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.7.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 afin de prendre en compte les rsultats NULL (cf. section 4.7.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.7.6. Par exemple, en reprenons la base de donnes les films et les cinmas, et une requte que nous avons dj rencontre section 4.5.2 : nombre de fois que chacun des films a t projet . Nous 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.7.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 dfini 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 film nexiste pas et que sa valeur est NULL. Pour saffranchir 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 signifie que la valeur retourne nest pas NULL mais que la chane a t tronque pour tenir dans la variable hte.

4.7.6 Gestion des erreurs


Configurer 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 configurer une action spcifique excuter chaque fois quune condition particulire survient. Cette opration seffectue de la manire suivante :
EXEC SQL WHENEVER condition action;

Le paramtre condition peut prendre une des valeurs suivantes :


SQLERROR

: Laction spcifie est appele lorsquune erreur survient pendant lexcution dune instruction SQL. SQLWARNING : Laction spcifie est appele lorsquun avertissement survient pendant lexcution dune instruction SQL. NOT FOUND : Laction spcifie est appele lorsquune instruction ne rcupre ou naffecte aucune ligne. Le paramtre action peut avoir une des valeurs suivantes :
CONTINUE

: Signifie effectivement que la condition est ignore. Cest laction par dfaut. SQLPRINT : Affiche 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 configurs. 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 spcifi (en utilisant une instruction C goto). CALL nom (args) et DO nom (args) : Appelle les fonctions C spcifies avec les arguments spcifis. Le standard SQL ne dfinit que les actions CONTINUE et GOTO ou GO TO. Linstruction WHENEVER peut tre insre en un endroit quelconque dun programme SQL intgr. Cette instruction indique au prprocesseur de gnrer du code aprs chaque instruction SQL. Leffet de cette instruction reste actif pour toutes les instructions en SQL intgr situes entre la ligne de linstruction WHENEVER et linstruction WHENEVER suivante contenant la mme condition condition derreur, ou jusqu la fin du fichier source. Les conditions derreur sont fonction du positionnement dans le fichier 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 vrifiant 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 spcifique. Un code derreur saffiche dans les champs sqlcode et sqlstate lorsquune requte adresse la base de donnes provoque une erreur. Une variable SQLCA globale (sqlca) est dfinie dans la bibliothque dinterface, elle a la structure suivante :
struct { char sqlcaid[8]; long sqlabc; long sqlcode; 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 diffrent de "00000". Les champs sqlca.sqlstate et sqlca.sqlcode sont deux schmas diffrents fournissant des codes derreur. Les deux sont spcifis 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.7.7 Curseurs pour rsultats lignes multiples

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 deffectuer 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 :
2. EXEC SQL DECLARE nom_curseur CURSOR FOR requte_select ; 3. Ouvrir le curseur laide de linstruction OPEN : 4. EXEC SQL OPEN nom_curseur ; 5. Rcuprer une par une les lignes du curseur laide de linstruction FETCH : 6. FETCH [ [ NEXT | PRIOR | FIRST | LAST | { ABSOLUTE | RELATIVE } nombre ] 7. { FROM | IN } ] nom_curseur 8. 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 nombre me ligne de la requte ou la abs(nombre) me ligne partir de la fin 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 nombre me ligne ou la abs(nombre) me ligne avant si nombre est ngatif. RELATIVE 0 rcupre de nouveau la ligne actuelle si elle existe. nom_curseur : Le nom dun curseur ouvert. 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. 9. Continuez lextraction des lignes tant quil y en a. 10. Fermer le curseur laide de linstruction CLOSE :
11. EXEC SQL CLOSE nom_curseur ;

Lors de son ouverture, un curseur est plac avant la premire ligne. Par dfaut, les curseurs sont automatiquement referms la fin 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.7.8 Prcompilation et compilation


Inclusion de fichiers Pour inclure un fichier externe SQL intgr dans votre programme, utilisez la commande :
EXEC SQL INCLUDE nom_fichier;

Cette commande indique au prprocesseur du SQL intgr de chercher un fichier nomm nom_fichier.h, de traiter et de linclure dans le fichier C gnr. Du coup, les instructions SQL intgr du fichier inclus sont gres correctement. En utilisant la directive classique
#include <nom_fichier.h>

le fichier nom_fichier.h ne serait pas sujet au pr-traitement des commandes SQL. Naturellement, vous pouvez continuer utiliser la directive #include pour inclure dautres fichiers den-tte. Prcompilation et compilation La premire tape consiste traduire les sections SQL intgr 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 intgr sont nomms typiquement avec une extension .pgc. Si vous avez un fichier programme nomm prog.pgc, vous pouvez le passer au prprocesseur par la simple commande :
ecpg prog1.pgc

Cette tape permet de crer le fichier prog.c. Si vos fichiers en entre ne suivent pas le modle de nommage suggr, vous pouvez spcifier le fichier de sortie explicitement en utilisant loption -o. Le fichier trait par le prprocesseur peut alors tre compil de faon classique, par exemple :
cc -c prog.c

Cette tape permet de crer le fichier prog.o. Les fichiers sources en C gnrs incluent les fichiers den-tte 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 enfin 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 spcifis pour la sortie. Pour lier un programme SQL intgr, 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.7.9 Exemple complet


Voici un exemple complet qui effectue les oprations suivantes :

connexion la base ; vrification de la russite de la connexion ; affichage 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 d'un 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 d'affichage while(SQLCODE==0) { EXEC SQL FETCH FROM curseur_individu INTO :var_num, :var_nom, :var_prenom; printf("L'individu %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; }

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

You might also like