Vous êtes sur la page 1sur 50

BASE DE DONNES

Support de cours de base de donnes de la filire MMIC de l'IUT de Mesures Physiques d'Orsay 2008-2009

Table des matires


1 -Intrts........................................................................................................................................ 2 1.1 -Organisation et cohrence des informations....................................................................... 2 1.2 -Traitements des donnes..................................................................................................... 2 1.3 -Utilisations.......................................................................................................................... 3 2 -MERISE..................................................................................................................................... 4 2.1 -Modle conceptuel de donnes-MCD................................................................................ 4 2.2 -Modle logique de donnes-MLD.................................................................................... 17 2.3 -Modle physique de donnes-MPD..................................................................................22 2.4 -Conclusion........................................................................................................................ 23 2.5 -Rfrences.........................................................................................................................23 3 -Le langage SQL ....................................................................................................................... 24 3.1 -Concept :........................................................................................................................... 25 3.2 -Fonctionnalits avances.................................................................................................. 34 3.3 -Syntaxe SQL ................................................................................................................... 37 4 -PgAdmin III..............................................................................................................................42 4.1 -Introduction.......................................................................................................................42 4.2 -Cration de table............................................................................................................... 43 4.3 -Crer une cl trangre..................................................................................................... 44 4.4 -Insrer les donnes dans les tables....................................................................................44 4.5 -Requtes............................................................................................................................45 5 -Annexe......................................................................................................................................47 5.1 -Commandes SQL ............................................................................................................. 47 5.2 -Applications client de PostgreSQL ..................................................................................50 5.3 -Applications relatives au serveur PostgreSQL ................................................................ 50

1 - Intrts
Dans de nombreuses entreprises, associations, sites, vous pouvez trouver des bases de donnes. Pourquoi un tel engouement?

1.1 - Organisation et cohrence des informations


1.1.1 - viter la rptition d'une mme information
Dans un inventaire, plusieurs articles proviennent du mme fournisseur; une base de donnes permet d'viter de rpter le nom du fournisseur pour chaque article. De plus, pour chaque achat d'un mme client, inutile de rpter toutes les informations lies au client, seul un identifiant est ncessaire. De mme dans une gestion de bibliothque, plusieurs livres ont le mme auteur, une base de donnes permet d'viter de rpter toutes les informations sur l'auteur pour chaque livre.

1.1.2 - viter les problmes de graphie


Une base de donnes permet d'homognit l'orthographe des noms : traits d'union ou pas, majuscules ou pas, accent ou pas. Par exemple, est-ce que St NAZAIRE est la mme ville que Saint Nazaire ou que Saint-Nazaire? Est-ce que Jean-Jacques ROUSSEAU est bien le mme que Jean Jacques ROUSSEAU ou JJ ROUSSEAU?

1.2 - Traitements des donnes


Une base de donnes permet des tris, des regroupements et des classements de toutes sortes. Dans une bibliothque, nous pouvons par exemple souhaiter connatre : tous les livres emprunts le mois dernier, tous les livres emprunts le mois dernier, par des femmes, tous les livres emprunts le mois dernier, par les hommes de plus de 50 ans ayant plus de cinq ans d'adhsion la bibliothque, tous les livres emprunts le mois dernier par les femmes de moins de 25 ans ayant plus de deux ans d'adhsion la bibliothque et n'ayant jamais rendu de livre en retard, etc. Pour rpondre ces questions nous utilisons des requtes. Parmi toutes les informations stockes, une requte permet de rcuprer celles qui correspondent certains critres.

1.3 - Utilisations
Pour crer une base de donnes, nous utilisons couramment la mthode Merise. C'est une mthode d'analyse, de conception et de gestion de projet. Les Systmes de Gestion de Base de Donnes (SGBD) sont apparu dans les annes 60. Ils permettent de crer des bases de donnes, de mettre jour leurs donnes, d'y rechercher des informations particulires et de les visualiser. Il existe de nombreux SGDB : PostgreSQL, sbase, Oracle, Sybase, Access, MySQL,... Les SGDB utilisent gnralement le langage SQL. Les bases de donnes sont des outils couramment utiliss : gestion de rservation de billets, d'achat sur internet, gestion des rsultats d'expriences, gestion d'emploi du temps, gestion du personnels, gestion d'une mdiathque, d'une vidothque, gestion de vos DVD, CD, ...

2 - MERISE
Cette section regroupe les notions de base concernant le modle entit-association, le schma relationnel et la traduction de lun vers lautre. Quand nous construisons directement les tables dune base de donnes dans un logiciel de gestion des bases de donnes (PostgreSQL, Oracle, SQL Server, DB2, base, Access, MySQL, ...), nous sommes exposs deux types de problme : nous ne savons pas toujours dans quelle table placer certaines colonnes (par exemple, ladresse de livraison se met dans la table des clients ou dans la table des commandes ?) ; nous avons du mal prvoir les tables de jonction intermdiaires (par exemple, la table des interprtations qui est indispensable entre les tables des films et la table des acteurs). Il est donc ncessaire de recourir une tape prliminaire de conception. Les techniques prsentes ici font partie de la mthodologie Merise (Mthode dtude et de Ralisation Informatique pour les Systmes dEntreprise) labore en France en 1978 (cf. [4]) qui permet notamment de concevoir un systme dinformation dune faon standardise et mthodique. Le but de ce support de cours est dintroduire le schma entit-associations (Section 2.1), le schma relationnel (Sections 2.2 et 2.3) et dexpliquer la traduction entre les deux (Section 2.2.3).

2.1 - Modle conceptuel de donnes-MCD


Avant de rflchir au schma relationnel dune application, il est bon de modliser la problmatique traiter dun point de vue conceptuel et indpendamment du logiciel utilis. Cest le but de cette partie.

2.1.1 - Dictionnaire des donnes


Il est utile, voir indispensable, d'effectuer un inventaire brut des donnes qui seront stockes et/ou calcules par la base de donnes. Il faut donc diffrencier deux types de donnes, les donnes stockes et les donnes qui peuvent tre dduites ou calculs partir des donnes stockes. Ce document sera prsent sous forme de tableau de 3 colonnes, avec dans la premire colonne le nom de la donne, dans la seconde si cette donne est calcule ou stocke et dans la troisime un commentaire descriptif de la donne.

2.1.2 - Schma entit-association


Une entit est une population dindividus nayant que des caractristiques comparables. Par exemple, dans une entreprise qui achte et vend des produits, nous avons lentit client, lentit article et lentit fournisseurs (voir illustration 1).

Illustration 1: Exemple d'entits

U n e association est un lien entre plusieurs entits. Dans notre exemple illustration 2, lassociation acheter fait le lien entre les entits articles et clients, tandis que lassociation livrer fait le lien entre les entits articles et fournisseurs. Nous avons souvent intrt distinguer deux verbes pour dcrire lassociation, lun dans un sens lautre dans lautre sens. . .

Illustration 2: Exemple d'associations

Un attribut est une proprit dune entit ou dune association (voir illustration 3). Toujours dans notre exemple, le prix unitaire est un attribut de lentit article, le nom du client est un attribut de lentit client. La quantit commande est un attribut de lassociation acheter, la date de livraison est un attribut de lassociation livrer.

Illustration 3: Exemples d'attributs

