Académique Documents
Professionnel Documents
Culture Documents
Support de cours de base de donnes de la filire MMIC de l'IUT de Mesures Physiques d'Orsay 2008-2009
1 - Intrts
Dans de nombreuses entreprises, associations, sites, vous pouvez trouver des bases de donnes. Pourquoi un tel engouement?
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).
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. . .
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.
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).
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.
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.
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 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.
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 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
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 ).
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.
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
Tableau 1: Il y a redondance ( et donc risque d'incohrence) dans les colonnes constructeur et modle
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.
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).
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
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.
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)
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)
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
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).
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;
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.
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;
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;
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;
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;
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 )
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.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';
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.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,);
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;
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.
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).
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';
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
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
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.
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
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.
-- 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
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 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.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