Chaque individu dune entit doit tre identifiable de manire unique. Cest pourquoi les entits doivent possder un attribut sans doublon : lidentifiant. Le numro de client est lidentifiant de lentit client (nous soulignons cet attribut sur le schma, voir l'illustration 4).

Illustration 4: Exemples d'identifiants

Remarques : un attribut ne doit pas figurer dans deux entits ou associations diffrentes (donc il faut spcialiser lattribut nom en nom du client, nom du produit et nom du fournisseur) ; une entit possde au moins un attribut (son identifiant) ; une association peut ne pas possder dattribut. La cardinalit dun lien entre une entit et une association est le minimum et le maximum de fois quun individu de lentit peut tre concern par lassociation. Un client a au moins achet un article et peut acheter n articles (n tant indterminis), tandis quun article peut avoir t achet entre 0 et n fois (mme si ce nest pas le mme n) et nest livr que par 1 fournisseur. Nous obtenons alors le schma entit-association complet de l'illustration 5.

Illustration 5: Exemple de cardinalits

Remarque : Si une cardinalit est connue et vaut 2, 3, etc. on considre quelle est indterminis (n), de telle sorte que nous ne puissions avoir que des cardinalits 0, 1 ou n.

2.1.3 - Cas particuliers


Exemple dassociation binaire rflexive : dans l'illustration 6, un employ est dirig par un employ (sauf le directeur gnral) et un employ peut diriger plusieurs employs. Pour distinguer les deux liaisons, nous utilisons la notion de rle avec lajout dtiquettes (ici suprieur, personnel).

Illustration 6: Exemple d'association rflexive

Exemple dassociation entre trois entits (association ternaire) : dans ce cas, un avion, un pilote ou un aroport peuvent tre utiliss 0 ou plusieurs fois par lensemble des vols (do les cardinalits) ; voir les illustrations 7 et 8.

Illustration 7: Exemple d'association ternaire

Illustration 8: Deuxime exemple dassociation ternaire. Pour une pice donne, nous avons de 0 n couples (ouvrier, date fabrication) diffrents.

Exemple de plusieurs associations entre deux mmes entits : dans ce cas, un tre humain peut tre propritaire, locataire et/ou charg de lentretien. Nous supposons quun tre humain ne loue quun logement au maximum, quun logement nest occup que par une personne au maximum et quun logement est entretenu par une et une seule personne ; voir l'illustration 9.

Illustration 9: Exemple d'associations plurielles

2.1.4 - Rgles de normalisation


Un bon schma entit-associations doit rpondre diffrentes rgles. Normalisation des entits Toutes les entits qui sont remplaables par une association doivent tre remplaces (voir l'illustration 10).

Illustration 10: Entit remplaable par une association ternaire

Normalisation des noms Le nom dune entits dune association ou dun attribut doit tre unique. Remarque : lorsquil reste plusieurs fois le mme nom, cest parfois symptomatique dune modlisation qui nest pas termine (voir l'illustration 11) ou le signe dune redondance (voir l'illustration 12).

Illustration 11: Deux entits homognes peuvent tre fusionnes

Illustration 12: Si deux attributs contiennent les mmes informations, alors la redondance induit non seulement un gaspillage despace mais galement un grand risque dincohrence : ici, les adresses risquent de ne pas tre les mmes et dans ces conditions o faut-il livrer ?

Normalisation des identifiants Chaque entit doit possder un identifiant. Conseils : viter les identifiants composs de plusieurs attributs (comme par exemple un identifiant form par les attributs nom et prnom), car dune part cest mauvais pour les performances et dautres part, lunicit suppos par une telle dmarche finit tt ou tard par tre dmentie ; prfrer un identifiant court pour rendre la recherche la plus rapide possible (viter notamment les chanes de caractres comme un numro de plaque dimmatriculation, un numro de scurit sociale ou un code postal) ; viter galement les identifiants susceptibles de changer au cours du temps (comme les plaques dimmatriculation ou les numros de scurit sociale provisoires). Conclusion : lidentifiant sur un schma entit-associations (et donc la future cl primaire dans le schma relationnel) doit tre un entier, de prfrence incrment automatiquement.

Normalisation des attributs Il faut remplacer les attributs en plusieurs exemplaires en une association supplmentaire de cardinalits maximales n et il ne faut pas ajouter dattribut calculable partir dautres attributs. En effet, dune part, les attributs en plusieurs exemplaires posent des problmes dvolutivit du modle (voir l'illustration 13 gauche, comment faire si un employ a deux adresses secondaires ?) et dautre part, les attributs calculables induisent un risque dincohrence entre les valeurs des attributs de base et celles des attributs calculs (voir l'illustration 14).

Illustration 13: Attributs en plusieurs exemplaires remplacs par une association supplmentaire

Illustration 14: Attribut calculable qu'il faut retirer du schma

Dautres attributs calculables classiques sont viter, comme lge (qui est calculable partir de la date de naissance) ou encore le dpartement (calculable partir dune sous-chane du code postal). Normalisation des attributs des associations Les attributs dune association doivent dpendre directement des identifiants de toutes les entits en association. Par exemple, sur l'illustration 5 la quantit commande dpend la fois du numro de client et du numro darticle, par contre la date de commande non. En effet la date dpend du client et non d'un des articles commands. Il faut donc faire une entit commandes part, idem pour les livraisons (voir l'illustration 15).

Illustration 15: Normalisation des attributs des associations Linconvnient de cette rgle de normalisation est quelle est difficile appliquer pour les associations qui ne possdent pas dattribut. Pour vrifier malgr tout quune association sans attribut est bien normalis, nous pouvons donner temporairement cette association un attribut imaginaire (mais pertinent) qui permet de vrifier la rgle. Par exemple, entre les entits livres et auteurs de l'illustration 20, lassociation crire ne possde pas dattribut. Imaginons que nous ajoutions un attribut pourcentage qui contient le pourcentage du livre crit par chaque auteur (du mme livre). Comme cet attribut pourcentage dpend la fois du numro de livre et du numro dauteur, lassociation crire est bien normalis. Autre consquence de la normalisation des attributs des associations : une entit avec une cardinalit de 1,1 ou 0,1 aspire les attributs de lassociation (voir l'illustration 16 ).

Illustration 16: Cardinalit 1,1 et attributs d'une association

Normalisation des associations Il faut liminer les associations fantmes (voir l'illustration 17), redondantes (voir l'illustration 18) ou en plusieurs exemplaires (voir l'illustration 19 ).

Illustration 17: Les cardinalits sont toutes 1,1 donc c'est une association fantme

Illustration 18: Si un client ne peut pas rgler la facture dun autre client, alors lassociation payer est inutile et doit tre supprime (dans le cas contraire, lassociation payer doit tre maintenue)

En ce qui concerne les associations redondantes, cela signifie que sil existe deux chemins pour se rendre dune entit une autre, alors ils doivent avoir deux significations ou deux dures de vie diffrente. Sinon, il faut supprimer le chemin le plus court, car il est dductible partir de lautre chemin. Dans notre exemple de l'illustration 18 , si nous supprimons lassociation payer, nous pouvons retrouver le client qui a payer le rglement en passant par la facture qui correspond. Remarque : une autre solution pour le problme de l'illustration 18 consiste retirer lentit rglement et dajouter une association rgler avec les mmes attributs sauf lidentifiant) entre les entits client et facture.

Illustration 19: Une association suffit pour remplacer les 4 associations

Normalisation des cardinalits Une cardinalit minimale est toujours 0 ou 1 (et pas 2, 3 ou n) et une cardinalit maximale est toujours 1 ou n (et pas 2, 3...). Cela signifie que si une cardinalit maximale est connue et vaut 2, 3 ou plus (un nombre limit demprunts dans une bibliothque par exemple), alors nous considrons quand mme quelle est indterminis, et vaut n. Cela se justifie par le fait que mme 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 une inconnue ds le dpart. Cela signifie galement que nous ne modlisons pas les cardinalits minimales qui valent plus de 1 car ce genre de valeur est aussi men voluer. Par ailleurs, avec une cardinalit maximale de 0, lassociation naurait aucune signification.

A ces 7 rgles de normalisation, il convient dajouter les 3 premires formes normales traditionnellement nonces pour les schmas relationnels, mais qui trouvent toute aussi bien leur place en ce qui concerne les schmas entit-associations.

Premire forme normale A un instant donn, dans une entit, pour un individu, un attribut ne peut prendre quune valeur et non pas un ensemble ou une liste de valeurs. Si un attribut prend plusieurs valeurs, alors ces valeurs doivent faire lobjet dune entit supplmentaire, en association avec la premire (voir l'illustration 20 ).

Illustration 20: Application de la premire forme normale : il peut y avoir plusieurs auteurs pour un livre donn.

Deuxime forme normale Lidentifiant peut tre compos de plusieurs attributs mais les autres attributs de lentit doivent dpendre de lidentifiant en entier (et non pas d'une partie de cet identifiant). Cette deuxime forme normale peut tre oublie si nous suivons le conseil de nutiliser que des identifiants non composs et de type entier. En vrit elle a t vid de sa substance par la rgle de normalisation des attributs des associations. Considrons malgr tout le contre-exemple suivant : dans une entit clients dont lidentifiant est compos des attributs nom et prnom, la date de fte dun client ne dpend pas de son identifiant en entier mais seulement de prnom. Elle ne doit pas figurer dans lentit clients, il faut donc faire une entit calendrier part, en association avec lentit clients.

Troisime forme normale de Boyce-Codd Tous les attributs dune entit doivent dpendre directement de son identifiant et daucun autre attribut. Si ce nest pas le cas, il faut placer lattribut pathologique dans une entit spare, mais en association avec la premire. Par exemple, lentit avion (l'illustration 21 gauche) dont les valeurs sont donnes dans le tableau 1, nest pas en troisime forme normale de Boyce-Codd, car la capacit et le constructeur dun avion ne dpendant pas du numro davion mais de son modle. La solution normalise est donn par l'illustration 21 droite.

Numro de l'avion 1 2 3

Constructeur Airbus Boeing Airbus

Modle A380 B747 A380

Capacit 180 314 180

Propritaire Air France British Airways KLM

Tableau 1: Il y a redondance ( et donc risque d'incohrence) dans les colonnes constructeur et modle

Illustration 21: Application de la troisime forme normal

2.1.5 - Mthodologie
Face un problme procder ainsi : 1. identifier les entits en prsence ; 2. lister leurs attributs ; 3. ajouter les identifiants (numro arbitraire et auto-incrment) ; 4. tablir les associations binaires entre les entits ; 5. lister leurs attributs ; 6. calculer les cardinalits ; 7. vrifier les rgles de normalisation et en particulier, la normalisation des entits (cest ce stade quapparaissent les associations non binaires), des associations et de leurs attributs ainsi que la troisime forme normale de Boyce-Cood ; 8. effectuer les corrections ncessaires. Il faut garder galement lesprit que le modle doit tre exhaustif (cest--dire contenir toutes les informations ncessaires) et viter toute redondance (le prix unitaire dun article na pas besoin de figurer dans lentit commandes) qui constitue une perte despace, une dmultiplication du travail de maintenance et un risque dincohrence. Il va de soi que cette mthodologie ne doit pas tre suivie pas--pas une bonne fois pour toute. Au contraire, il faut itrer plusieurs fois les tapes successives, pour esprer converger vers une modlisation pertinent de la situation.

2.2 - Modle logique de donnes-MLD


Maintenant que le MCD est tablit, nous pouvons le traduire en diffrents systmes logiques, comme les systmes par fichiers ou les bases de donnes.

2.2.1 - Les systmes logiques


Avant lapparition des systmes de gestion de base de donnes (SGBD ou DBMS pour Data Base Management System), les donnes taient stockes dans des fichiers binaires et grs par des programmes excutables (Basic, Cobol ou Dbase par exemple). La maintenance des programmes (en cas de modification de la structure des donnes par exemple) tait trs problmatique. Sont alors apparus les SGBD hirarchiques dans lesquels les donnes sont organises en arbre (IMSDL1 dIBM par exemple), puis les SGBD rseaux dans lesquels les donnes sont organises selon un graphe plus gnral (IDS2 de Bull par exemple). Aujourdhui, ils sont largement remplacs par les SGBD relationnels (SGBDR) avec lesquels linformation peut tre obtenue par une requte formule dans un langage quasiment naturel. Ce sont les SGBD les plus rpandus (PostgreSQL, Oracle, DB2 et base par exemple). Nous nous contentons ici du modle logique de donnes relationnel (MLDR). Plus rcemment, sont apparus des SGBD orients objets qui offrent la fois un langage de requte et une navigation hypertexte. Un modle logique de donnes orient objet permet par exemple de concevoir des classes Java sappuyant sur une base de donnes relationnelle et permettant le dveloppement dune application web. Le langage Python (logiciel libre) possde une bibliothque de plus en plus complte de SGBDRO.

2.2.2 - Schma relationnel


Concentrons-nous sur le MLDR. Lorsque des donnes ont la mme structure (comme par exemple, les bordereaux de livraison), nous pouvons les organiser en table dans laquelle les colonnes dcrivent les attributs en commun et les lignes contiennent les valeurs de ces attributs pour chaque n-uplet. Les n-uplets dune table doivent tre uniques, cela signifie quun attribut (au moins) doit servir de cl primaire. La cl primaire dun n-uplet ne doit pas changer au cours du temps, alors que les autres attributs le peuvent. Par ailleurs, il se peut quun attribut Attribut1 dune table ne doive contenir que des valeurs prises par un attribut Attribut2 dune autre table (par exemple, le numro du client sur une commande doit correspondre un vrai numro de client). Attribut2 doit tre sans doublons (bien souvent il sagit dune cl primaire) et nous disons que Attribut1 est une cl trangre. Par convention, nous soulignons les cls primaires et nous faisons prcder les cls trangres dun dise # dans la description des attributs dune table :
clients(numro client, nom client, prnom, adresse, ...) commandes(numro commande, date, #numro client, ...)

Remarques : une mme table peut avoir plusieurs cls trangres mais une seule cl primaire ; une cl trangre peut aussi tre primaire ; une cl trangre peut tre compose (cest le cas si la cl primaire en liaison est compose). La section suivante contient des exemples. Nous pouvons reprsenter les tables dune base de donnes relationnelle par un schma relationnel dans lequel les tables sont appeles relations et les liens entre les cls trangres et leur cl primaire est symbolis par un connecteur (voir l'illustration 22).

Illustration 22: Exemple d'un schma relationnel

2.2.3 - Traduction
Pour traduire un MCD en un MLDR, il suffit dappliquer cinq rgles. Notations : Nous disons quune association entre deux entits (ventuellement rflexive) est de type : 1 : 1 si les deux cardinalits sont 0,1 ou 1,1 (illustration 23) ; 1 : n si une des deux cardinalits est 0,n ou 1,n, lautre cardinalit est 0,1 ou 1,1 (illustration 16) ; n : m (plusieurs plusieurs) si les deux cardinalits sont 0,n ou 1,n (illustration 14). 0,1 1,1 0,n 1,n 0,1 1:1 1:1 1:n 1:n 1,1 1:1 1:1 1:n 1:n 0,n 1:n 1:n n:m n:m 1,n 1:n 1:n n:m n:m Tableau 2: Rcapitulatif des types d'associations

Illustration 23: Exemple d'une association de type 1:1

Rgle 1 Toute entit devient une table dans laquelle les attributs sont ceux de lentit. Lidentifiant de lentit constitue alors la cl primaire de la table. Par exemple, lentit article de l'illustration 15 devient la table :
articles(numro article, nom article, prix unitaire de vente, ...)

Rgle 2 Une association binaire de type 1 : n disparat, au profit dune cl trangre dans la table ct 0,1 ou 1,1 qui rfrence la cl primaire de lautre table. Cette cl trangre ne peut pas recevoir la valeur vide si la cardinalit est 1,1. Par exemple, lassociation livrer de l'illustration 15 est traduite par :
fournisseur(numro fournisseur, nom contact, numro tlphone contact) livraison(numro livraison, date de livraison, nom livreur, #numro fournisseur(nonvide))

Il ne devrait pas y avoir dattribut dans une association de type 1 : n, mais sil en reste, alors ils glissent vers la table ct 1.

Illustration 24: Traduction d'une association de type 1:n

Rgle 3 Une association binaire de type n : m devient une table supplmentaire (parfois appele table de jonction, table de jointure ou table dassociation) dont la cl primaire est compose de deux cls trangres (qui rfrencent les deux cls primaires des deux tables en association). Les attributs de lassociation deviennent des attributs de cette nouvelle table. Par exemple, lassociation concerner(1) de l'illustration 15 est traduite par la table supplmentaire ligne de commande (illustration 25) :
ligne de commande(#numro commande, #numro article, quantit commande)

Illustration 25: Traduction d'une association de type n:m Rgle 4 Une association binaire de type 1 : 1 disparat, au profit dune cl trangre dans la table ct 1,1 qui rfrence la cl primaire de lautre table. Cette cl trangre ne peut pas recevoir la valeur vide. Si les deux cts sont de cardinalit 0,1 alors la cl trangre peut tre place indiffremment dans lune des deux tables. Par exemple, lassociation diriger de l'illustration 26 est traduite par :
service(numro service, nom service, #numro employ (non vide, unique)) employ(numro employ, nom)

Illustration 26: Traduction d'une association de type 1:1

Rgle 5 Pour une association rflexive, nous avons deux cas : premier cas : pour une association de type 1 : n, la cl primaire de lentit se ddouble et devient une cl trangre dans la nouvelle table. Exactement comme si lentit se ddoublait et tait relie par une relation binaire 1 : n. Par exemple, lassociation diriger de l'illustration 6 est traduite par :
employe(numro employ, nom, fonction, #numro suprieur)

deuxime cas : pour une association de type n : m, de mme, tout se passe exactement comme si lentit se ddoublait et tait relie par une relation binaire n : m. Il y a donc cration dune nouvelle table. Par exemple, lassociation parent de l'illustration 27 est traduite par :
personne(numro personne, nom personne) parent(#numro parent, #numro enfant)

Illustration 27: Association binaire de type n :m. Chaque personne a de 0 ou n descendants directs (enfants) et a aussi de 0 n ascendants (parents)

Rgle 6 Une association non binaire est traduite par une table supplmentaire dont la cl primaire est compose dautant de cls trangres que dentits en association. Les attributs de lassociation deviennent des attributs de cette nouvelle table. Par exemple, lassociation vol de l'illustration 7 devient la table (illustration 28) :
vol(#numro_avion, #numro_pilote, #numro_aroport, date_et_heure, dure, distance)

Illustration 28: Traduction d'une association ternaire

2.3 - Modle physique de donnes-MPD


Bien que certains outils considrent que le MPD et le MLD reprsentent la mme chose, cest faux. Le MPD est une implmentation particulire du MLD pour un matriel, un environnement et un logiciel donn. Notamment, le MPD sintresse au stockage des donnes travers le type et la taille (en octets ou en bits) des attributs du MCD. Cela permet de prvoir la place ncessaire chaque table dans le cas dun SGBDR. Le MPD tient compte des limites matrielles et logicielles afin doptimiser lespace consomm et doptimiser le temps de calcul (qui reprsentent deux optimisations contradictoires). Dans le cas dun SGBDR, le MPD dfinit les index et peut tre amen accepter certaines redondances dinformation afin dacclrer les requtes. Par exemple, la table commande de l'illustration 25 peut tre supprimes et ses colonnes, notamment date, sont ajoutes la table ligne de commande. Nous renonons donc la troisime forme normale puisque la date est rpt autant de fois quil y a de lignes dans la commande, mais nous vitons une jointure coteuse en temps de calcul lors des requtes.

Illustration 29: Sacrifice de la troisime forme normale

Une application pratique de la sparation entre le MLDR et le MPD est le portage dune base de donnes dun SGBD un autre. Par exemple, nous pouvons traduire un MPD base en un MLDR puis traduire ce MLDR en un MPD Oracle.

2.4 - Conclusion
Les Intrts de la dcomposition MCD/MLD/MPD sont que : le MCD permet dviter certaines erreurs de conception (en contradiction avec les rgles de normalisation) ; le MCD permet de voir quelles associations de type n : m, non binaires ou rflexives sont en prsence ; le MLD peut tre obtenu automatiquement par des outils de gnie logiciel ; le MCD peut tre traduit en diffrents MLD cohrents (notamment nous pouvons traduire un MCD en un MLDR puis en une base de donnes tandis quen parallle le MCD est traduit en un ensemble de classes Java (MPD orient objet) afin de dvelopper une application web sur cette base).

2.5 - Rfrences
0 Gabay, J. Apprendre et pratiquer Merise. Masson, 1989. Ce livre trs synthtique permet de sexercer sur la mthode. 1 Matheron, J.-P. Comprendre Merise. Eyrolles, 1994. Cet ouvrage trs accessible permet vraiment de comprendre la mthode. 2 Nanci, D., Espinasse, B., Cohen, B. et Heckenroth, H. Ingnierie des systmes dinformation avec Merise. Sybex, 1992. Cet ouvrage complet dtaille la mthode dans son ensemble. 3 Panet, G., Letouche, R. et Tardieu, H. Merise/2 : Modles et techniques Merise avancs. Edition dorganisation, 1994. Ce livre dcrit la version 2 de la mthode. 4 Tardieu, H., Rochfeld, A. et Coletti, R. La mthode Merise. Principes et outils. Edition dorganisation, 1986. Il sagit-l du livre de rfrence par les auteurs de la mthode.

3 - Le langage SQL
SQL signifie Structured Query Language cest--dire langage d'interrogation structur . Cest un langage de gestion des bases de donnes relationnelles. Il a t conu par IBM dans les annes 70. Il est devenu le langage standard des Systmes de Gestion de Bases de Donnes (SGBD) Relationnelles (SGBDR). Il a pour fonction l'aide la dfinition, la manipulation et le contrle des donnes d'une base de donnes relationnelle. Une base de donnes relationnelle n'est rien d'autre qu'une base de donnes perue par l'utilisateur comme un ensemble de tables. Une table est un ensemble non ordonne de lignes. SQL est la fois : un langage de dfinition des donnes : ordres CREATE, ALTER, DROP; un langage de manipulation des donnes : ordres UPDATE, INSERT, DELETE; un langage dinterrogation : ordre SELECT. Le tableau 3 contient un exemple de base de donnes contenant des fournisseurs et des pices dtaches. Les tables F,P et FP de cette figure reprsentent respectivement les fournisseurs, les pices dtaches et les expditions de pices dtaches faites par les fournisseurs. F F_NO F1 F2 F3 F4 F5 P P_NO P1 P2 P3 P4 P5 P6 F_NOM STATUT VILLE 0 20 0 0 10 0 0 30 0 0 20 0 0 30 0 FP F_NO F1 F1 F1 F1 F1 F1 F2 F2 F3 F4 F4 F4 P_NO 0 0 0 0 0 0 0 0 0 0 0 0 QTE 300 200 400 200 100 100 300 400 200 200 300 400

P_NOM 0 0 0 0 0 0

COULEUR POIDS 0 12 0 17 0 17 0 14 0 12 0 19

VILLE 0 0 0 0 0 0

Tableau 3: Echantillons de donnes de la base fournisseurs-pices dtaches

Le langage SQL est utilis par les principaux SGBDR : PostgreSQL, MySQL, fireBird, DB2, Oracle, Sybase, etc. Chacun de ces SGBDR a cependant sa propre variante du langage. Ce support de cours prsente les principales commande disponible sous PostgreSQL.

3.1 - Concept :
PostgreSQL est un systme de gestion de bases de donnes relationnelles (SGBDR). Chaque table est un ensemble de lignes. Chaque ligne d'une table donne a le mme ensemble de colonnes et chaque colonne est d'un type de donnes particulier. Tandis que les colonnes ont un ordre fix dans chaque ligne, il est important de savoir que SQL ne garantit, d'aucune faon, l'ordre des lignes l'intrieur de la table (bien qu'elles puissent tre explicitement tries pour l'affichage).

3.1.1 - Crer une nouvelle table :


Vous pouvez crer une nouvelle table en spcifiant le nom de la table, suivi de tous les noms des colonnes et de leur type :
CREATE TABLE temps ( ville varchar(80), t_basse int, -- temprature basse t_haute int, -- temprature haute prcp real, -- prcipitation date date );

Vous pouvez saisir cela dans psql avec les sauts de lignes. psql reconnatra que la commande n'est pas termine jusqu' arriver un point-virgule. Les espaces blancs (c'est--dire les espaces, les tabulations et les retours la ligne) peuvent tre librement utiliss dans les commandes SQL. Cela signifie que vous pouvez saisir la commande cidessus aligne diffremment ou mme sur une seule ligne. Deux tirets ( -- ) introduisent des commentaires. Ce qui les suit est ignor jusqu' la fin de la ligne. SQL est insensible la casse pour les mots-cl et les identifiants except quand les identifiants sont entre double guillemets pour prserver leur casse (non fait ci-dessus). varchar(80) spcifie un type de donnes pouvant contenir une chane de caractres arbitraires de 80 caractres au maximum. int est le type entier normal. real est un type pour les nombres dcimaux en simple prcision. date devrait s'expliquer de lui-mme (oui, la colonne de type date est aussi nomme date ; cela peut tre commode ou porter confusion, vous de choisir). PostgreSQL prend en charge les types SQL standards int, smallint, real, double precision, char(N), varchar(N), date, time, timestamp et interval ainsi que d'autres types d'utilit gnrale et un riche ensemble de types gomtriques. PostgreSQL peut tre personnalis avec un nombre arbitraire de types de donnes dfinis par l'utilisateur. En consquence, les noms des types ne sont pas des mots-cl syntaxiques sauf lorsqu'il est requis de supporter des cas particuliers dans la norme SQL. Le second exemple stockera des villes et leur emplacement gographique associ :
CREATE TABLE villes ( nom varchar(80), emplacement point );

Le type point est un exemple d'un type de donnes spcifique PostgreSQL. Pour finir, vous devez savoir que si vous n'avez plus besoin d'une table ou que vous voulez la recrer diffremment, vous pouvez la supprimer en utilisant la commande suivante :
DROP TABLE nom_table;

3.1.2 - Remplir une table avec des lignes


L'instruction INSERT est utilise pour remplir une table avec des lignes :
INSERT INTO temps VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

Notez que tous les types utilisent des formats d'entres plutt vident. Les constantes qui ne sont pas des valeurs numriques simples doivent tre habituellement entoures par des guillemets simples (') comme dans l'exemple. Le type date est en ralit tout fait flexible dans ce qu'il accepte mais, pour ce tutoriel, nous collerons au format non ambigu montr ici. Le type point demande une paire de coordonnes en entre comme cela est montr ici :
INSERT INTO villes VALUES ('San Francisco', '(-194.0, 53.0)');

La syntaxe utilise jusqu' maintenant ncessite de se rappeler l'ordre des colonnes. Une syntaxe alternative vous autorise lister les colonnes explicitement :
INSERT INTO temps (ville, t_basse, t_haute, prcp, date) VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');

Vous pouvez lister les colonnes dans un ordre diffrent si vous le souhaitez ou mme omettre certaines colonnes ; par exemple, si la prcipitation est inconnue :
INSERT INTO temps (date, ville, t_haute, t_basse) VALUES ('1994-11-29', 'Hayward', 54, 37);

De nombreux dveloppeurs considrent que le listage explicite des colonnes est un meilleur style que de compter sur l'ordre implicite. S'il vous plat, excutez toutes les commandes vues ci-dessus de faon avoir des donnes sur lesquelles travailler dans les prochaines sections.

Vous auriez p aussi utiliser COPY pour charger de grandes quantits de donnes depuis des fichiers texte. C'est habituellement plus rapide car la commande COPY est optimise pour cet emploi mais elle est moins flexible que INSERT. Par exemple :
COPY temps FROM '/home/user/temps.txt';

o le nom du fichier source doit tre disponible sur la machine serveur et non pas sur le client puisque le serveur lit le fichier directement.

3.1.3 - Interroger une table :


Pour retrouver les donnes d'une table, elle est interroge. Une instruction SQL SELECT est utilise pour faire cela. L'instruction est divise en liste de slection (la partie qui liste les colonnes retourner), une liste de tables (la partie qui liste les tables partir desquelles les donnes seront retrouves) et une qualification optionnelle (la partie qui spcifie les restrictions). Par exemple, pour retrouver toutes les lignes de la table temps, saisissez :
SELECT * FROM temps;

Ici, * est un raccourci pour toutes les colonnes . Donc, le mme rsultat pourrait tre obtenu avec :
SELECT ville, t_basse, t_haute, prcp, date FROM temps;

Le rsultat devrait tre ceci :


ville | t_basse | t_haute | prcp | date --------------------+---------+---------+---------+-----------San Francisco | 46 | 50 | 0.25 | 1994-11-27 San Francisco | 43 | 57 | 0 | 1994-11-29 Hayward | 37 | 54 | | 1994-11-29 (3 rows)

Alors que SELECT * est utile pour des requtes rapides, c'est gnralement considr comme un mauvais style dans un code en production car l'ajout d'une colonne dans la table changerait les rsultats.

Vous pouvez crire des expressions, pas seulement des rfrences de simples colonnes, dans la liste de slection. Par exemple, vous pouvez faire :
SELECT ville, (t_haute+t_basse)/2 AS temp_moy, date FROM temps;

Cela devrait donn :


ville | temp_moy | date --------------------+--------------------+--------------San Francisco | 48 | 1994-11-27 San Francisco | 50 | 1994-11-29 Hayward | 45 | 1994-11-29 (3 rows)

Notez comment la clause AS est utilise pour renommer la sortie d'une colonne (cette clause AS est optionnelle). Une requte peut tre qualifie en ajoutant une clause WHERE qui spcifie quelles lignes sont souhaites. La clause WHERE contient une expression boolenne et seules les lignes pour lesquelles l'expression boolenne est vraie sont renvoyes. Les oprateurs boolens habituels (AND, OR et NOT) sont autoriss dans la qualification. Par exemple, ce qui suit recherche le temps San Francisco les jours pluvieux :
SELECT * FROM temps WHERE ville = 'San Francisco' AND prcp > 0.0;

Rsultat :
ville | t_basse | t_haute | prcp | date --------------------+---------+---------+---------+-----------San Francisco | 46 | 50 | 0.25 | 1994-11-27 (1 row)

Vous pouvez demander que les rsultats d'une requtes soient renvoys dans un ordre tri :
SELECT * FROM temps ORDER BY ville;

ville | t_basse | t_haute | prcp | date --------------------+---------+---------+---------+-----------Hayward | 37 | 54 | | 1994-11-29 San Francisco | 43 | 57 | 0 | 1994-11-29 San Francisco | 46 | 50 | 0.25 | 1994-11-27

Dans cet exemple, l'ordre de tri n'est pas spcifi compltement, donc vous pouvez obtenir les lignes San Francisco dans n'importe quel ordre. Mais, vous auriez toujours obtenu les rsultats affichs ci-dessus si vous aviez fait :
SELECT * FROM temps ORDER BY ville, t_basse;

Vous pouvez demander que les lignes dupliques soient supprimes du rsultat d'une requte :
SELECT DISTINCT ville FROM temps; ville --------------Hayward San Francisco (2 rows)

De nouveau, l'ordre des lignes rsultats pourrait varier. Vous pouvez vous assurer des rsultats cohrents en utilisant DISTINCT et ORDER BY ensemble : [3]
SELECT DISTINCT ville FROM temps ORDER BY ville;

3.1.4 - Jointures entre les tables :


Jusqu'ici, nos requtes avaient seulement consult une table la fois. Les requtes peuvent accder plusieurs tables en mme temps ( ou accder la mme table de faon ce que plusieurs lignes de la table soient traites en mme temps ). Une requte qui consulte plusieurs lignes de la mme ou de diffrentes tables en mme temps est appele requte de jointure. Comme exemple, supposez que vous souhaitez lister toutes les entres de la table temps avec la colonne des noms de toutes les lignes de la table des villes et que vous choisissez les paires de lignes o ces valeurs correspondent. Ceci sera accompli avec la requte suivante :
SELECT * FROM temps, villes WHERE ville = nom; ville | t_basse | t_haute | prcp | date | nom | emplacement --------------------+---------+---------+---------+-------------------+--------------------+-----------------San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53) San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53) (2 rows)

Remarquez deux choses propos du rsultat : Il n'y a pas de lignes pour la ville de Hayward dans le rsultat. C'est parce qu'il n'y a aucune entre correspondante dans la table villes pour Hayward, donc la jointure ignore les lignes n'ayant pas de correspondance avec la table temps. Nous verrons rapidement comment cela peut tre rsolu. Il y a deux colonnes contenant le nom des villes. C'est correct car les listes de colonnes des tables temps et villes sont concatnes. En pratique, ceci est indsirable, vous voudrez probablement lister les colonnes explicitement plutt que d'utiliser * :
SELECT ville, t_basse, t_haute, prcp, date, emplacement FROM temps, villes WHERE ville = nom;

Puisque toutes les colonnes ont un nom diffrent, l'analyseur a automatiquement trouv quelle table elles appartiennent. Si des noms de colonnes sont communs entre les deux tables, vous aurez besoin de qualifier les noms des colonnes pour prciser celle dont vous parlez. Par exemple :
SELECT temps.ville, temps.t_basse, temps.t_haute, temps.prcp, temps.date, villes.emplacement FROM temps, villes WHERE villes.nom = temps.ville;

La qualification des noms de colonnes dans une requte de jointure est frquemment considre comme une bonne pratique. Cela vite l'chec de la requte si un nom de colonne dupliqu est ajout plus tard dans une des tables. Les requtes de jointure vues jusqu'ici peuvent aussi tre crites dans un format alternatif :
SELECT * FROM temps INNER JOIN villes ON (temps.ville = villes.nom);

Cette syntaxe n'est pas aussi couramment utilise que les prcdentes mais nous la montrons ici pour vous aider comprendre les sujets suivants. Maintenant, nous allons essayer de comprendre comment nous pouvons avoir les entres de Hayward. Nous voulons que la requte parcourt la table temps et que, pour chaque ligne, elle trouve la (ou les) ligne(s) de villes correspondante(s). Si aucune ligne correspondante n'est trouve, nous voulons que les valeurs des colonnes de la table villes soient remplaces par des valeurs vides . Ce genre de requtes est appel jointure externe (outer join). (Les jointures que nous avons vus jusqu'ici sont des jointures internes -- inner joins). La commande ressemble cela :
SELECT * FROM temps LEFT OUTER JOIN villes ON (temps.ville = villes.nom); ville | t_basse | t_haute | prcp | date | nom | emplacement --------------------+---------+---------+------+-----------------------+-------------------+----------------Hayward | 37 | 54 | | 1994-11-29 | | San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53) San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53) (3 rows)

Cette requte est appele une jointure externe gauche (left outer join) parce que la table mentionne la gauche de l'oprateur de jointure aura au moins une fois ses lignes dans le rsultat tandis que la table sur la droite aura seulement les lignes qui correspondent des lignes de la table de gauche. Lors de l'affichage d'une ligne de la table de gauche pour laquelle il n'y a pas de correspondance dans la table de droite, des valeurs vides (appeles NULL) sont mises pour les colonnes de la table de droite.

Nous pouvons galement joindre une table avec elle-mme. Ceci est appel une jointure rflexive. Comme exemple, supposons que nous voulons trouver toutes les entres de temps qui sont dans un intervalle de temprature d'autres entres de temps. Nous avons donc besoin de comparer les colonnes t_basse et t_haute de chaque ligne de temps aux colonnes t_basse et t_haute de toutes les autres lignes de temps. Nous pouvons faire cela avec la requte suivante :
SELECT T1.ville, T1.t_basse AS bas, T1.t_haute AS haut, T2.ville, T2.t_basse AS bas, T2.t_haute AS haut FROM temps T1, temps T2 WHERE T1.t_basse < T2.t_basse AND T1.t_haute > T2.t_haute; ville | bas | haut | ville | bas | haut --------------------+---------+---------+-------------------+---------+-----San Francisco | 43 | 57 | San Francisco | 46 | 50 Hayward | 37 | 54 | San Francisco | 46 | 50 (2 rows)

Ici, nous avons renomm la table temps en T1 et en T2 pour tre capable de distinguer le ct gauche et droit de la jointure. Vous pouvez aussi utiliser ce genre d'alias dans d'autres requtes pour conomiser de la frappe, c'est--dire :
SELECT * FROM temps t, villes v WHERE t.ville = v.nom;

Vous rencontrerez ce genre d'abrviation assez frquemment.

3.1.5 - Les oprations ensemblistes


Les oprations ensemblistes en SQL, sont celles dfinies dans l'algbre relationnelle. Elles sont ralises grce aux oprateurs : UNION INTERSECT (ne fait pas partie de la norme SQL et n'est donc pas implment dans tous les SGBD) EXCEPT (ne fait pas partie de la norme SQL et n'est donc pas implment dans tous les SGBD) Ces oprateurs s'utilisent entre deux clauses SELECT. L'oprateur UNION Cet oprateur permet d'effectuer une union des lignes slectionnes par deux clauses SELECT (les deux tables sur lesquelles on travaille devant avoir le mme schma).
SELECT ---- FROM ---- WHERE -----UNION SELECT ---- FROM ---- WHERE ------

Par dfaut les doublons sont automatiquement limins. Pour conserver les doublons, il est possible d'utiliser une clause UNION ALL.

L'oprateur INTERSECT Cet oprateur permet d'effectuer une intersection des tuples slectionns par deux clauses SELECT (les deux tables sur lesquelles on travaille devant avoir le mme schma).
SELECT ---- FROM ---- WHERE -----INTERSECT SELECT ---- FROM ---- WHERE ------

L'oprateur INTERSECT n'tant pas implment dans tous les SGBD, il est possible de le remplacer par des commandes usuelles :
SELECT a,b FROM table1 WHERE EXISTS (SELECT c,d FROM table2 WHERE a=c AND b=d )

L'oprateur EXCEPT Cet oprateur permet d'effectuer une diffrence entre les lignes slectionns par deux clauses SELECT, c'est--dire slectionner les lignes de la premire table n'appartenant pas la seconde (les deux tables devant avoir le mme schma).
SELECT a,b FROM table1 WHERE -----EXCEPT SELECT c,d FROM table2 WHERE ------

L'oprateur EXCEPT n'tant pas implment dans tous les SGBD, il est possible de le remplacer par des commandes usuelles :
SELECT a,b FROM table1 WHERE NOT EXISTS ( SELECT c,d FROM table2 WHERE a=c AND b=d )

3.1.6 - Fonctions d'agrgat


Une fonction d'agrgat calcule un seul rsultat partir de plusieurs lignes en entre. Par exemple, il y a des agrgats pour calculer le nombre (count), la somme (sum), la moyenne (avg), le maximum (max) et le minimum (min) d'un ensemble de lignes. Comme exemple, nous pouvons trouver la temprature la plus haute parmi les tempratures basses avec :
SELECT max(t_basse) FROM temps; max ----46 (1 row)

Si nous voulons connatre dans quelle ville (ou villes) ces lectures se sont produites, nous pouvons essayer :
SELECT ville FROM temps WHERE t_basse = max(t_basse); FAUX

mais cela ne marchera pas puisque l'agrgat max ne peut pas tre utilis dans une clause WHERE (cette restriction existe parce que la clause WHERE dtermine les lignes qui seront traites par l'agrgat ; donc les lignes doivent tre values avant que les fonctions d'agrgat calculent). Cependant, comme cela est souvent le cas, la requte peut tre rpte pour arriver au rsultat attendu, ici en utilisant une sous-requte :
SELECT ville FROM temps WHERE t_basse = (SELECT max(t_basse) FROM temps); ville --------------San Francisco (1 row)

Ceci est correct car la sous-requte est un calcul indpendant qui traite son propre agrgat sparment partir de ce qui se passe dans la requte externe. Les agrgats sont galement trs utiles s'ils sont combins avec les clauses GROUP BY. Par exemple, nous pouvons obtenir temprature la plus haute parmi les tempratures basses observes dans chaque ville avec :
SELECT ville, max(t_basse) FROM temps GROUP BY ville; ville | max --------------------+----Hayward | 37 San Francisco | 46 (2 rows)

ce qui nous donne une ligne par ville dans le rsultat. Chaque rsultat d'agrgat est calcul avec les lignes de la table correspondant la ville. Nous pouvons filtrer ces lignes groupes en utilisant HAVING :
SELECT ville, max(t_basse) FROM temps GROUP BY ville HAVING max(t_basse) < 40; ville | max --------------------+------Hayward | 37 (1 row)

ce qui nous donne le mme rsultat uniquement pour les villes qui ont toutes leurs valeurs de t_basse en-dessous de 40. Pour finir, si nous nous proccupons seulement des villes dont le nom commence par S , nous pouvons faire :
SELECT ville, max(t_basse) FROM temps WHERE ville LIKE 'S%' GROUP BY ville HAVING max(t_basse) < 40;

Il est important de comprendre l'interaction entre les agrgats et les clauses SQL WHERE et HAVING. La diffrence fondamentale entre WHERE et HAVING est que WHERE slectionne les lignes en entre avant que les groupes et les agrgats ne soient traits (donc, cette clause contrle les lignes qui se retrouvent dans le calcul de l'agrgat) tandis que HAVING slectionne les lignes groupes aprs que les groupes et les agrgats aient t traits. Donc, la clause WHERE ne doit pas contenir des fonctions d'agrgat ; cela n'a aucun sens d'essayer d'utiliser un agrgat pour dterminer quelles lignes seront en entre des agrgats. D'un autre ct, la clause HAVING contient toujours des fonctions d'agrgat (pour tre prcis, vous tes autoriss crire une clause HAVING qui n'utilise pas d'agrgats mais c'est rarement utilis. La mme condition pourra tre utilise plus efficacement par un WHERE). Dans l'exemple prcdent, nous pouvons appliquer la restriction sur le nom de la ville dans WHERE puisque cela n'a besoin d'aucun agrgat. C'est plus efficace que d'ajouter la restriction dans HAVING parce que nous vitons le groupement et les calculs d'agrgat pour toutes les lignes qui ont chou lors du contrle fait par WHERE.

3.1.7 - Mises jour


Vous pouvez mettre jour une ligne existante en utilisant la commande UPDATE. Supposez que vous dcouvrez que les tempratures sont toutes excdentes de 2 degrs aprs le 28 novembre. Vous pouvez corriger les donnes de la faon suivante :
UPDATE temps SET t_haute = t_haute - 2, t_basse = t_basse - 2 WHERE date > '1994-11-28';

Regardez le nouvel tat des donnes :


SELECT * FROM temps; ville | t_basse | t_haute | prcp | date --------------------+---------+---------+---------+--------------San Francisco | 46 | 50 | 0.25 | 1994-11-27 San Francisco | 41 | 55 | 0 | 1994-11-29 Hayward | 35 | 52 | | 1994-11-29 (3 rows)

3.1.8 - Suppressions
Les lignes peuvent tre supprimes de la table avec la commande DELETE. Supposez que vous n'tes plus intress par le temps de Hayward. Vous pouvez faire ce qui suit pour supprimer ses lignes de la table :
DELETE FROM temps WHERE ville = 'Hayward';

Toutes les entres de temps pour Hayward sont supprimes.


SELECT * FROM temps; ville | t_basse | t_haute | prcp | date --------------------+---------+---------+---------+-----------San Francisco | 46 | 50 | 0.25 | 1994-11-27 San Francisco | 41 | 55 | 0 | 1994-11-29 (2 rows)

Faire trs attention aux instructions de la forme


DELETE FROM nom_table;

Sans une qualification, DELETE supprimera toutes les lignes de la table donne, la laissant vide. Le systme le fera sans demander de confirmation !

3.2 - Fonctionnalits avances


3.2.1 - Introduction
Le chapitre prcdant couvre les bases de l'utilisation de SQL pour le stockage et l'accs aux donnes avec PostgreSQL. Il est temps d'aborder quelques fonctionnalits avances du SQL qui simplifient la gestion et empchent la perte ou la corruption des donnes. Le langage SQL pour les modifier ou les amliorer. Il est donc prfrable d'avoir lu ce chapitre. Quelques exemples de ce chapitre sont galement disponibles dans advanced.sql. Ce fichier contient, de plus, quelques donnes charger pour utiliser l'exemple.

3.2.2 - Vues
Si la liste des enregistrements du temps et des villes est d'un intrt particulier pour l'application considre mais qu'il devient contraignant de saisir la requte chaque utilisation, il est possible de crer une vue avec la requte. De ce fait, la requte est nomme et il peut y tre fait rfrence de la mme faon qu'il est fait rfrence une table :
CREATE VIEW ma_vue AS SELECT ville, t_basse, t_haute, prcp, date, emplacement FROM temps, villes WHERE ville = 'San Francisco'; SELECT * FROM ma_vue;

Une vue est une table virtuelle, c'est--dire une table qui n'a pas d'existence propre mais qui apparat relle l'utilisateur. La commande SELECT dfinissant une vue n'est pas excute au moment de la cration de la vue mais est simplement mmorise par le systme. Mais l'utilisateur a maintenant l'impression qu'il existe rellement dans la base de donnes une table portant le nom ma_vue. L'utilisation des vues est un aspect cl d'une bonne conception des bases de donnes SQL. Les vues permettent d'encapsuler les dtails de la structure des tables. Celle-ci peut alors changer avec l'volution de l'application, tandis que l'interface reste constante. Les vues peuvent tre utilises dans quasiment toutes les situations o une vraie table est utilisable. Il n'est, de plus, pas inhabituel de construire des vues reposant sur d'autres vues.

3.2.3 - Cl primaire
La commande CREATE TABLE comprend une option PRIMARY KEY permettant de crer une cl primaire. Voici un exemple o la cl primaire est multi-colonne:

CREATE TABLE ( col1 int, col2 int, col3 int, CONSTRAINT ma_cle PRIMARY KEY (col1, col2) );

Si une cl primaire est uni-colonne, nous pouvons crer une cl primaire ainsi :
CREATE TABLE Pays ( P_nom varchar(40) PRIMARY KEY, Langue_Off varchar(20), HAB int,);

3.2.4 - Cls trangres


Il s'agit maintenant de s'assurer que personne n'insre de ligne dans la table temps qui ne corresponde une entre dans la table villes. On appelle cela maintenir l'intgrit rfrentielle des donnes. Dans les systmes de bases de donnes simplistes, lorsqu'au moins c'est possible, cela est parfois obtenu par la vrification pralable de l'existence d'un enregistrement correspondant dans la table villes, puis par l'insertion, ou l'interdiction, du nouvel enregistrement dans temps. Puisque cette approche, peu pratique, prsente un certain nombre d'inconvnients, PostgreSQL peut se charger du maintien de l'intgrit rfrentielle. La nouvelle dclaration des tables ressemble alors ceci :
CREATE TABLE villes ( ville varchar(80) primary key, emplacement point ); CREATE TABLE temps ( ville varchar(80) references villes, t_haute int, t_basse int, prcp real, date date );

Lors d'une tentative d'insertion d'enregistrement non valide :


INSERT INTO temps VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "temps" violates foreign key constraint "temps_ville_fkey" DETAIL : Key (ville)=(a) is not present in table "villes".

Le comportement des cls trangres peut tre adapt trs finement une application particulire.

3.2.5 - Hritage
L'hritage est un concept issu des bases de donnes orientes objet. Il ouvre de nouvelles possibilits intressantes en conception de bases de donnes. Soient deux tables : une table villes et une table capitales. Les capitales tant galement des villes, il est intressant d'avoir la possibilit d'afficher implicitement les capitales lorsque les villes sont listes. On pourrait crire ceci :

CREATE TABLE capitales ( nom text, population real, altitude int, -- (en pied) etat char(2) ); CREATE TABLE non_capitales ( nom text, population real, altitude int -- (en pied) ); CREATE VIEW villes AS SELECT nom, population, altitude FROM capitales UNION SELECT nom, population, altitude FROM non_capitales;

Cela fonctionne bien pour les requtes, mais la mise jour d'une mme donne sur plusieurs lignes devient vite un horrible casse-tte. Une meilleure solution :
CREATE TABLE villes ( nom text, population real, altitude int -- (en pied) ); CREATE TABLE capitales ( etat char(2) ) INHERITS (villes);

Dans ce cas, une ligne de capitales hrite de toutes les colonnes (nom, population et altitude) de son parent, villes. Le type de la colonne nom est text, un type natif de PostgreSQL pour les chanes de caractres longueur variable. Les capitales d'tat ont une colonne supplmentaire, etat, qui affiche l'tat dont elles sont la capitale. Sous PostgreSQL, une table peut hriter de zro plusieurs autres tables. La requte qui suit fournit un exemple de rcupration des noms de toutes les villes, en incluant les capitales des tats, situes une altitude de plus de 500 pieds :
SELECT nom, altitude FROM villes WHERE altitude > 500;

ce qui renvoie :
nom | altitude --------------------+---------Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows)

l'inverse, la requte qui suit rcupre toutes les villes qui ne sont pas des capitales et qui sont situes une altitude d'au moins 500 pieds :
SELECT nom, altitude FROM ONLY villes WHERE altitude > 500;

nom | altitude --------------------+---------Las Vegas | 2174 Mariposa | 1953 (2 rows)

Ici, ONLY avant villes indique que la requte ne doit tre excute que sur la table villes, et non pas sur les tables en dessous de villes dans la hirarchie des hritages. La plupart des commandes dj voques -- SELECT, UPDATE et DELETE -- supportent cette notation (ONLY). Note Bien que l'hritage soit frquemment utile, il n'a pas t intgr avec les contraintes d'unicit et les cls trangres, ce qui limite son utilit.

3.3 - Syntaxe SQL


Une entre SQL consiste en une squence de commandes. Une commande est compose d'une squence de jetons, termins par un point-virgule ( ; ). La fin du flux en entre termine aussi une commande. Les jetons valides dpendent de la syntaxe particulire de la commande. Un jeton peut tre un mot cl, un identifieur, un identifieur entre guillemets, un littral (ou une constante) ou un symbole de caractre spcial. Les jetons sont normalement spars par des espaces blancs (espace, tabulation, nouvelle ligne) mais n'ont pas besoin de l'tre s'il n'y a pas d'ambigut (ce qui est seulement le cas si un caractre spcial est adjacent des jetons d'autres types). De plus, des commentaires peuvent se trouver dans l'entre SQL. Ce ne sont pas des jetons, ils sont rellement quivalents un espace blanc. Par exemple, ce qui suit est (syntaxiquement) valide pour une entre SQL :
SELECT * FROM MA_TABLE; UPDATE MA_TABLE SET A = 5; INSERT INTO MA_TABLE VALUES (3, 'salut ici');

C'est une squence de trois commandes, une par ligne (bien que cela ne soit pas requis ; plusieurs commandes peuvent se trouver sur une mme ligne et une commande peut se rpartir sur plusieurs lignes).

3.3.1 - Identifieurs et mots cls


Les jetons tels que SELECT, UPDATE ou VALUES dans l'exemple ci-dessus sont des exemples de mots cls, c'est--dire des mots qui ont une signification dans le langage SQL. Les jetons MA_TABLE et A sont des exemples d'identifieurs. Ils identifient des noms de tables, colonnes ou d'autres objets de la base de donnes suivant la commande qui a t utilise. Du coup, ils sont quelques fois simplement nomms des noms . Une liste complte des mots cl est disponible dans l'Annexe. Les identifieurs et les mots cls SQL doivent commencer avec une lettre ou un tiret bas (_). Les caractres suivants dans un identifieur ou dans un mot cl peuvent tre des lettres, des tirets-bas, des chiffres.

L'identifieur et les noms de mots cls sont insensibles la casse. Du coup :


UPDATE MA_TABLE SET A = 5;

peut aussi s'crire de cette faon :


uPDaTE ma_TabLE SeT a = 5;

Une convention couramment utilise revient crire les mots cls en majuscule et les noms en minuscule, c'est--dire :
UPDATE ma_table SET a = 5;

Voici un deuxime type d'identifieur : l'identifieur dlimit ou l'identifieur entre guillemets. Il est form en englobant une squence arbitraire de caractres entre des guillemets doubles ("). Un identifieur dlimit est toujours un identifieur, jamais un mot cl. Donc, "select" pourrait tre utilis pour faire rfrence une colonne ou une table nomme select , alors qu'un select sans guillemets sera pris pour un mot cl et du coup, pourrait provoquer une erreur d'analyse lorsqu'il est utilis alors qu'un nom de table ou de colonne est attendu. L'exemple peut tre crit avec des identifieurs entre guillemets comme ceci :
UPDATE "ma_table" SET "a" = 5;

Mettre un identifieur entre guillemets le rend sensible la casse alors que les noms sans guillemets sont toujours convertis en minuscules. Par exemple, les identifieurs FOO, foo et "foo" sont considrs identiques par PostgreSQL mais "Foo" et "FOO" sont diffrents des trois autres et entre eux.

3.3.2 - Constantes
Il existe trois types implicites de constantes dans PostgreSQL : les chanes, les chanes de bits et les nombres. Constantes de chanes Une constante de type chane en SQL est une squence arbitraire de caractres entoure par des guillemets simples ('), c'est--dire 'Ceci est une chane'. Pour inclure un guillemet simple dans une chane constante, saisissez deux guillemets simples adjacents, par exemple 'Le cheval d''Anne'. Notez que ce n'est pas au guillemet double ("). Deux constantes de type chane spares par un espace blanc avec au moins une nouvelle ligne sont concatnes et traites rellement comme si la chane avait t crite dans une constante. Par exemple :
SELECT 'foo' 'bar';

est quivalent :
SELECT 'foobar';

mais :
SELECT 'foo' 'bar';

n'a pas une syntaxe valide.

PostgreSQL accepte aussi les constantes de chane d' chappement qui sont une extension au standard SQL. Une constante de type chane d'chappement est indique en crivant la lettre E (en majuscule ou minuscule) juste avant le guillemet d'ouverture, par exemple E'foo'. (Pour continuer une constante de ce type sur plusieurs lignes, crire E seulement avant le premier guillemet d'ouverture). \b est un antislash, \f est un saut de page \n est un retour la ligne, \t est une tabulation. Tout autre caractre suivi d'un antislash est pris littralement. Du coup, pour inclure un caractre antislash, crivez deux antislashs (\\). De plus, un guillemet simple peut tre inclus dans une chane d'chappement en crivant \', en plus de la faon normale ''. Le caractre de code zro ne peut tre plac dans une constante de type chane. Constantes numriques Les constantes numriques sont acceptes dans ces formes gnrales :
chiffres chiffres.[chiffres][e[+-]chiffres] [chiffres].chiffres[e[+-]chiffres] chiffrese[+-]chiffres

o chiffres est un ou plusieurs chiffres dcimaux (de 0 9). Au moins un chiffre doit tre avant ou aprs le point dcimal, s'il est utilis. Au moins un chiffre doit suivre l'indicateur d'exponentiel (e), s'il est prsent. Il peut ne pas y avoir d'espaces ou d'autres caractres imbriqus dans la constante. Notez que tout signe plus ou moins en avant n'est pas forcment considr comme faisant part de la constante ; il est un oprateur appliqu la constante. Voici quelques exemples de constantes numriques valides : 42 3.5 4. .001 5e2 1.925e-3

3.3.3 - Valeur NULL


La valeur nulle est une valeur particulire qu'on peut trouver dans une colonne d'une table. Nulle signifie ici que l'information est manquante. C'est ce qui se produira, par exemple, si la valeur est inconnue ou si elle n'est pas du type requis. La manire dont les valeurs nulles sont reprsentes dpend de l'implantation. Le systme doit toutefois pouvoir distinguer les valeurs nulles des valeurs connues , c'est--dire non nulles. Voici comment les valeurs nulles sont traites dans les oprations arithmtique et scalaires: Soient A et B des objets de type numrique. Si A est nul, alors les expressions +A et -A prendront valeur nulle. Si l'un des objets A ou B est nul, ou si les deux son nuls, alors les expressions suivantes sont nulles : A+B, A-B, A*B et A/B. Soient A et B des objets comparables entre eux. Si au moins un des deux est nul alors, l'intrieur d'une clause WHERE ou HAVING, chacune des expressions A=B, A<>B, A<B, A>B, A<=B et A>=B prend la valeur logique inconnue, c'est--dire ni vraie ni fausse. Voici comment les tables de vrit dfinissent la valeur logique inconnue (V=vrai, F=faux, ? = inconnu):

ET V ? F

V V ? F

? ? ? F

F F F F

OU V ? F

V V V V

? V ? ?

F V ? F

NON V ? F F ? V

Deux oprateurs particuliers du langage SQL, IS NULL et IS NOT NULL, permettent de vrifier si une valeur est nulle. Toutefois, deux valeurs nulles sont considres comme gales, ou encore comme des copies rciproques, lorsqu'on veut liminer les valeurs redondantes (DISINCT), et lorsqu'on dsire faire des regroupements (GROUP BY) ou des tris (ORDER BY).

3.3.4 - Oprateurs
Un nom d'oprateur est une squence provenant de la liste suivante : +-*/<> =~!@#%^&|`? Nanmoins, il existe quelques restrictions sur les noms d'oprateurs : -- et /* ne peuvent pas apparatre quelque part dans un nom d'oprateur car ils seront pris pour le dbut d'un commentaire. Un nom d'oprateur plusieurs caractres ne peut pas finir avec + ou -, sauf si le nom contient aussi un de ces caractres : ~!@#%^&|`? Par exemple, @- est un nom d'oprateur autoris mais *- ne l'est pas. Cette restriction permet PostgreSQL d'analyser des requtes compatibles avec SQL sans requrir des espaces entre les jetons.

3.3.5 - Commentaires
Un commentaire est une squence arbitraire de caractres commenant avec deux tirets et s'tendant jusqu' la fin de la ligne, par exemple :
-- Ceci est un commentaire standard en SQL

Autrement, les blocs de commentaires style C peuvent tre utiliss :


/* commentaires multilignes * et imbriqus: /* bloc de commentaire imbriqu */ */

o le commentaire commence avec /* et s'tend jusqu' l'occurrence de */. Ces blocs de commentaires s'imbriquent, comme spcifi dans le standard SQL mais pas comme dans le langage C. De ce fait, vous pouvez commenter des blocs importants de code pouvant contenir des blocs de commentaires dj existants.

3.3.6 - Prcdence lexicale


Le tableau 4 affiche la prcdence et l'associativit des oprateurs dans PostgreSQL. Oprateur/lment . :: [] ^ */% +IS ISNULL NOTNULL (autres) IN BETWEEN OVERLAPS LIKE ILIKE SIMILAR <> = NOT AND OR Associativit gauche gauche gauche droite gauche gauche gauche Description sparateur de noms de table et de colonne conversion de type, style PostgreSQL slection d'un lment d'un tableau ngation unaire exponentiel multiplication, division, modulo addition, soustraction
IS TRUE, IS FALSE, IS UNKNOWN, IS NULL

gauche

droite droite gauche gauche

test pour NULL test pour non NULL tout autre oprateur natif et dfini par l'utilisateur appartenance un ensemble compris entre surcharge un intervalle de temps correspondance de modles de chanes infrieur, suprieur galit, affectation ngation logique conjonction logique disjonction logique

Tableau 4: Prcdence des oprateurs (en ordre dcroissant)

4 - PgAdmin III
L'utilisateur Administrateur est le seul qui a le droit de modifier l'installation : vous n'avez pas le droit de l'utiliser. Les autres utilisateurs sont munis de mots de passe transparents : le mot de passe est exactement le nom de l'utilisateur, en respectant majuscules et minuscules. Chaque utilisateur dispose d'un bureau adapt aux tches qu'il est cens accomplir et le rpertoire \ mes documents dpend de l'utilisateur connect. Vous devez vous connecter comme utilisateur bdX (X tant le numro indiqu sur le bord de votre cran). Nous utiliserons le langage PostgreSQL via l'interface pgAdmin III. PostgreSQL est un logiciel libre dadministration de la base de donnes. pgAdmin III est conu pour rpondre la plupart des besoins, depuis lcriture de simples requtes SQL jusquau dveloppement de bases de donnes complexes. Linterface graphique supporte les fonctionnalits de PostgreSQL les plus rcentes et fait de ladministration un jeu denfant. Il est disponible pour plusieurs systmes dexploitation, y compris MS Windows, GNU/Linux et FreeBSD. Le site est http://www.pgadmin.org/?locale=fr_FR

4.1 - Introduction
L'objectif est l'utilisation d'une base de donnes pour grer une liste de films avec l'anne de sortie ou de ralisation ainsi que le genre du film un peu comme IMDB Le nom donn cette base sera AMDB. Hypothses Un film a un seul titre, une seule anne de sortie et peut avoir un ou plusieurs genres. Trois tableaux seront utiliss : un comportant le nom des films, un autre les annes et un troisime les genres. Le tableau anne pourra servir d'autres relations avec d'autres tableaux dans le cas d'une extension de la base. Il faudra crer un 4me tableau pour les relations multiples entre les films et les genres ( Tab_film_genre). Relations entre les tables

Pour ajouter votre serveur la base de donne AMDB, faites un clic droite sur le nom de votre serveur dans le navigateur objet. Une fentre s'ouvre : indiquez le nom de votre nouvelle base de donnes puis validez.

4.2 - Cration de table


Dans AMDB/Schmas/public/ faites un clique droit sur Table pour crer votre 1re table. Puis : Ajoutez d'une table tabgenre (indiquez juste son nom) Slectionnez la table dans le navigateur d'objet Ajoutez des colonnes : idgenre : slectionnez le type de donnes srial pour l'incrmentation automatique, valider la commande par ok genre : le type de donnes est caractre non nul, avec un maximum de 40 caractres Crez une cl primaire : dans la partie contrainte slectionne Ajouter une cl primaire... clgenre : slectionnez comme colonne idgenre correspondant cl primaire. Visualisez votre premire table : clique droit sur votre table Afficher les donnes/Visualiser les 100 premires lignes . Il n'y a rien , seules les colonnes apparaissent. Notez que lors de la cration de la table, vous pouvez directement ajouter les colonnes et les contraintes. Le panneau sql affiche les commandes, pour la colonne idgenre nous observons :

-- Column: idgenre -- ALTER TABLE tabgenre DROP COLUMN idgenre; ALTER TABLE ALTER TABLE ALTER TABLE ALTER TABLE tabgenre ADD COLUMN idgenre integer; tabgenre ALTER COLUMN idgenre SET STORAGE PLAIN; tabgenre ALTER COLUMN idgenre SET NOT NULL; tabgenre ALTER COLUMN idgenre SET DEFAULT nextval('tabgenre_idgenre_seq'::regclass);

Crez la table tabanne qui a : 2 colonnes : idann de type serial, anne de type entier, et une contrainte clanne cl primaire sur le colonne idanne; et enfin la table tabfilm qui a : 3 colonnes : idfilm : type serial, titre : type 40 caractres, annesortie : type entier (cl etrangre, pointe sur la tabanne). une contrainte clfilm de cl primaire sur la colonne idfilm

4.3 - Crer une cl trangre


4.3.1 - Relation 1-n entre deux tables
Entre film et anne : nous avons une seule anne de sortie pour un film et plusieurs films pour une anne. C'est pourquoi, nous avons crer une colonne du type annesortie dans tabfilm. La colonne annesortie de la table tabfilm va pointer sur la clanne de tabanne type de relation n 1. La cl trangre est cre dans la table ou il y a plusieurs . Pour cela crer une contrainte cl trangre dont le nom sera keyanne et la rfrence la table tabanne. Notons que les colonnes Annesortie et clanne sont de mme type (entier).

4.3.2 - Relation n-n entre deux tables


Entre film et genre : nous avons plusieurs genres pour un film et plusieurs films pour un genre. C'est une relation n-n nous avons donc besoin d'une table intermdiaire. Pour cela : Crez une table intermdiaire ou de jointure tab_film_genre avec : 3 colonnes : key : de type serial film : de type entier genre : de type entier 3 contraintes : une cl primaire sur la colonne key une cl trangre ayant pour nom titre, rfrence la table tabfilm et dont la colonne locale est film rfrence par la cl idfilm de tabfilm. une cl trangre ayant pour nom genre, rfrence la table tabgenre et dont la colonne locale est genre rfrence par la cl idgenre de tabgenre.

4.4 - Insrer les donnes dans les tables


Pour insrer des donnes dans une table nous pouvons utilise la fonction script : cliquer sur l'icne SQL. Pour insrer de nouvelle donne, nous crivons dans la nouvelle fentre des requtes SQL. On indique le nom du tableau et ensuite les valeurs dans l'ordre des colonnes
idgenre = 1 et genre = comdie INSERT INTO tabgenre VALUES ( 1,'comdie');

ou uniquement la valeur de genre, idgenre sera automatiquement incrment :


INSERT INTO tabgenre(genre) VALUES ( 'drame');

En visualisant la table tabgenre, vous pouvez observer vos deux nouvelles lignes. Ajouter les genres suivants : policier, horreur, aventure, histoire et fict ion'.

Pour la table tabanne, obtenez la table suivante :

Pour la table tab_film ajoutez les lignes suivantes : INSERT INTO tabfilm(titre,annesortie) VALUES ('Forge', 3); INSERT INTO tabfilm(titre,annesortie) VALUES ( 'Star', 4); INSERT INTO tabfilm(titre,annesortie) VALUES ( 'histoire', 2); INSERT INTO tabfilm(titre,annesortie) VALUES ( 'Soleil', 1); Observez que la valeur de l'annesortie est une cl de la table tabanne. Pour la table tab_film_genre ajoutez les lignes suivantes : INSERT INTO tab_film_genre(film,genre) VALUES ( 4,2); INSERT INTO tab_film_genre(film,genre) VALUES ( 1,1); INSERT INTO tab_film_genre(film,genre) VALUES ( 1,4); INSERT INTO tab_film_genre(film,genre) VALUES ( 3,2); INSERT INTO tab_film_genre(film,genre) VALUES ( 2,3); INSERT INTO tab_film_genre(film,genre) VALUES ( 2,6); INSERT INTO tab_film_genre(film,genre) VALUES ( 1,1);

4.5 - Requtes
4.5.1 - Afficher le contenu d'une seule table
Affichez via des requtes SQL, les informations suivantes : la table tabanne la colonne anne de la table tabanne les anne suprieur 2001 de la table tabanne la table anne trier en ordre chronologique la colonne genre de la table tabgenre en ordre alphabtique le nombre de film de la table tabfilm

4.5.2 - Afficher le contenu de deux tables lies par une cl trangre


Affichez via des requtes SQL, les informations suivantes : l'ensemble des films avec leur anne de sortie l'ensemble des films avec leur anne de sortie, tri sur l'anne. L'ensemble des films avec leur anne de sortie, sortis en 2002. l'ensemble des films avec leur anne de sortie, sortie depuis 2001.

4.5.3 - Afficher le contenu de deux tables lies par une table intermdiaire de type n-n
Affichez via des requtes SQL, les informations suivantes : l'ensemble des films et de leurs genres, tris en ordre alphabtique des films; l'ensemble des films et de leurs genre, tris en ordre alphabtique des genres; l'ensemble des films dont le genre est drame; le nombre de film dont le genre est drame;

5 - Annexe
5.1 - Commandes SQL
ABORT Interrompre la transaction en cours ALTER AGGREGATE Modifier la dfinition d'une fonction d'agrgat ALTER CONVERSION Modifier la dfinition d'une conversion ALTER DATABASE Modifier une base de donnes ALTER DOMAIN Modifier la dfinition d'un domaine ALTER FUNCTION Modifier la dfinition d'une fonction ALTER GROUP Modifier le nom d'un rle ou la liste de ses membres ALTER INDEX Modifier la dfinition d'un index ALTER LANGUAGE Modifier la dfinition d'un langage procdural ALTER OPERATOR Modifier la dfinition d'un oprateur ALTER OPERATOR CLASS Modifier la dfinition d'une classe d'oprateur ALTER OPERATOR FAMILY Modifier la dfinition d'une famille d'oprateur ALTER ROLE Modifier un rle de base de donnes ALTER SCHEMA Modifier la dfinition d'un schma ALTER SEQUENCE Modifier la dfinition d'un gnrateur de squence ALTER TABLE Modifier la dfinition d'une table ALTER TABLESPACE Modifier la dfinition d'un tablespace ALTER TEXT SEARCH CONfiGURATION modifier la dfinition d'une configuration de recherche plein texte ALTER TEXT SEARCH DICTIONARY modifier la dfinition d'un dictionnaire de recherche plein texte ALTER TEXT SEARCH PARSER modifier la dfinition d'un analyseur de recherche plein texte ALTER TEXT SEARCH TEMPLATE modifier la dfinition d'un modle de recherche plein texte ALTER TRIGGER Modifier la dfinition d'un dclencheur ALTER TYPE Modifier la dfinition d'un type ALTER USER Modifier un rle de la base de donnes ALTER VIEW modifier la dfinition d'une vue ANALYZE Collecter les statistiques d'une base de donnes BEGIN Dbuter un bloc de transaction CHECKPOINT Forcer un point de vrification dans le journal des transactions CLOSE Fermer un curseur CLUSTER Rorganiser une table en fonction d'un index COMMENT Dfinir ou modifier le commentaire associ un objet COMMIT Valider la transaction en cours COMMIT PREPARED Valider une transaction pralablement prpare en vue d'une validation en deux phases COPY Copier des donnes depuis/vers un fichier vers/depuis une table CREATE AGGREGATE Dfinir une nouvelle fonction d'agrgat CREATE CAST Dfinir un transtypage CREATE CONSTRAINT TRIGGER Dfinir un nouveau dclencheur sur contrainte CREATE CONVERSION Dfinir une nouvelle conversion d'encodage CREATE DATABASE Crer une nouvelle base de donnes CREATE DOMAIN Dfinir un nouveau domaine

CREATE FUNCTION Dfinir une nouvelle fonction CREATE GROUP Dfinir un nouveau rle de base de donnes CREATE INDEX Dfinir un nouvel index CREATE LANGUAGE Dfinir un nouveau langage procdural CREATE OPERATOR Dfinir un nouvel oprateur CREATE OPERATOR CLASS Dfinir une nouvelle classe d'oprateur CREATE OPERATOR FAMILY dfinir une nouvelle famille d'oprateur CREATE ROLE Dfinir un nouveau rle de base de donnes CREATE RULE Dfinir une nouvelle rgle de rcriture CREATE SCHEMA Dfinir un nouveau schma CREATE SEQUENCE Dfinir un nouveau gnrateur de squence CREATE TABLE Dfinir une nouvelle table CREATE TABLE AS Dfinir une nouvelle table partir des rsultats d'une requte CREATE TABLESPACE Dfinir un nouvel tablespace CREATE TEXT SEARCH CONFIGURATION dfinir une nouvelle configuration de recherche plein texte CREATE TEXT SEARCH DICTIONARY dfinir un dictionnaire de recherche plein texte CREATE TEXT SEARCH PARSER dfinir un nouvel analyseur de recherche plein texte CREATE TEXT SEARCH TEMPLATE dfinir un nouveau modle de recherche plein texte CREATE TRIGGER Dfinir un nouveau dclencheur CREATE TYPE Dfinir un nouveau type de donnes CREATE USER Dfinir un nouveau rle de base de donnes CREATE VIEW Dfinir une vue DEALLOCATE Dsaffecter (librer) une instruction prpare DECLARE Dfinir un curseur DELETE Supprimer des lignes d'une table DISCARD Annuler l'tat de la session DROP AGGREGATE Supprimer une fonction d'agrgat DROP CAST Supprimer un transtypage DROP CONVERSION Supprimer une conversion DROP DATABASE Supprimer une base de donnes DROP DOMAIN Supprimer un domaine DROP FUNCTION Supprimer une fonction DROP GROUP Supprimer un rle de base de donnes DROP INDEX Supprimer un index DROP LANGUAGE Supprimer un langage procdural DROP OPERATOR Supprimer un oprateur DROP OPERATOR CLASS Supprimer une classe d'oprateur DROP OPERATOR FAMILY Supprimer une famille d'oprateur DROP OWNED Supprimer les objets de la base possds par un rle DROP ROLE Supprimer un rle de base de donnes DROP RULE Supprimer une rgle de rcriture DROP SCHEMA Supprimer un schma DROP SEQUENCE Supprimer une squence DROP TABLE Supprimer une table DROP TABLESPACE Supprimer un tablespace DROP TEXT SEARCH CONFIGURATION Supprimer une configuration de recherche plein texte DROP TEXT SEARCH DICTIONARY Supprimer un dictionnaire de recherche plein texte DROP TEXT SEARCH PARSER Supprimer un analyseur de recherche plein texte DROP TEXT SEARCH TEMPLATE Supprimer un modle de recherche plein texte DROP TRIGGER Supprimer un dclencheur

DROP TYPE Supprimer un type de donnes DROP USER Supprimer un rle de base de donnes DROP VIEW Supprimer une vue END Valider la transaction en cours EXECUTE Excuter une instruction prpare EXPLAIN Afficher le plan d'excution d'une instruction FETCH Rcuprer les lignes d'une requte l'aide d'un curseur GRANT Dfinir les droits d'accs INSERT Insrer de nouvelles lignes dans une table LISTEN Attendre une notification LOAD Charger ou dcharger une bibliothque partage LOCK verrouiller une table MOVE positionner un curseur NOTIFY engendrer une notification PREPARE prpare une instruction pour excution PREPARE TRANSACTION prpare la transaction en cours pour une validation en deux phases REASSIGN OWNED Modifier le propritaire de tous les objets de la base appartenant un rle spcifique REINDEX reconstruit les index RELEASE SAVEPOINT dtruit un point de sauvegarde prcdemment dfini RESET rinitialise un paramtre d'excution sa valeur par dfaut REVOKE supprime les droits d'accs ROLLBACK annule la transaction en cours ROLLBACK PREPARED annule une transaction prcdemment prpare en vue d'une validation en deux phases ROLLBACK TO SAVEPOINT annule les instructions jusqu'au point de sauvegarde SAVEPOINT dfinit un nouveau point de sauvegarde l'intrieur de la transaction en cours SELECT rcupre des lignes d'une table ou d'une vue SELECT INTO dfinit une nouvelle table partir des rsultats d'une requte SET change un paramtre d'excution SET CONSTRAINTS initialise le mode de vrification de contrainte de la transaction en cours SET ROLE initialise l'identifiant utilisateur courant de la session en cours SET SESSION AUTHORIZATION Initialise l'identifiant de session de l'utilisateur et l'identifiant de l'utilisateur actuel de la session en cours SET TRANSACTION initialise les caractristiques de la transaction actuelle SHOW affiche la valeur d'un paramtre d'excution START TRANSACTION dbute un bloc de transaction TRUNCATE vide une table ou un ensemble de tables UNLISTEN arrte l'coute d'une notification UPDATE mettre jour les lignes d'une table VACUUM rcupre l'espace inutilis et, optionnellement, analyse une base VALUES calcule un ensemble de lignes

5.2 - Applications client de PostgreSQL


clusterdb Grouper une base de donnes PostgreSQL createdb Crer une nouvelle base de donnes PostgreSQL createlang Dfinir un langage procdural sous PostgreSQL createuser Dfinir un nouveau compte utilisateur PostgreSQL dropdb Supprimer une base de donnes PostgreSQL droplang Supprimer un langage procdural dropuser Supprimer un compte utilisateur PostgreSQL ecpg Prprocesseur C pour le SQL embarqu pg_config rcuprer des informations sur la version installe de PostgreSQL pg_dump sauvegarder une base de donnes PostgreSQL dans un script ou tout autre fichier d'archive pg_dumpall extraire une grappe de bases de donnes PostgreSQL dans un fichier de script pg_restore restaure une base de donnes PostgreSQL partir d'un fichier d'archive cr par pg_dump psql terminal interactif PostgreSQL reindexdb reindexe une base de donnes PostgreSQL vacuumdb rcupre l'espace inutilis et, optionnellement, analyse une base de donnes PostgreSQL

5.3 - Applications relatives au serveur PostgreSQL


initdb Crer un nouveau cluster ipcclean Supprimer la mmoire partage et les smaphores d'un serveur PostgreSQL victime d'un arrt brutal pg_controldata afficher les informations de contrle d'un groupe de bases de donnes PostgreSQL pg_ctl dmarrer, arrter ou redmarrer le serveur PostgreSQL pg_resetxlog rinitialiser les WAL et les autres informations de contrle d'une grappe de bases de donnes PostgreSQL postgres Serveur de bases de donnes PostgreSQL postmaster Serveur de bases de donnes PostgreSQL

Vous aimerez peut-être aussi