Professional Documents
Culture Documents
donnes
Ingnierie des
bases de donnes
Hypercube c,d
OLAP
Fascicule 3
VolumeI
Langage SQL, indexation et vue relationnelle
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Volume 1
Fascicule 1
1- Introduction 1
2- Architecture fonctionnelle du SGBD 20
3- Modle conceptuel des donnes 79
- Index
Fascicule 2
Volume 2
Fascicule 3
7- Langage de donnes SQL 1
8- Indexation, vue relationnelle et base ractive 123
- Index
Fascicule 4
9- Langage de programmation et SQL 1
10- Thorie de la normalisation relationnelle : les formes normales FN1 FN5
45
11- Optimisation des requtes relationnelles 117
Annexes :
A- SQLoader
B- Projet ALU-Nord : Script de chargement des donnes
- Index
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 5
Chapitre7
LangagededonnesSQLDDL,DMLetlesrecherches
Dans les sections prcdentes, les lments au langage SQL ont t prsents afin
dillustrerlesformulationsquivalentesauxoprateursalgbriques.LafacetteDDLdu
langage a aussi t prsente avec plusieurs dtails afin de pouvoir crer et formuler
correctement les contraintes des tables. Dans ce chapitre, nous approfondirons les
clauses SQLDDL en examinant quelques paramtres qui ont trait aux structures
physiques et nous poursuivrons ltude du langage de requte SQL, en accentuant
davantage les diverses fonctions disponibles dans ce langage sans gard leur
implmentation dans un SGBD particulier. Encore ici, de nombreux exemples sont
formulsavecleSQLimplmentparOracle,lequelcorrespondpeuprsauniveau2
de la norme SQL92. Nous tudierons en dtails limplmentation Oracle de certaines
notionsquisontparticulirescelogicielSGBD.Cependant,notretudedborderales
limites imposes par Oracle pour discuter aussi de plusieurs autres notions et
implmentationspropresdautresSGBD.
7.1LangageSQLetlexploitationdelabasededonnes
LelangagededonnesSQLcrdanslesannes70dcouledestravauxdunequipede
chercheursdelasocitIBMquitravaillaitlamiseaupointdeslangagesdedonnes
SQUARE et SEQUEL dans le cadre du dveloppement du systme R, prcurseur de
plusieurs SGBD relationnels, notamment du systme SGBD DB2. Lacronyme SQL
signifie Structured Query Language. Cest un langage mots cls rservs. Il est non
procdural dans sa formulation, masquant assez bien le caractre algbrique des
expressionssyntaxerelativementsimple,maisafficheunefacettedelangagenaturel,soit
langlaislmentaire.LelangageSQLafaitlobjetdeplusieurseffortsdenormalisation
qui ont dbut de faon srieuse en 1989 et qui se poursuivent toujours. Toute norme
SQL publie peut tre implante divers niveaux, selon les choix faits par le
dveloppeur du SGBD. Trois niveaux sont possibles : minimal (1), intermdiaire (2) et
complet (3). Ce dernier niveau doit respecter intgralement la norme SQL. Il y a
plusieurs normes SQL, chacune enrichissant la version prcdente : SQL89, SQL92 et
SQL93.
LimplantationdeSQLparlasocitOracleestfortementsimilairelanormeISOSQL
92deniveau2.IlenestdemmeaussipourlesystmeWATCOMSQL.LelangageSQL
comportetroisfacettesfortementintgrespeuimporteleSGBDrelationnel:
a)DDL(DataDefinitionLanguage),pourladfinitiondestables,descontraintesdiverses
etdesvuesrelationnellesstockesdansledictionnaireduSGBD.
b) DML, (Data Manipulation Language) pour la manipulation des tables et plus
prcismentlesmanipulationsdestuplesderelations.
c) DCL, (Data Control Language) pour grer la dfinition physique des accs (index), la
spcification des fichiers physiques et la validation des oprations excutes dans un
contextemultiposte.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 6
SQLetlesautreslangagesL3G
Le langage SQL (Oracle) est utilis de faon autonome et interactive (au moyen du
moduleSQL*Plusinteractif).IlestaussiutilisdanslesblocsdePL/SQL(SQLintgr
unlangageprocduralinteractifdeOracle)etdanslesapplicationsmisesaupointavec
lesL3GgrceauxAPI(interfacesdeprogrammationpourlesapplications).Finalement,
leSQLdynamiquepermetlaformulationderequtesdontlaspcificationcompltene
seraconnuequaumomentdelexcution.
SQL*Plus(rappelsurcetteapplication)
Les clauses du langage SQL de Oracle sont prises en charge par le module utilitaire
SQL*Plus qui les rceptionne et les transmet linterprteur de SQL qui est un service
intgrduSGBD.Aprslecalculdelarponse,lemoduleSQL*Plusreoitlestupleset
les affiche selon des paramtres qui peuvent tre fixs par lutilisateur au moyen de
directivesparticulires.IlyadautresmodesdinteractionavecleSGBD,notammentpar
lentremise des applications dveloppes en langage de troisime gnration (L3G) et
utilisantlinterfaceAPIappeleOCIchezOracle.
DirectivesSQL*Plus
BD
SQL*Plus
SGBD
Tampon
client
serveur SQL*Plus
Figure7.1
UtilitaireSQLPlusetscriptdexcution
LapplicationutilitaireSQLPlusestincontournablepourlamiseaupointetlexcution
enlignedesclausesSQL.CetteutilitaireSQL*Pluscomporteplusieursdirectives:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 7
Enoutre,ilestpossibledenregistrerunetracecompltedelaffichageavecladirective
SPOOL:
SPOOL C:\trace.4juillet -- trace dans un fichier
SPOOL ON -- dbut de la trace
SPOOL OFF -- pour terminer la trace; spool ON pour
redmarrer
Unfichierdedirectivesesttrsutilepourobtenirlenvironnementdsiretcela,dsle
dbut dune session de travail. Voici un exemple dun tel fichierscript qui est excut
parladirective:
START:environbd3.sql)
Danslefichierscript,ilfautinsrerlescommandeset/oulesdirectivessuivantes:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY',
ALTER SESSION SET NLS_LANGUAGE_FORMAT = french
COLUMN NOM FORMAT A25
.../*liste des formats requis pour laffichage des
colonnes*/
LesdirectivesdumoduleSQL*Plussontrsumesdansletableaucidessous.
APPEND* Ajoutdetextelafindelalignecourante
CHANGE Changementdetextedansuneligne
CLEAR Supprimerlecontenudutamponcourant
DEL Supprimerlalignecourante
DESCRIBE Listeduschmadunetable
GET Lecturedunfichierdansletampon
HOST<commande> ExcutiondunecommandedelOS(hte)
LIST Afficherlecontenudutamponcourant
RUN*** Excutiondelacommandeouduscriptrangdansle
tamponcourantdelapplicationSQL*Plus
SAVE<fichier.sql> crituredetamponcourantdansunfichier
SPOOL<fichier.sql> crituredelatracedelcrandansunfichier
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 8
*Lesdirectivesetlescommandespeuventtrecritesindiffremmentenmajusculesou
minuscules.
Fonctionsdudictionnairededonnes
Ledictionnairededonnes(DD)dunsystmerelationnelestimplantcommeunebase
dedonnesdummetype.Lesstructuresdedonnesutilisessontlesmmesquecelles
utilises pour stocker les donnes transactionnelles. Le dictionnaire contient les
mtadonnes ncessaires pour dfinir notamment les tables de la base de donnes. Le
dictionnaire de donnes joue un rle central dans le fonctionnement du SGBD
relationnel. Son contenu est rang ds le dmarrage dans la RAM, accessible en ligne
parlenoyauduSGBD.Lestablesdudictionnaireserventdiversesfonctions:
d)Participationlascuritetlintgritdelabaseenstockantlesdroitsdaccsdes
utilisateursauxtablesdebase,auxvuesetauxespacesdedonnes.
e)Rpartitiondesdonnesaumoyendesliensentrelesbasesquisontspcifiesdansle
dictionnaireetleurlocalisationgographique.
Introductionlorganisationdesespacesphysiquesetlogiquesdelabasededonnes
Oracle
La base de donnes Oracle est dfinie comme un ensemble de tables (relations)
appartenant au compte crateur des tables qui a gnralement la proprit du DBA.
Lunicitdunomdunetableestassureparladjonctionautomatiqueduprfixeform
avec le numro de compte de lutilisateur propritaire. La rpartition des donnes sur
plusieursserveursestpriseenconsidrationparlesmtadonnesdudictionnairesurla
localisation, notamment les liens de placement. Lensemble des dfinitions de table
correspondauschmadelabasededonnesquiestexprimenSQLDDL.
7.2ObjetsOracle
Un objet ou plus prcisment une entit de la base de donnes Oracle, est la notion
utilisepourreprsenterleslmentssuivants:leschmaderelation,lextensiondune
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 9
Compte4.r1
Dictionnaire de
donnes, schmas,
Compte5.r2
procdures,
Compte6.r2
BD SGBD
Instance1
Figure7.2
EspacedestockageOracle
Une relation du MRD est implmente par une structure de table dfinie comme une
listedepagesphysiquesappartenantuntablespacedfinietassociunouplusieurs
fichiers grs par le systme d,exploitation du serveur. Chaque table ne contient
gnralement que des tuples de mme schma. Il y a une exception avec les tables
stockesdansuncluster.Unextentestlunitdallocationdelespaceetlesextentsdune
mmetableformentunsegment.
Piage
Page
i i+1
extent1 extent2
Structurephysiquedetable:pagesenchanes
Figure7.2a
Chaque table dun schma appartient au compte (Oracle) qui la cre. Par dfaut, le
nom complet dune table est form du nom du compte suffix par le nom de la table:
compteChef. Tous les droits daccs sur une table sont acquis automatiquement par le
propritaire de la table qui peut cependant les partager en propageant aux autres les
droits daccs appropris (commande GRANT). Une table Oracle est accessible par
diverses interfaces relationnelles, notamment via le module SQL*Plus, le langage
procduralPL/SQLetlinterfacedeprogrammationdesapplications(API)utilisantun
langagedetroisimegnration.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 10
Organisationlogiquedesespacesdestockagepourlesdonnesetlesindex
La structure de lespace physique dune base de donnes est dfinie par le DDL au
moyen de plusieurs paramtres qui spcifient lallocation initiale de lespace pour une
table,mmeceluidutablespaceauquellatableseraassocie.Lesdonnesdusystme
Oraclesontstockesviadesespaceslogiques,appelsespacesdetable(tablespaces)(TS),
chacun compos de segments, euxmmes composs de lots homognes et contigus
doctetsappelsextents.Cesespacessontutilisspourstockernotammentlestables,les
index,lesclustersetlesdonnesdessegmentsderecouvrementtransactionnel(rollback).
Fichier Fichier
BB A
EspacedetableAB
Segment1 Segment2
Extent1 Extent2 Extent3 Extent4
pages
Figure7.2b
Uneextentestdfinicommeuneunitdallocationdelespacephysique.Lesextentsdun
segmentpeuventtredisperssetchans.Surleplandelespacephysique,unextentest
form de pages contigus (blocs Oracle). Finalement, une page est constitue de
plusieurs blocs du systme dexploitation hte, blocs dont la taille est fixe lors de la
cration de la base de donnes. Lespace physique dune base de donnes peut tre
augmentparleDBA,parlajout,entouttemps,dunoudeplusieursfichiersdansun
espacedetableparticulier.
PageOracle
UnepageOracleestunesuitedeblocsphysiquesconstitusdoctetscontigus(1K16
K). La taille dune page est fixe la cration de la base de donnes par le paramtre
DB_BLOCK_SIZE initialis dans le fichier INIT.ORA. Une page contient normalement
destuplesdontlastructureesthomogne,i.e.appartenantuneseuletable,saufpour
lespagesdecluster.Cespagesontunestructureparticulirepermettantdyrangerdes
tuplesenprovenancedaumoinstablesdiffrentes.
Espacedetable(tablespace)
Toute entit ou tout objet dans une base de donnes relationnelle est range dans une
tablequiestellemmeplacedansunespacedetableparticulierappeltablespace.Cet
espace sur disque est associ un fichier physique. Le compte Oracle SYS est, la
cration de la base de donnes, le propritaire initial des objets du dictionnaire et de
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 11
certaines autres tables utilises en cours dexploitation pour stocker les mtadonnes
traitantdelaperformanceetdelexploitationdestables.
PCTFREE+PCTUSED<100
Dans ce rpertoire, on trouve une entre o est inscrit un dplacement (offset) dans la
page qui est en quelque sorte un pointeur sur le dbut du tuple. Lors dune
rorganisationdelapage,lestuplessontdplacsverslebasafindercuprerlespace
libre.Seulslesdplacementssontmodifis,tandisquelerid(soitleTIDpourIngreset
leROWIDpourOracle)demeureconstant,vitantainsidefairelamisejourdesindex
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 12
Figure7.4
Le rle du paramtre PCTFREE est de rduire le chanage des parties de tuples dune
page lautre. Cette fragmentation dun tuple devrait se faire pour raliser une mise
jour qui exige un espace plus grand non disponible ladresse actuelle. la cration
dune page, le paramtre PCTFREE indique le pourcentage de la page garder en
rserve pour y reloger les tuples mis jour. Le paramtre PCTUSED permet de
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 13
Les tuples des tables et des index peuvent cohabiter ou non dans le mme espace de
tabletoutentantrangsobligatoirementdansdessegmentsdiffrentsetdoncdansdes
extensions diffrentes. Dans une extension donne, il ny a donc que des pages de
donnes de tables ou dindex et non les deux. Dans les deux cas, les paramtres
PCTFREEetPCTUSEDsontutilisspourlagestiondelespacedelapage.Aveclindex,
leparamtrePCTFREEdoittreassezgrandpourunetableindexe,surtoutlorsquele
taux de mise jour est lev. En effet, tout ajout de tuples dans une table indexe
entrane une mise jour de lindex, donc une augmentation de la taille des entres,
notammentpourlesindexsurlesattributsdetypechane.Cecientranerapidementun
dbordementdanslazonelibre.Pourviterlechanagedestuplesquiralentitlalecture,
il faut prvoir dans chaque page un espace libre un peu plus grand pour les pages
destinesstockerlesindex.
Pageinsrable
Une page a le statut dinsrable si le SGBD est autoris y ajouter encore des tuples,
sinon elle a le statut de page non disponible. Lorsque loccupation dune page est telle
quelespacerestantcorrespondlespacerservparlePCTFREE,lapageestenlevede
lalistedespagesinsrables(freelist).Ellenepeutplusrecevoirdenouveauxtuples,mais
on peut toujours mettre jour les tuples prsents en utilisant la zone libre ou de
dbordement.Parcontre,lorsquelessuppressionsetlesmodifications(changementde
la valeur dun attribut qui fait passer sa taille de 450 40 caractres ou la mise jour
dun attribut null) ramnent lespace occup en dessous de la valeur PCTUSED pour
cettepage,celleciestrinscritedanslalistedespagesinsrablesetdenouveauxtuples
peuvent y tre ajouts. Lorsquun tuple est ajout dans une page, il est possible que
lespaceoccupdpasselePCTUSED,etcela,tantquelalimiteduPCTFREEesttoujours
respecte. Cette situation peut se produire si PCTUSED + PCTFREE < 100. Lorsque les
paramtresPCTUSEDetPCTFREEnesontpasadaptslenvironnementdexploitation
de la base de donnes, cela conduit des changes de pages supplmentaires inutiles
entre le disque et la ZMP (Zone de Mmoire Partage). Pour une exploitation avec un
faible taux de rorganisation et de mise jour, le facteur PCTUSED devrait tre de
lordrede80etlePCTFREEde10.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 14
Migrationdestuples
Lorsquuntupleestmodifietquilnepeutpastrereplacdanssonespacedorigine,le
systmecherchelerangerenentierdanslespaceduPCTFREE(zonededbordement)
etuneadressedesuiviestplacedanslespacedorigineafindegarderladressageinitial
fonctionnelpourlesindex.
Tuple modifi et
placdanslazonede
dbordement
Figure7.5
Ainsi, les entres dindex sur cette table pointent toujours au mme rid (ou rowid) et
danslammepageetcela,mmesiletuplepointatdplac.Letraitementdesindex
incorpore celui du suivi dun tuple au fil de ses adresses de dplacement. Cest la
migrationdestuples.Pourlireunteltuple,lesystmenapaseffectuerunaccsdisque
supplmentaire puisquil se trouve dans lespace de dbordement de la mme page.
AprslinsertiondutupledanslespacePCTFREE(dbordement),lespacedoriginenest
occupqueparuneadressedesuivietlerestedecetespacepourratreventuellement
rcuprpouryplacerlesdonnesdunautretuple.Siletuplemodifinepeutpastre
rang dans lespace du PCTFREE, il est dplac entirement dans une nouvelle page
insrableetlanouvelleadresseestaussirangedanssonemplacementinitialafinden
permettrelesuivipartirdesindexexistants,quipointenttoujourssurlemplacement
dorigine.Linconvnientdecettegestionestquecelaobligefairedeuxlecturesaulieu
duneseulepouraccderautuplerecherch.
Fragmentationdesgrandstuplesetchanage
Unedeuximesolutionlagestiondestuplesplusencombrants(parexemplelestuples
avecunBLOB)consistelesdiviseretchanerleursparties.Lorsquuntuplemodifi
ne peut pas tre rang ni dans sa page dorigine ni dans une autre page de la base de
donnes,leserveurdiviseletupleenpartieschanesetchacuneserarangedansune
pageayantlespacesuffisant.
entte
PCTFREE
tuplerid:23:12 123:45
PCTUSED 56:77
Figure7.6
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 15
Cestlechanageduntuplequinintervientquelorsquelamigrationestimpossible.Le
chanage est aussi pnalisant parce quil faut faire plusieurs lectures sur disque pour
retrouverlapremirepartieetautantdelecturessupplmentairespourlirelesautres.
Placementdesdonnes:regroupement
La notion de regroupement des tuples (dans une structure de cluster) concerne
gnralement plusieurs tables qui partagent les pages dun mme segment spcial
appelcluster.
45::::23:34 Entte
Valeurdeclducluster= du
(45)::::23:67
cluster
45,jacques,75
75,patricia,45
Figure7.6a
Ces tuples cohabitent parce quils ont en commun des valeurs dattributs de
regroupement (key cluster attributes) et quils sont souvent utiliss par les applications
dansuneoprationdejointure.tantlogsdanslesmmespages,lavrificationdela
condition de jointure sera faite plus rapidement parce quils seront accessibles sans
ncessiterdchangesdepagessupplmentairesentrelenoyauduSGBDetledisquedes
donnes.Onpeutconcevoirlastructurelogiquedunclustercommeayantunrpertoire
dentte construit avec les valeurs partages par deux tuples de tables diffrentes.
Chaqueentredurpertoirepointesurlesdeuxtuplesaumoyendedeuxrid.Uncluster
peutaussitredfinipournelogerquelestuplesdunemmetable,enlesregroupant
selonlavaleurdunattributparticulier.
Rappeldequelquesnotionssurlesarbresutilissparlesindex
LesindexutilissparOracle2ontgnralementunestructureenB*arbre.Ilssontrangs
dans des tables, ellesmmes places dans un segment ddi un index et
ventuellementdansunespacededonnes(tablespace)spcialis,crparleDBA.Cette
structureestdutypeindexhirarchique:lesfeuillespointentsurlesadressesrids(ou
encore ROWID) des tuples indexs par un attribut dont les valeurs indexes sont
regroupes et ordonnes dans une cellule terminale (feuille). Chaque cellule terminale
est indexe au niveau suprieur qui contient un pointeur de plus que le nombre de
valeursdanslacellule.Parexemple,larecherchedutupleindexparlavaleur76dbute
laracine,parlexamendelapremireetdeladernireentrepourdterminerlesous
arbreexplorer.Lepremierexamenindiquequilfautexplorerlesousarbremilieuetla
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 16
procdure se poursuit ainsi jusqu latteinte du dernier niveau. Une telle structure
arborescente est garde quilibre par une procdure de mise jour et la longueur
moyenneduchemindaccsnimportequeltupleestconstante.Pour106tuples,ilfaut
environcinqaccspourretrouveruntuple.Danslepiredescas,cinqlecturessurdisque
sontncessairespourobtenirautantdepages.
Chaqueclprimairespcifiedansunschmadetablegnresoitunindexinterne(du
type Systme), soit une procdure interne pour vrifier la contrainte de cl. Toutefois,
lindex systme peut tre dsactiv (disable), auquel cas lindex nest pas utilis pour
renforcer la contrainte dentit. La contrainte de NULL continue de sappliquer aux
attributs primaires. La cration dun index avec un attribut se fait par une commande
SQLDCL et suppose un tri des valeurs de la cl. Lopration sera effectue dans un
espace de mmoire temporaire gr par le SGBD. Un index cr par le DBA peut tre
supprim volont et refait plus tard. Dans certains cas, le DBA peut accorder un
utilisateur le droit de crer un index. Si une telle structure est intressante pour la
recherche,ellegnesouventlamisejour.Eneffet,lajoutdunnouveautupleindex
par la valeur 9 implique une insertion de la cl dindexation dans la cellule rfrence
par le pointeur droit de la cl 3 (voir Figure 7.8). Or, cette cellule tant dj sature, la
cellulecibleseradiviseetlavaleurmdianeinsreauniveausuprieurparlamme
procdure.Cesoprationsexigentdesaccsauxdisquesquiralentissentlesoprations
daccslabasededonnes.Lemaintiendelquilibredelarbreesttoutefoisassuret
rpartientrelesdiffrentesoprationssurlabasededonnes.
7.3Barbre
Le Barbre dorigine est construit partir de la racine et il est gr pour demeurer
toujoursquilibr,i.e.avecunehauteurpeuprsconstante(Figure7.7).
21 81
tuple
3 12 35 52 85 91
1 2 13 19 37 39 82 84
5 10 23 26 55 62 90
87
Pointeur sur cls suprieures celles de
gaucheetinfrieurescellesdedroite.
Pointeursurtuple 95 99
Labsencedelaflcheindiquelabsencedepointeur.
Figure7.7
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 17
Lescellulesfeuillessontaussireliesparunchanagelatralafindefaciliterlebalayage
squentielpartieloucompletdestuplesdunetable.
Lescaractristiquesdecettestructuresontlessuivantes:
Unecellulecontientppointeursauxsousarbrestoujoursquilibrsetunmaximumde
(p1)cls.Larbreestditdordrep.
Le pointeur la gauche dune valeur de cl rfrence un sousarbre dont les cls sont
infrieuresougaleslacldunud;lepointeurladroitefaitrfrenceunsousarbre
dontlesclssontsuprieures.Lepointeursuruntupleestconstitudurid,cestdire
ladressedelapage.Cepointeurestinsrdanschaquenudetnonseulementdansles
feuilles.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 18
81
12 21
tuple
3 10 35 52 85 91
2 13 19 37 39 82 84
1
5 9 23 26 55 62 87 90
tuple
95 99
Figure7.8
Calculdelahauteurdunarbredordre3(avecp=3pointeursparcellule)
LahauteurdunBarbrepeuttreestimeparunsimpleraisonnementinductif:
niveauh=1:1cellule,3pointeurset2cls:30p0celluleetp0x(p1)cls
niveauh=2:3cellules,9pointeurset6cls:31p1cellulesetp1x(p1)cls
niveauh=39cellules,27pointeurset18cls:32p2cellulesetp2x(p1)cls
doncauniveauh:p(h1)(p1)>=n(onestlenombredetuples)
(h1)logp+log(p1)>=logn
h>=1+(lognlog(p1))aveclogdanslabasep(soitlordredelarbre).
Donclenombremoyendepagesluesdansunaccsestenvironlogpn(danslabasep).
Pourunarbredordrepluslev,parexemple50,lesgainsentermedaccssontencore
plussignificatifs:avec n=500000tuplesetp =50ona h4.Soit quatrelectures
ncessairespouratteindrelafeuillerecherchedansunBarbre.Danslecascouranto
lacelluleestunepage,ladresseserfrecelleci,larechercheduneclenmmoirese
faittrsrapidement.Eneffet,latailledunepage(8Ko)pourlacelluleconfreunordre
relativement lev larbre pour ainsi en diminuer sensiblement la hauteur une
constantegnralementinfrieure8.Labasepdulogarithmejoueunrlecritique.En
effet,pluspestgrand,pluslavaleurdulogdanslabasepestpetite.
AvantagesdelastructureenBarbre
LeBarbreoffreplusieursavantageslorsquilestutiliscommeindex:
Leparcoursmoyenpourtrouveruntupleestinfrieurlahauteurdelarbre.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 19
Ilnyapasderedondancedesclslasuiteduneduplicationdanslesfeuilles.
Lahauteurdunarbrepourindexerunnombrendedossiersestlammequelquesoit
lecheminparcouru.Pour2millionsdetuples,ilestdelordrede5accsaudisque.
InconvnientsduBarbre
Lajout et la suppression sont des oprations complexes en raison de la rorganisation
des nuds internes. Priodiquement, le DBA aura supprimer lindex et le recrer
pour compacter les entres. Les pointeurs aux tuples (8 octets) occupent lespace des
cellulesautrementoccuppardescls.Finalement,leparcourssquentieldestuplesest
parfoisdifficile,voireimpossibleouimpraticable,encasdabsencedechanagelatral
touslesniveauxetenraisondeladispersiondespagesquiexigeplusieurslecturessur
ledisque.
B*arbre
La structure du B*arbre est similaire celle du Barbre, mais les cls des cellules
intermdiaires sont aussi insres dans les feuilles avec le pointeur aux tuples, i.e. aux
donnes. Les nuds intermdiaires ne pointent pas sur les tuples. Il y a donc une
certaine rduction de la redondance, augmentant ainsi la densit des tuples dans les
pagesdedonnes.Leparcourssquentieldesfeuillesestpossibleaumoyendupointeur
dechanagelatral.
VariantesduBarbre
DeuxvariantesexistentpourleBarbre:
B+arbre : il correspond au Barbre classique avec des pointeurs aux tuples placs
uniquementdanslesfeuillesetunremplissagedescellulesquinedpassepaslamoiti
deleurcapacit.
B*arbre:ilestidentiqueauB+arbre,maisaveclagarantiedunremplissagedechaque
cellulenedpassantpaslesdeuxtiersdesacapacit.
Lenombrederorganisationsdescellulespeutdevenirimportant,surtoutlapproche
de la saturation des feuilles de larbre. Dans la pratique, lorsque cet tat est atteint au
coursdunemisejour,lesprocduresdegestiondelarbreamorcentimmdiatement
sa rorganisation en divisant le contenu de la cellule sature en deux parties et en
rallouant lespace pour une ou plusieurs nouvelles cellules du Barbre. Leffort de
rquilibrage est consenti au fur et mesure, par quanta rpartis, afin dviter
laccaparementdunoyauduSGBDauxtempsdunedemandeforteetdurantlesquelles
letravailderajustementralentiraitlesoprationsdanslabasededonnes.
Mcanismedeverrouillagedestuples
Normalement,unutilisateurdusystmeOracleexploitantdirectementlesdonnespar
lentremisedeSQL*Plus,soitparuneapplicationnapassesoucierduverrouillagedes
donnes.LagestiondesverrousestautomatiqueetassumeparleSGBDduserveur.Un
premierutilisateurquiaccdeunetableacquiertaussiunverroudexclusivitTX(ou
plussimplementX)surchaquetuplemodifiouinsretunverrouRXsurlatable.Le
verrouRX(RSenpremiersetransformantenRX)surunetableautoriselatransaction
fairedautresactionssurlestuplesdelatablequinesontpasencoreverrouillsparune
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 20
autretransaction.lafindelamisejourmarqueparunCOMMITtransactionnel,les
verrous sont automatiquement librs par le moteur dOracle. Le systme pose un
verrou au niveau des tuples, sauf si une application le demande explicitement par la
commande explicite LOCK TABLE. Le verrou contrle alors toute la table. Latomicit
dechaqueordreSQLestassureparleSGBDencesensquunordreestcompltouen
casderreur,dfaitentirement,etcela,sansinterventiondirectedelapplication.
7.4Associationdesespacesdetableaveclesfichiersphysiques
Lesespacesdetablenommstablespaces(TS)sontassocisdesfichiersphysiquesdun
OS lors de leur cration par le DBA. Les tables et les index sont crs et associs
explicitementunTSparticulierparunecommandeparticulireutiliseseulementpar
leDBA.
Unetablepeuttrerangeexplicitementdanscetablespace djcrparlacommande
DDLsuivante:
CREATE TABLE Usines(
no number(2) constraint cp_usines primary key,
libelle varchar2(45),
ville varchar2(60),
capacite number, -- par dfaut un entier de prcision
32
classe char(1))
TABLESPACE ESPACE_USER3;
Lespace de table est nomm et son espace maximal spcifi dans une commande
antrieure est de 50 Mo. Toutefois, lespace initial est de 50K et augmente, selon les
besoins, par quanta de 30 Ko. Toute table stocke dans cet espace de table aura les
caractristiques de stockage par dfaut. Normalement, lespace de table est cr par le
DBAetnonparlesdveloppeurs.Lacrationdunetablesefitdansunespaceprdfini
parleDBAetallouaucompteOraclepardfaut.
N.B. Si lespace de table nest pas fourni dans la commande CREATE TABLE ou
prdfinipardfaut,lesobjetssontrangsdanslespacedetableSYSTEM.
LessegmentsROLLBACKetlesINDEXsontaussicrsexplicitementparleDBA:
CREATE INDEX Usines_nom_idx On Usine(nom);
CREATE [PUBLIC] ROLLBACK SEGMENT segt25 TABLESPACE
TS_table10;
LacrationdunsegmenttemporaireesteffectueautomatiquementparleSGBDlorsde
son installation. Rappelons aussi que les segments de rollback sont ncessaires pour
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 21
effectuerleUNDOouleROLLBACKduneseuletransactionsanspourautantrecourir
aujournalinternequiestglobaltouteslestransactions.
Basesdedonnesderfrence
Les exemples utiliss pour illustrer les premires clauses SQL du prsent chapitre se
rfrentquelquesbasesdedonnesdontleschmaetlasmantiquesontprsentsci
dessous. Les versions rcentes des SGBD utilisant lUNICODE devraient pouvoir
ventuellement accepter les signes orthographiques nationaux dans les clauses SQL.
Pour simplifier la base, on convient dutiliser de prfrence les minuscules non
accentues,maisentolrantlesexceptionspourdesraisonsdemeilleurelisibilit.
BD1:Ventesaudtail
Cette extension de la base de donnes valide la contrainte rfrentielle qui est
implmente et active lors des transactions sur la base. Elle sera utilise par la suite
comme base de rfrence pour de plusieurs exercices SQL. La base est compose des
tablesVentesetInventaire.
Cette contrainte rfrentielle est un cas particulier dune contrainte dinclusion plus
gnrale qui spcifierait que tout article de la relation Ventes doit tre inclus dans la
projection de la table Inventaire sur lattribut article. Une transaction sur la base ne
concernequunarticleeninventaireaumomentdelavente,tandisquechaquearticleen
inventairepeutfairelobjetdeplusieurstransactionsdevente.
DanslatableInventaire,lesattributsprixVente etcoutpartagentlemmedomainede
valeurs, mais avec une smantique distincte marque par un libell respectif diffrent.
Touslesarticlesvendussontinscritsdanslinventaire.Aumoinsunarticledisponibleen
inventairenapasencoretvendu.Poursatisfairelhypothsedelarelationuniverselle
qui impose lunicit des libells dans un schma, les articles dj vendus et ceux
actuellement en inventaire peuvent tre libells respectivement Ventes.article et
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 22
La table Inventaire fournit les articles en inventaire. Labsence de cot signifie que cet
articlenestplusdisponible.Lacontrainterfrentielleestspcifieparunecltrangre
monoattribut dans la table Ventes (soit article) portant le mme libell que la cl
primairedanslatableparentInventaire.LasimplicitdelarelationInventaireetlechoix
desaclsoustendentquecertainsfaitsnepeuventpastrereprsentsdanscettebase.
Par exemple, deux articles identiques achets des cots diffrents ne pourraient pas
trereprsentsdanscetinventaire.
BD2Gestiondesstocksdepicespourlestransporteursariens
Cettedeuximebasereprsentelesstocksdepicesdestransporteursariensrpartisici
etldanslemondepourlarparationdeleursavions.
Untransporteuraunpermisdoprationpourchaqueavionqilpossde,unematricule,
unsigesocialdansunevilledonneetunnomdesocit.Lepermisduntransporteur
peut tre rvoqu temporairement auquel cas lindicateur null est utilis pour signifier
labsence de permis. Chaque transporteur peut dplacer un nombre maximum de
passagersparjour(volPass).
Dans le cas de cette base BD2, lhypothse de la relation universelle est aussi vrifie,
carunlibelldattributnaquuneseulesmantique,peuimportelatableoilapparat.
Lesattributsproprioetmatpartagentlemmedomainesmantique.Enoutre,lattribut
propriopeuttrenullcommecelaestsignalparunnulldanslextensioncidessus.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 23
La contrainte dinclusion (qui est dnomme DIN) est du genre rfrentiel et elle doit
trevalidetoutmoment.Deplus,lepermisdevolinternationalestuniqueetidentifie
letransporteur,maisilestpossibledavoiruntransporteurquinelapasouquiesten
instancedelobtenir(unicitdelattributavecvaleurnulleautorise).Lattributpermis
ne peut donc pas tre une cl, car il peut tre nul. Les cls sont respectivement mat et
noP. Les attributs proprio et mat ont le mme domaine smantique et font donc
rfrenceaummeconcept.Silacolonnepropriotaitignore,latablenauraitpasde
contrainterfrentielleetlesdeuxtablesseraientsansassociationsmantique.
Lavilledu sigesocialdutransporteurestnommediffremment(villeSS)decelledu
dptdepices(villeP).Lhypothsedelarelationuniverselleestdoncvrifiedefacto.
Il y aurait une ambigut si, dans les deux relations, il y avait un mme attribut ville
ayant deux interprtations diffrentes. Avec la colonne proprio (comme cl trangre)
dont le domaine smantique est partag avec celui de mat, un lien est tabli entre les
deux tables et les jointures deviennent possibles. Avec ces deux tables, il serait aussi
possible de dfinir un cluster index de placement des tuples pour que ceux qui
partagentlammevaleurde lacl ducluster(parexemple,laclprimaireetdelacl
trangre)soientrangsdanslammepage.
BD3Dotationdesressourceshumaines
Cettebaseimplanteuneassociation(nm)entredeuxclassesaumoyendunetroisime
relationoutable.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 24
Le lien dassociation complexe entre les deux tables est assur par une troisime table
Assignations. La troisime table utilise pour implmenter lassociation a une cl
primaire compose (noPoste, noEmpl); les deux cls trangres distinctes dans cette
tablesontrespectivementnoPosteetnoEmpl.
7.5Schmadelabasededonnes
Lemodleconceptuelesttransposenunmodlelogique (MLD)propreauSGBDpar
lentremisederglesdepassageparticulires.Leschmadumodlelogiqueestspcifi
par les clauses SQLDDL qui dfinissent les tables de la base de donnes et leurs
caractristiques. Les contraintes dattribut, la cl primaire et la ou les cls trangres
dunerelationsontaussidfiniesdansleschma.
Crationdunetableetletypagedesattributs
La cration dune table consiste dfinir son schma et lassocier un nom unique
compos du compte propritaire et du libell de la table. Dfinir une table soustend
aussi la spcification de ses attributs typs, des contraintes dintgrit associes aux
attributset,ventuellement,desonespacedetable.Lestypesinternes(typeaveclequel
unedonneeststockedanslabasededonnes)disponiblesdansOraclesontsimilaires
ceuxspcifisparleSQL92aveccependantquelquesdiffrences.Parexemple,letype
boolen nest pas toujours implment; il est cependant prsent dans la version 9i de
OracleetdeDB2.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 25
TypesinternesdOraclepourlesdonnes
Les SGBD comme Oracle, DB2 et Informix sont capables de reprsenter les donnes
avec une gamme assez tendue de types. Toutefois leurs types ne sont pas toujours
aussi labors que ceux des langages de programmation de 3e gnration. Une
conversion simposer alors, opration qui devra tre prise en charge par lapplication!
AvecOracle,lestypessuivantssontdisponibles:
VARCHAR2(w),owestlalongueurdelachane,max.2Ko,et4Koaveclaversion8.
NUMBER(p,s),pestlenombretotaldechiffresavecschiffresaprslepoint(scale).
LONG,donnesencaractresjusqudeuxGo(image).
DATE (1), ce type comprend les lments suivants: le sicle, lanne, le mois, le jour,
lheure,laminute,laseconde(voir(1)).
RAW(w),donnesenbinaire,pourunelongueurmaximalede255octets;
LONGRAW,donnesenbinaire,jusqu2Go.
ROWID,caractreshexadcimauxreprsentantladressedutuple.
CHAR(w),owestlalongueurfixedelachaneavecunmaximumde255o.
MLSLABEL,tiquettedesystme(pourlaversionTrustedOracle).
FLOAT(b),pourlesrelsavecprcisionb.
CLOB,donnesdelongueurvariablecodessur1octet/caractre,mx4Go.
BLOB,chanedebits,max.4Go.
NCHAR,chanefixedecaractresNLS(alphabetnational).
Limplmentation des types peut varier dun manufacturier lautre avec la limitation
classiquepourleFloatdanssareprsentationdesentiersetdesrels.
(1) Le type DATE a un format externe bien connu, mais son format interne est bien
diffrent.Lepassagedelunlautresefaitpardesfonctionsspcialises:TO_DATE(),
TO_CHAR() et TRUNC(). La fonction TO_CHAR(), avec un gabarit appropri, permet
dafficher la date dans le format externe souhait et de supprimer le temps lors de la
transposition de la date. Cela permet ainsi de faire des comparaisons fondes
uniquementsurlejour,lemoisetlanne:TO_CHAR(dateContrat,YYYYMMDD)>
19991124.
Conventionsdcrituredescontraintesdecl
Lestablessontcresavecuneclprimaire(diteaussiprincipale)etventuellementune
ouplusieursclstrangres.Lenomdunecontraintespcifielorsdelacrationdune
tabledoittreuniqueetpeuttreformparsimpleconventiondcritureavecleprfixe
cp_ ou pk_ pour la contrainte de cl primaire suivi du nom de la table. Pour une cl
trangre,lenomdelacontrainteestprfixparfk_,suividunomdelatableenfantet
au besoin, celui de la table parent. Exemple, fk_ouvrier_atelier, pour dnoter la
contrainte rfrentielle entre la table Atelier et Ouvrier. Ainsi, le nom de la contrainte
permetdelassocieraucoupletableenfantparent.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 26
VoicilaformulationduschmadelatableVentesdelaBD3:
CREATE TABLE Ventes(
nom VARCHAR2(15) NOT NULL,
article VARCHAR2(10) NOT NULL,
qte NUMBER(3),
CONSTRAINT pk_Ventes PRIMARY KEY (nom,article, qte),
CONSTRAINT fk_Ventes_inventaire FOREIGN KEY(article)
REFERENCES Inventaire (article) )
[Tablespace TS_user99 Storage initial 500M next 75M
minextents 5 maxextents 20] ;
N.B. Les tuples de la table Ventes sont rangs dans lespace table TS_user_99 jusqu
hauteurde10Go.Lerestedelespaceseraoccuppardautrestables.Laspcificationde
lespace de donnes (tablespace) nest pas ncessaire lorsque le rangement des tuples est fait
automatiquementdanslespacededonnesassocipardfautaucomptedelutilisateur.
Lorsquelaclprimaireestsimple,ellepeuttreaussidfinieauniveaudelattribut.
La table est cre et les donnes seront stockes dans un espace de table nomm
TS_donnees1. Si lespace de table nest pas identifi, lextension sera cre et place
automatiquementdanslespacedetableSYSTEM.CedernierestcrparleSGBDpour
yrangerlestablesdudictionnaire.Ilfautdoncdeprfrencenepasengorgercetespace
enplaantlesdonnesdansdesespacesdetablesparsstocksaubesoinsurundisque
diffrent.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 27
Leschmadecettederniretablecomprenduneclprimaireetdeuxclstrangres.Par
lasuite,leDBAoulepropritairedelabasededonnespeuttoujoursmodifiercertains
paramtresdunschmaparlacommandeALTERTABLE:
ALTER TABLE Postes ADD (description varchar2);
ALTER TABLE Postes DROP description; --avec la version
8
LesclsprimairessontqualifiesNOTNULLdesortequesilechargementinitialdela
basededonnesestfaitavecuneclprimairedsactive,lesnullsserontquandmme
interditesdestockage.lafindelopration,laclprimaireestactivedenouveauafin
damorcer la construction ou la mise jour de lindexsystme soustendu par la cl
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 28
primaire.Cettefaondefaireestplusrapide,puisquilnyapasdemisejourdelindex
encoursdechargement,maisexigelabsencedeclsdupliques.AvecleNOTNULL,le
chargementrefuseratouttupledontlesattributsprimairesnesontpasvalus,puisque
cesdonnesneconstituentpasuneclvalide.
Lescls:primaire,trangreetattributUNIQUE
Une cl primaire limite la nature des tuples qui peuvent tre rangs dans la base de
donneseninterdisantlesdoublets.Eneffet,ilnepeutpasyavoirdeuxtuplesayantla
mme valeur pour les attributs de la cl primaire. Cette contrainte est gnralement
placelafindelaspcificationduschmadunetableetestnommedemanirela
distinguerdansledictionnaire.Laclprimairepeuttresimpleoucompose.Voiciun
exempleduneclcompose:
CREATE table Assignation (
noEmpl number(2) not null,
noPoste number (2) not null,
,
CONSTRAINT cp_EmplPoste PRIMARY KEY (noCours,
section);
Lorsque la cl primaire est compose, elle peut tre formule pour avoir des attributs
nuls,pourvuquundesattributsprimairessoitnonnul.Danscecas,lacontraintedecl
primaire est implmente par la clause UNIQUE(), laquelle permet de contraindre les
valeurspourquellessoienttoutesdiffrentesounullespourunouplusieursattributs.
Lapairedattributs(nom,noEquipe)doitavoiraumoinsunevaleurpourlattributnom
qui ne peut pas tre nul. Toutefois, lattribut noEquipe peut tre nul comme cela est
autorisparlesUNIQUEetNOTNULL.Unecontraintetrangrepeuttrespcifieen
serfrantaunattributUNIQUE,doncdesattributsquinesontpasuneclprimaire.
Lacltrangresimpleoucomplexeexprimeunecontraintepourlestuplesquipeuvent
tre ajouts dans la table enfant et une autre contrainte sur la suppression des tuples
dans la table parent. Soit la table ChoixCours avec une contrainte rfrentielle par
rapportlatableparentCoursHoraire.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 29
Lajout dun choix de cours particulier soustend une rfrence un courshoraire qui
doitexisterdanslabase.Lacltrangredansuntupleestsoitentirementcomposede
nulls, soit partiellement ou entirement value, i.e. quau moins un des attributs a une
valeur.
7.6ImplmentationdescontraintesstructurellesaveclelangageSQL92
Les dfinitions cidessus sont partiellement muettes en ce qui concerne les contraintes
structurellesduMCD.Ceciestparticulirementimportantpourlestablesavecdescls
trangres.Eneffet,lasuppressionduntupledansunetableparentnestpasneutrepar
rapportlatableenfant.Quarrivetilauxtuplesdpendantslorsdelasuppressionou
delamisejourdelacldutupleparent?Reprenonslexempledumodlesimpleci
dessousdontleschmacorrespondantestconstitudedeuxrelations:VilleetProvince.
Les contraintes du modle imposent une suppression automatique des villes associes
lorsquelaprovinceestsupprime.
Ville
Province
nomV* EstDans
populationV (1,1) (1,n) nomP*
dateCreationV populationP
Figure7.12
LemodlequivalentUMLestlesuivant:
Ville
1..* EstDans 1 Province
nomV*
nomP*
populationV
UML populationP
dateCreationV
Province(nomP*, populationP)
Ville(nomV*, populationV, dateCreationV, nomP)
Figure7.13
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 30
ActionsrfrentiellesenSQL
Lesortrservauxtuplesdunetableenfantlorsdunemisejouroudunesuppression
dans la table parent est variable selon les spcifications de la table enfant. Ces actions
ditesrfrentiellesdanslapropositionSQL92sontformulesenlienavecuneactionde
misejourdanslatableparentetdeseseffetsauniveaudelatableenfant.Ellesnesont
pastouteslobjetduneimplmentationdansOracle.
CASCADE:Unemodification(UPDATEouDELETE)detuplesdanslatableparentse
propage aux autres tables. Ainsi, une suppression dun tuple parent entrane la
suppressiondestuples correspondantsdanslatableenfant.Unemodificationdelacl
duntupledelatableparententranelasuppressiondestuplespralablementassocis
lanciennecl.
SETNULL:Lorsqueletupleparentestsupprim(DELETE),lattributdelacltrangre
devientNULLdanslatableenfant.Ilenestdemmepourunemodification(UPDATE)
delacldanslatableparent.
SETDEFAULT:Letupledelatableparentestsupprim(DELETE)etlacltrangre
destuplesdelatableenfantestmiseunevaleurdfiniepardfautlorsdelacration
delatableenfant.
Avec lexemple cidessous, les tables sont cres en SQL92 de faon respecter les
contraintesstructurelles:
CREATE TABLE Province(
nomP char varying(45) NOT NULL PRIMARY KEY,
populationP number(8) NOT NULL);
N.B.Letypecharvarying()estlependantSQL92devarchar()etvarchar2()deuxtypes
courammentimplmentsdanslesSGBDOracle,DB2etInformix.
CREATE TABLE Ville(
nomV char varying(50) NOT NULL PRIMARY KEY,
populationV number(8),
dateEntree DATE,
nomP char varying(45) NOT NULL,
CONSTRAINT fk_ville_province FOREIGN KEY(nomP)
REFERENCES Province(nomP) ON DELETE CASCADE [ON
UPDATE CASCADE] [ON DELETE SET NULL]
);
Siuneprovincedoittresupprimedelatable,touslestuplesdeVillequilerfrencent
sont aussi supprims. De mme, si une ville disparat de la carte administrative dune
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 31
province,ellenepeutpasresterdanslabaseavecuneclcomposedelindicateurnull.
Les autres actions entre crochets ne sont pas toujours implmentes: si une province change
denom,touslestuplesdansVillequifontrfrencecetteprovinceparlacltrangre
sont modifis pour reflter le changement de nomP. La troisime option permet de
supprimeruntuplerfrenc;danscecaslacltrangredestuplesdelatableenfant
sontmisenull.
Autreslangagesdedonnes
Ilexistequelquesimplmentationsplusconvivialesdulangagealgbrique(etducalcul
relationnel) qui permettent la fouille dune base de donnes et la transmission des
rsultatslutilisateur.
Voiciquelqueslangagesderequteimplments:
QUEL:langageconvivialimplmentpartirducalculdetuple(BerkeleyUniversity);
QBE:langagebassurlecalculdedomaine(IBMIMF,crdetFORMSOracle);
RENDEZVOUS:langagequasinaturel(IBM);
CUPID:algbrerelationnelleutiliseparlebiaisdepictogrammes(IBM).
Depuisleurcration,quelquesunsdeceslangagessonttombsdansloubli,parfoisen
raisondelabsencedunetechnologieapproprieCUPID,LAGRIFetRENDEZVOUS.
La puissance de la technologie actuelle permettra ventuellement de nouveaux
langagesgraphiquesoudetypelangagenatureldevoirlejouretdetrouveruncrneau
dapplications.
7.7RequteSQL
UnerequteSQL3, 4, 5estunnoncderecherche,composdeclausesidentifiesparle
motclSelectetdontlordrelogiquedexcutionestindiqucidessousparlentierplac
entre parenthses. La dernire opration est le tri des tuples de la rponse.
Concrtement,lordredexcutionseraceluicorrespondantauplandexcutionoptimis
etgnrparlemoteurSGBD.VoicilastructureduneclauseSELECTcomplte:
Leformatgnraldelarequtecomprenddeuxpartiesobligatoires:SELECTetFROM.
Les crochets encadrant les autres indiquent quelles sont facultatives. Lordre
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 32
INSERTINTO<relation>VALUES(...);
UPDATE<relation>SET<attribut>=valeurWHERE<prdicatdeslection>;
DELETE<relation>WHERE<prdicatdeslection>;
Sil y a lieu, les tuples de la table intermdiaire sont regroups par lexpression du
GROUPBYetlesfonctionsdagrgationsontexcutessurchaquegroupeform.
LescolonnesduSELECTsontretenuesdanslarponsetransmiseparlexcutiondune
projection.
Untriventuelesteffectu(ORDERBY)lafindescalculsetjusteavantdetransmettre
larponseauclient.
N.B.LeprdicatannoncparleWHEREpeutavoirplusieursformes:conditionsimple,
unprdicatdinclusionavecuneoudessousrequtesembotes,ouunprdicatvideou
absenttoujoursvaluVRAI.Toutelapuissancediscriminantedelarequtesexprime
parceprdicatdeslectionformuldansleWHERE.
Lordrelogiquedexcutiondesclausesesttelquelesaliasdesrelationsetdesattributs
nesontpasconnusouvisiblesquaprslestapesoilssontdfinisdanslexcutionde
la requte. Ainsi, un alias dattribut dans la clause SELECT (tape 5) peut tre utilis
danslaclauseORDERBY(tape6)pourordonnerlestuplesdelarponse,parcequila
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 33
tdfiniavant.Ilestdoncvisibleouconnuparlexcuteuraumomentdutri.Toutefois,
lemmealiasnepeutpastreutilisdansleWHERE,carilestencoreinconnultape
2delexcutiondelarequte.Ilsagitdunordrelogiquedexcutiondontleplansera
dfinitivementtabliparloptimiseur.Ilestpossiblequelesoprationssoientformules
diffremmentdansunplanoptimis,maislersultatdevratrelemme.
GrammaireduSELECT(SQL92)
La grammaire SQL92 (englobant SQL89) de la clause SELECT est reprsente sous
formedungraphe.
Lesconventionsutilisesdansuntelgraphesontlessuivantes:
Lesmotsclsetlessymbolesdulangagesontdeprfrenceenlettresmajuscules
SELECT liste-non-vide-attributs-ou-fonctions
FROM liste-non-vide-de-relations
WHERE prdicat simple-complexe-ou-sous-requte;
Lesouligndunmotclindiquelavaleurpardfaut:ORDERBYASC.
Le libell en minuscules et avec une majuscule comme premire lettre utilis dans le
FROMreprsentelenomduschmadelavue,delarelationoudelattribut.
GraphedelagrammaireduSELECT
FROM
FROM table
(1) vue
schma WHERE
(sousrequte) (2)
snapshot
@lien
condition
(2)
CONNECT BY condition (3)
GROUP BY expression
Havingcondition
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 34
UNION
INTERSECT
MINUS
,
(4)
ORDER expression
ASC
position
DES
C
FOR
UPDATE NOWAIT
,
OF colonne
table
vue
Figure7.14
ExpressionSQL
Uneexpressionestconstituedunecombinaisondattributs,deconstantes,defonctions,
doprateurs et doprandes qui sont valuables pour donner une table ou un scalaire.
Letypedursultatdelexpressionestdfini.Lersultatpeuttreaussiunnulllorsquun
desesoprandesestunnul.
Parexemple,lesexpressionssuivantessontcorrectes:
Expression Type de la rponse
CONCAT(Mme,nom) Chane
age_actuel=35+age Entierounullsigeestnull
total=AVG(prix)*3.6 Rel
total=AVG(prix)*3.6 Rel
salaire=(salaire*.15)+salaire Rel
res=(67*5)/2 Rel
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 35
Dans ce dernier exemple, si le salaire dans un tuple est null, alors le rsultat de
lvaluationdelexpressionseraaussilindicateurnull.Uneexpressionpeuttreutilise
partoutopeutapparatreunattributouuneconstante.
Condition
Uneconditionestunprdicatdontlvaluationfournitunevaleurboolenne:TRUEou
FALSE. Avec SQL92 lvaluation peut fournir une troisime valeur, soit UNKNOWN.
Elleestformeduneformulelogiqueoudunprdicatdinclusiondansunensemblequi
peuttrenumroucalculparunesousrequte.
ExemplesdeconditionsplacesdanslaclauseWHERE:
Listerlesarticlesvendusjusqucejour.
Lexpressionalgbriquecorrespondanteestuneprojectiondunetabledebase.
article (Ventes)
EnSQL,cetteprojectionsetraduitparlalistedesattributsdelaprojectionplacedansla
clauseSELECT.
SELECT article
FROM Ventes;
Laprojectionsupprimelesdoubletsdelarponse,tandisquelacluseSQLSELECTci
dessusnelefaitpasmoinsdyajouterlemotclDISTINCT.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 36
b) Lister les ventes (avec tous leurs attributs) effectues jusqu ce jour . Une simple
projectionfournitlarponsedemande.
nom,article, qte (Ventes)
Laprojectiondetouslesattributspeutsexprimerparlalistedesattributsoulastrisque
placdanslaclauseSELECT.
SELET *
FROM Ventes;
Listerlenomdesacheteursdelarticlenomma2:
nom(Ventes.article = a2(Ventes))
SELECT nom
FROM Ventes
WHERE Ventes.article ='a2';
d)Listerlenomdesacheteursdelarticlea2avecunequantitsuprieureougale3.
Lexpressionalgbriquepourcalculercetterponsecomprenduneslectionexcuteen
premier,suivieduneprojectionpourneconserverquelesattributsdemands.
nom(Ventes.article =a2and qte >= 3(Ventes))
CetteexpressionestconvertieenSQLtrsfacilement:leprdicatdeslectionapparat
dansleWHEREetlalistedesattributsdeprojectionestajouteauSELECT.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 37
Laconditionpeuttreformuleavecplusieursoprateursdecomparaison:=,!=,>=,<=,
<, > et des prdicats du langage comme les suivants : BETWEEN x b1 AND b2, IN,
LIKE, IS NULL, IS NOT NULL. De mme, lexpression du prdicat peut tre formule
avecplusieursattributs.
Exempledunprdicatconjonctif:WHERE nom=liseandage=25
Ceprdicatestquivalentausuivant:WHERE(nom,age)IN(lise,25)
e)Listerlenomdesacheteursquiontachetentre3et7unitsdunarticle.
nom(qte between 3 And 7(Ventes))
SELECT nom
FROM Ventes
WHERE qte BETWEEN 3 AND 7; --les bornes sont incluses
f) Lister les acheteurs dont le nom commence par la lettre S au moyen de loprateur
dappariementLIKE.
SELECT nom
FROM Ventes
WHERE nom like 'S%';
NB:Lecaractregnrique%reprsenteunechanecomposede0ouncaractresqui
vientaprsleS.
Autres formes possibles : %S, %S%S, etc. Ce caractre spcial est trs utile si la chane
spcifie dans le schma est de longueur constante et si la chane recherche est plus
petite.Lescaractresspciauxpeuventtreaussicombins.
Il est aussi possible de prendre en compte les caractres spciaux comme des littraux
intgrslachaneparlentremiseducaractredchappementannoncparlemotcl
ESCAPE.
SELECT nom
FROM Ventes
WHERE nom LIKE Sans\_Chagrin ESCAPE '\' ;
g)ListerlesarticlesachetsparlespersonnesdontlenomestDeschesnes,Descheynes,
DeschainesetDescheines.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 38
SELECT article
FROM Ventes
WHERE nom LIKE Desch__nes;
** Notez que le caractre _ (soulign) reprsente un caractre quelconque dans une
positionfixedelachane.
Voiciuneautreformulationduprdicat:
SELECT ARTICLE
FROM VENTES
WHERE NOM LIKE Desch||%nes%;
Ledeuxime%estncessairesilattributnomestdclarCHAR(w)etnondelongueur
variablecommecestlecasavecletypeVARCHAR2(w).
Voicidautresformulationscorrectes,maisqui seronttransformesparloptimiseurdu
SGBD:
avecleprdicatOR:
prixVente = 10 or prixVente = 11 Or ...prixVente = 20
aveclangation:
NOT (prixVente = 10 or prixVente = 11 or ...prixVente
= 20)
i)ListerlesarticlesachetsparlesclientsSerge,ValrieetTed:
SELECT article
FROM Ventes
WHERE nom IN ('Serge','Valrie','Ted');
Lemmeprdicatpeuttreformulsouslaformedunedisjonctiondgalits:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 39
Le NOT permet aussi de tester lexclusion ou labsence de nom parmi ceux de la liste
numre.
Avec la prsence du NULL dans la liste numre, le prdicat est valu correctement
avec les constantes numres, mais ne slectionne pas les tuples dont le nom est
renseignparlindicateurnull.
SELECT article
FROM Ventes
WHERE nom IN ('Serge', 'Valrie', null);
La recherche des ventes un client inconnu est faite inutilement, car le nom est un
attributprimairequinepeutpastreunnulllorsquelaclprimaireestspcifiedans
leschmadelatable.
Suppressiondesdoubletsdansunerponse
Les tuples identiques de la rponse peuvent tre supprims par une variante de la
slectionsoitleSELECTDISTINCT.Lordredaffichagedestuplesslectionnspeuttre
aussispcifiparlaclauseORDERBY.
j)Listerlesacheteursayantdesnomsdiffrents.
Quelestlersultatdelaclausecidessous?
SELECT DISTINCT nom, article
FROM Ventes;
Les doublets sur les attributs nom et article (en tant que tuple de la rponse) sont
supprims.
Pardfaut,larelationdelarponseconstitueunseulensembledetuplestrienfinde
calcul selon lordre croissant de nom (option ASC). Loption DESC permet un tri
descendant sur le ou les attributs mentionns dans la clause ORDER BY. Lattribut
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 40
utilis comme critre de tri doit tre obligatoirement dans la table obtenue par la
projection(exprimeparlaclauseSELECT).
7.9Lindicateurnulletlvaluationdunecondition
Un attribut peut avoir un indicateur de labsence dune valeur, le null (6) si la
spcificationduschmadelatablelautoriseexplicitement(NULLetNOTNULL).Cet
indicateur peut tre aussi dfini par la clause DEFAULT IS NULL lequel est attribu
un attribut. Comme le traitement des indicateurs nulls est plus complexe, il est
prfrable de privilgier, lorsque cela est possible au regard de la smantique, la
contrainteNOTNULLpourunattribut.LanormeISOdfinitletraitementsuivantpour
leNULLdanslesexpressionsdecomparaison:
a)UnNULLnestjamaisgalunevaleurquelconqueycomprisluimme(0,blanc
ouNULL)puisqueleNULLnestpasunevaleurdudomaine.
Parexemple:
SELECT *
FROM Employe
WHERE salaire = null ;FALSEycomprislorsquesalaireestinconnu
Les employs dont le salaire est inconnu ou absent ne sont par retrouvs avec cette
formulation. En effet, lindicateur null nest pas une valeur du domaine, donc ne peut
pastrelobjetdunecomparaison.
b)UnNULLnestjamaisdiffrentduneautrevaleur.Eneffet,parcequeleNULLnest
pasunevaleurdudomaine.
SELECT *
FROM Employe
WHERE salaire <> 25000; --FALSE pour les tuples avec salaire
NULL)
c)UnNULLnestpaspluspetitouplusgrandnigalunevaleur.
SELECT *
FROM Employe ;
WHERE salaire < 19 000(FALSEpourlestuplesdontlesalaireestNULL)
d)Lersultatdesfonctionsdagrgation(saufexception)nestpasmodifiparlesnulls
des tuples, pour autant que certains non nulls existent dans le lot. Lexception est la
fonction de comptage Count() qui peut ou pas prendre en compte les valeurs nulles.
Ainsi,Count(*)comptelestuplesetdoncconsidrelecomptagedeslignes(tuples)sans
gard la prsence desnulls. Par contre, le Count(age) necompte que les valeurs non
nulles pour cet attribut. Voici dautres exemples singuliers utilisant le null dans le
prdicat.Ici,ilyauraimpressiondelaconstantesileprdicatestvaluVRAI.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 41
Parcontre,lexpressionavecleprdicatISNULLouISNOTNULLpermetdetraiterles
tuplesayantlindicateurdevaleurnulle.
SELECT nom
FROM Client
WHERE credit IS NULL;
Cetteexpressiondonneralenomdesclientsdontlecrditnestpasencoredterminou
inexistant.
Exceptionsdansletraitementdunull
Il y a certaines exceptions dans le traitement de lindicateur dabsence de valeur, le
NULL:
a)FonctionDECODE:
DECODE(note,'A','excellent','B','tres_bien','C','bien',NULL,'che
c')
LestuplesdontlanoteestAsontlobjetdunremplacementdecettenoteparlachane
excellentetsilanoteestNULL,elleestremplaceparlaconstantedechanechec.
b)DansleGROUPBY
SELECT matricule, age
FROM Employe
GROUP BY matricule, age; -- null dans certains tuples.
LegroupementtiendracomptedelavaleurNULLpourlesattributsduGROUPBY.
c)AveclequalificatifDISTINCT:
SELECT DISTINCT qte --les nulls sont distincts;
FROM Ventes;
d)AveclesoprateursUNION,MINUSetINTERSECTquitiennentcomptedesnulls.
PrdicatISNULLetISNOTNULLdeSQL92
Ce prdicat est propos dans la norme SQL86 afin de tester si une expression, qui est
trssouventformedunseulattribut,estvalueNULLlorsdesoninstanciationpar
untuple.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 42
SELECT *
FROM Ouvrier
WHERE age IS NULL ;
TouslestuplesdeOuvrierdanslequellgeestinconnu(ounull)serontslectionns.
La norme SQL92 a tendu cette notion pour y inclure le test de plusieurs attributs au
moyen du constructeur de tuple. Ce dernier est de degr 1 sil est constitu dun seul
attribut,tandisquilaundegrsuprieurlorsquilyaplusieursattributs.
SELECT *
FROM Ouvrier
WHERE(noAtelier, age) IS NULL; --expression de degr
2
Lorsque lexpression du prdicat contient deux attributs, elle est de degr 2. Elle est
TRUEsilesdeuxattributsontunevaleurNULLdansunmmetuple.
Degr1 EISNULL EISNOTNULL NOTEISNULL NOTEISNOTNULL
Expression>(E)
siE=NULL TRUE FALSE FALSE TRUE
AUCUNNULLdansE FALSE TRUE TRUE FALSE
Degr>=2 EISNULL EISNOTNULL NOTEISNULL NOTEISNOTNULL
TousNULLdansE TRUE FALSE FALSE TRUE
QuelquesNULL FALSE FALSE TRUE TRUE
AucunNULL FALSE TRUE TRUE FALSE
Figure7.16a
Par contre, si lon veut slectionner les ouvriers dont lun des deux attributs de
lexpressionestinconnu,ilsuffiradefaireappellangationduprdicat.
SELECT *
FROM Ouvrier
WHERE NOT (noAtelier, age) IS NULL;
Cetteclauseestquivalentelasuivante:
SELECT *
FROM Ouvrier
WHERE noAtelier IS NULL or age IS NOT NULL;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 43
Lesusinesdontlevolumedeproductionoulavillesontinconnusserontslectionnes.
Eneffet,siundesattributsestNULL,laconditionestdoncvalueaussiNULLetle
prdicatquivrifielavaleurdevritUNKNOWNestdoncTRUE.
PlusdedtailsconcernantlanotiondexpressionSQL
Uneexpressionfournit,aprsvaluation,unevaleur(etventuellementleNULL)dun
type donn. Une expression, notamment en SQL92, est forme de divers lments
constantes, variables, fonctions qui peuvent apparatre dans les clauses SELECT et
WHERE. Une expression peut tre aussi combine avec dautres au moyen des
oprateurs arithmtiques, logiques et de chane. Considrons maintenant la base de
donnessuivantecomposedequatretablesnormalises:
1Expressionincluantunlittral
Uneexpressionpeuttreformuleavecuneconstantenumrique,unechane,unedate,
unattribut,untempsetuneestampille.Voiciquelquesexemplesdeconstantesdetypes
divers:
entiers:97,45,+67 nombredcimal:45.6,34.567
virguleflottante:1.56E2 chane:programmationobjets
chaneUNICODE:G nombrehexadcimal:XFFFF
date:19981225 temps:13:45ou13.45ou1:45PM
estampille:2000010613:45:00:00000
Figure7.16b
2Expressionincluantunnomdattributavecousansoprateur
Laplussimpledesexpressionsestunattribut seul,tandisque latransformationdune
valeur ou dun attribut par les fonctions et les oprateurs fournit aussi une expression
quiestpluscomplexe.
Exemplesdexpressionaveclesattributs:
volume nom||||prenom
Usine.production volume*prixUnitaire
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 44
3Expressionincluantunappeldefonctioninterneetexterne
Tout appel de fonction est une expression dont lvaluation soustend lexcution du
corps de la fonction. Une fonction peut tre aussi combine avec les oprateurs
arithmtiquesetdechanepourretournerunevaleurtype.
SELECT Concat(libelle||adresse)
FROM Usine
WHERE SUBSTR(codePostal, 1, 3) = 'G1K';
Une expression peut comprendre une fonction dont un argument peut tre aussi un
appeldefonction.
Exempledembotementdefonctions:
SELECT U.libelle, U.adresse, U.noUsine
FROM Atelier A, Usine U
WHERE A.noUsine = U.noUsine and
LENGTH(SUBSTR(site,1,(INSTR(site,'ing')))) = 5;<-
-
4ExpressionavecuneconstantedetypeDate
Une expression dans laquelle une constante entire est ajoute une date fournit une
autre date. Souvent, lunit par dfaut pour un entier ajout une date est le jour
(DAYS).Lesautresunitsnesontpastoujoursimplmentes.Parexemple,Oracleoffre
quelunitDAYS.
Exemplesdunitsdedate:
DAYS MONTHS
HOURS MINUTES
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 45
FROM Ouvrier
WHERE TRUNC(DATE_E,'YY')BETWEEN TRUNC(1992,'YY')
And TRUNC(1998,'YY');
Dans lexemple suivant, les embauches entre 92 et 98 sont affiches avec une date
augmentede30mois.
SELECT DateE + 30 MONTHS /* date augmente de 30 mois
*/
FROM Ouvrier
WHERE To_Number(To_Char(DATE_E,'YY')) Between 92 And
98;
5Expressionincluantunevariablehte
Une variable hte (dont la valeur est fournie par une variable du langage de
programmation)dansuneclauseSQLestdclaredanslecontextedunprogrammede
type L3G (ex.: C, C++, Java et elle est prcde du caractre deux points (: ) comme
dlimiteurdevariablehte.
Exemple(:x):
SELECT volume + :x
FROM Atelier;
Le caractre deux points dans:x indique linterprte SQL quil sagit dune variable
hteetquelavaleurdecettevariableestaccessibleenlectureetencriture.
7ExpressionincluantunestructureCASE(prvudansSQL92)
Cette clause CASE est une expression qui fournit aprs valuation, une constante de
typechanedecaractresounumrique.
CASE classe
WHEN SUBSTR(classe, 1,1) = 'A' THEN 'excellent'
WHEN SUBSTR(classe, 1,1) = 'B' THEN 'trs bon'
WHEN SUBSTR(classe, 1,1) = 'C' THEN 'bon'
END;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 46
Exemple:
SELECT noSpecialite,
CASE noSpecialite
WHEN noSpecialite = 1 THEN
'fraisage'||'aluminium'
WHEN noSpecialite = 2 THEN 'perage du fer'
WHEN noSpecialite = 3 THEN 'tournage acier'
ELSE 'autres oprations'
END,
volume
FROM Atelier WHERE site = 'Qubec';
Sousrequtevaleurunique(scalaire)
Lvaluation dune sousrequte qui donne une seule valeur type est aussi une
expression. Dans lexemple cidessous, la sousrequte est value ds le dpart et sa
rponse, compose obligatoirement dun seul numro datelier, est un scalaire qui est
substituelasousrequteavantdepoursuivrelvaluation.
SELECT nom, dateEmb, noAtelier
FROM Ouvrier
WHERE noAtelier = (SELECT noAtelier
FROM Atelier WHERE site = 'Qubec');
Tridesdonnesdursultat
LaclauseORDERBYestexcutelatoutefinducalculetpermetdordonnerlestuples
delarponseselonunouplusieursattributsoualiasutilissdansleSELECT.
SELECT nom, ville
FROM Empl
WHERE age >20
ORDER BY nom, ville ASC ;
Triavecunalias:
SELECT noVente, montant *.15 [as] taxe
FROM Ventes
WHERE mois = 'juin'
ORDER BY taxe DESC; <-- tri dcroissant par alias
7.10ConversiondetypedansSQL:CAST(SQL92)
Loprateur CAST() soustend une opration de transposition du type dune valeur ou
celui dun rsultat ou dune expression (y compris le NULL) en celui dun autre type.
CommeSQLestunlangagetyp,loprateurCAST()permetplusdesouplessedansla
formulationdesexpressions.Parexemple,lajoutdunattributnumriqueunautrede
typechaneestautorislaseuleconditionquelachanesoitaupralablelobjetdune
conversion de type. Il nest possible de faire une conversion que pour changer les
caractristiquesdunmmetype.
Exemples:CAST(classeasINTEGER)
-- le type chane de lattribut classe est converti en entier.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 47
Exemple:Selectclasse,
CASEclasse
WHEN CAST(classe as INTEGER) = 1 Then . . . ;
Latranspositionsuivantepermetdemodifierlescaractristiquesdutypedelattribut:
CAST (nom as char(45)) pour modifier la longueur de la
chane;
CAST (volume as decimal(2,4)--modifie nb chiffres aprs
point dcimal
Engnral,lesconversionsautomatiquessontpossiblespourplusieurschangementsde
type, notamment dun type numrique vers tout autre type numrique. Toutefois, la
conversionsignaleuneerreurlorsquunevaleurnumriquecibleaunetailleinsuffisante
pour exprimer totalement la valeur de la source. Cependant, si lespace ne permet de
loger que les chiffres dcimaux avant le point dcimal, il y aura alors un arrondi du
nombre converti. Les conversions possibles pour SQLDB2V2 sont prsentes
sommairement dans le tableau cidessous. Des conversions similaires sont autorises
avecOracleetlesautressystmes.
typedelasource typedelacible
char,varchar,clob,longvarchar char,varchar,clob,longvarchar
char,varchar char,varchar
date,time,timestamp char,varchar
date date
time time
blob blob
timestamp date,time,timestamp
graphic,vargraphic,longvargraphic graphic,vargraphic,longvargraphic
smallint,integer,decimal,double smallint,integer,decimal,double
Figure7.16c
La conversion est possible selon le tableau en passant par le chemin date > char. Le
mme rsultat peut tre obtenu par la fonction TO_CHAR() fournie par les diverses
implmentationsdeSQL,notammentcelledOracle.
Parexemple:laconversiondelannedontletypeestDate:laconversiondateverschar
estpossibleaveclaclause: CAST (annee as char(8)).
SELECT Cast(nom as char(15))
FROM Ouvrier;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 48
Supposons que la date douverture de latelier est de type Date et que celle de
lembauche dun ouvrier est de type chane de caractres. Pour faire une jointure entre
lesdeuxtablesAtelieretOuvrier,ilfauteffectueruneconversiondetypeaveclattribut
dejointuredateEmb.
Casspcial:Compatibilitdedeuxstructuresdetabledansuneoprationbinairetelle
quelunion.
Certaines implmentations de SQL ne permettent pas dexcuter une requte pour
obtenirlalistecombinedesouvriersquitravaillentlusineetceuxquitravaillentsur
leschantiers,silachaneestdclareavecdeslongueursdiffrentes.
OuvrierUsine (nas* : number(4,0) , usine : varchar2(2))
OuvrierChantier (nas* : number(4,0),chantier : varchar2(4))
Larponserechercheestunetablede3colonnes,puisquelesattributsusineetchantier
nesontparentirementcompatibles.
Poureffectuerunetelleunionetobtenirlalistedemande,ilfautavoirunecompatibilit
desschmas.IlyauradoncaugmentationduschmadeOuvrierUsineeninsrantune
colonnedindicateursdenullstypscommeunechanevarchar(4).Ilenserademme
avecOuvrierChantier.Larequtesuivantedevientdonccalculable:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 49
Voici une autre requte qui donne essentiellement les mmes donnes avec un
arrangement diffrent dans lequel il nest plus possible de distinguer les chantiers des
usines,saufsilavaleurmmedeladonnelepermet.
7.11Embotementdesrequtes(jointure)
Une requte embote7 (nested query) est compose dune requte principale dite de
niveauoubloc1avecaumoinsunesousrequtedeniveauoubloc2dontlvaluation
est pralable celle de la requte suprieure de niveau 1. Il peut y avoir jusqu 16
niveaux dembotement. Il y a aussi une requte embote et corrle. Dans une telle
requte corrle, une des variables (attribut) de la sousrequte est globale, cestdire
quelleprendsavaleurdansletuplecourantobtenuparlarequteprincipale(deniveau
1).Avecunetellerequtecorrle,lasousrequteestvaluechaquechangementde
lavaleurglobale,i.e.chaquelectureduntupledanslatabledelarequteprincipale.
La rponse une requte embote nest forme quavec les attributs de la requte
principale;ceuxdelasousrequtentantpasvisiblesaupremierniveau.
SELECT nom
FROM Ventes
WHERE article NOT IN <-- prdicat dinclusion
(SELECT article
FROM Inventaire
WHERE cout is NOT NULL);
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 50
intermdiaireestconstitudetuplesquiconstituentunensembletransitoirestockdans
une table temporaire utilise pour lvaluation de la requte principale. La mme
requtepeuttreformuleavecunejointureetdesaliasderelation:
SELECT nom
FROM Ventes [as] V, Inventaire [as] I
WHERE V.article = I.article and I.cout is NOT NULL;
Lalias est dfini avec ou sans le mot cl AS selon la version de la norme SQL
implmenteparleSGBD.Lecalculdelajointuresefaitparunbalayagedesdeuxtables
avecvrificationdelaconditiondejointureformuleaveclesdeuxattributspartageant
le mme domaine. Au besoin, ces deux attributs sont libells diffremment, mais
doiventavoiruntypeouundomainecompatible.Unejointurepeutdonctreexprime
parunerequteutilisantunprdicatdinclusion.Trssouvent,lajointureexploitelelien
dassociationentrelestablesInventaireetVentesparlentremisedelaclprimaireetde
lacltrangre.Lajointurenestcependantpaslimitececas.
SELECT V.nom
FROM Ventes as V JOIN Inventaire as I
ON V.article = I.article and I.cout is NOT NULL;
LaconditiondejointurepeuttreinclusedanslaclauseFromaveclemotclON:
SELECT V.nom
FROM Ventes as V JOIN Inventaire as I ON V.article =
I.article
WHERE I.cout is NOT NULL;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 51
LeONspcifielaconditiondejointure,tandisqueleWHEREexprimeunfiltrageavec
lesautresattributs.
b) Lister le nom des clients qui ont acquis des articles en rupture de stock. Cet tat de
linventaire est marqu par labsence de cot (indicateur null) pour un article en
inventaire.
SELECT nom
From Ventes
WHERE article IN
(SELECT article
FROM Inventaire
WHERE cout is NULL );
Ventes: nom* article* qte* Inventaire: article* prixVente cout
Serge a1 3 a5 12 8
Ted a2 5 a1 10 5
Andr a1 2 a2 20 15
Serge a2 4 a7 15 15
Jocelyn a1 2 a3 25 null
Serge a3 4 a16 45 34
Valrie a7 3
Lucie a7 2
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7
Figure7.17a
UnetellerequtefaitappeluntestdinclusionparlentremiseduprdicatINafindene
slectionnerquelesarticlesquinesontpasdanslinventairecourant.Pourchaquetuple
de la table Ventes, il y a rtention de ce tuple dans la rponse si, et seulement si, le
prdicatestTRUE.SileprdicatestvaluUNKNOWN,letupledeVentesnestpas
retenu. De plus, linformation affiche ne doit provenir que de la relation de premier
niveau.
Expressiondetable
Parmilesexemplesprcdents,ilyaceuxdontlasousrequteestvaluedsledbut
pourretournerunevaleurscalaire.IlestaussiprvudanslanormeSQL92quunesous
requteretourneunetabletemporairequipeuttrenomme.Unetelleexpressionpeut
tresimilaireunevuerelationnelle.
Exemple:
SELECTArtProfit.article,ArtProfit.marge*1.15ASmargeplus
FROM(SELECTarticle,(prixVentecout)asmarge
FROMInventaireWHEREprixVente>cout)ASArtProfit
WHEREArtProfit.article=a1
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 52
ORDERBYmargeplus;
Danscetteclause,lexpressiondetabledonneunetabledontlenomestArtProfitetson
schmaestgloballaclause.IlpeutdonctrerutilisdanslaclauseFromoudansles
oprationssubsquentesconduisantlarponse.Finalement,laliasmargeplusestconnu
aumomentdutrietpeutdonctreuncritredeceluici.
Voiciuneautreexpressiondetablequipermetdegrouperlestuplesparlamarge,elle
mmecalculeparlexpression(prixVentecout).CommeleGROUPBYnacceptepas
lesexpressions,ilfautdfinirettravailleravecunalias.
Exemples:
a)Listerlesarticlesdjvendusenquantitinfrieureougalecellesdesventesfaites
pourlarticlea2:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 53
Remarque: La quantit sera plus petite que le plus petit nombre darticles a2 vendus
jusqu prsent par toute transaction inscrite dans lextension courante. La fonction
Min()permetaussiuneautreformulationavecunesousrequte.
SELECT article
FROM Ventes
WHERE QTE < (
SELECT Min(qte)
FROM VENTES
WHERE article = 'a2');
La complexit de cette requte tient au fait que le prdicat de slection rfre une
quantitquidoittrecalculedabordetcela,avantquelepremiertupledelextension
deVentesnesoittest.LafonctionMin()aunensembledevaleurscommeargumentet
retourneuneseulevaleur,soitlapluspetiteparmicellesdelensembleargument.
b)Listerlesarticlesvendusenquantitsuprieurecellesdesventesdelarticlea7:
SELECT article
FROM Ventes
WHERE qte > all (SELECT qte -- plusieurs valeurs
FROM Ventes
WHERE article = a7);
Dans cet exemple, la plus grande valeur de lattribut qte est utilise pour la slection.
Voiciuneautreformulationdelammerequte.Elleestpossibleenraisondelarelation
dordreimpliciteauxvaleursentiresdusousensemblecalcul.
SELECT article
FROM Ventes
WHERE qte > (SELECT max(qte)
FROM Ventes
WHERE Ventes.article = 'a7');
Lasousrequteestmatrialiseetlatabletemporaireestutilisepourlarecherchedela
plusgrandevaleurdelattributqtedelarelationVentes.
c) Lister les articles vendus en quantit plus grande que celle de nimporte quel article
vendu.
SELECT article
FROM Ventes
WHERE qte > any (SELECT qte FROM Ventes);
Autreformulation:
SELECT article
FROM Ventes
WHERE qte > (SELECT Min(qte)FROM Ventes);
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 54
Les oprateurs relationnels peuvent tre combins pour former diverses conditions
exotiquesdecomparaison:<=any,<=all,!=any,!=all,<any,<all.
7.12Requtecorrle
Un requte corrle est une requte embote avec au moins un attribut global. La
rponse une requte corrle est compose de tuples slectionns dans une table de
niveau1enfonctiondelaprsencedunautre tupledans uneautretabledeniveau2.
Cest une requte dite de corrlation qui se formule au moyen dune sousrequte
utilisant une variableattribut globale. Linformation qui peut tre affiche provient
uniquementdelapremirerelation(externelarequteoudepremierniveau).Cetype
derequteimplmentelequantificateurexistentieldontlaformulationcorrespondaussi
unejointure.
Exemple:Listerlestransactionsdevente(donctouslesattributsdecettetable)pourles
articlesencoreeninventaire.Unarticleestenencoreeninventairesilattributcoutaune
valeurautrequelindicateurNULL.
SELECT *
FROM Ventes [as] V
WHERE Exists
(SELECT article
FROM Inventaire [as] I
WHERE V.article = I.article And cout is NOT
NULL);
o V.article est la variableattribut globale qui est instancie pour chaque tuple de la
table Ventes. Le prfixe avec lalias est ncessaire pour viter toute confusion dans la
corrlationaveclasousrequte.LeprdicatWHEREestvalupourchaquetupledela
relationVentes.Silestvraipouruntuple,celuiciestretenudanslarponse.Laclause
EXISTSestvraiesiaumoinsuntupleesttrouvparlasousrequte.Ellepermetaussi
deformulerunejointureaveclangationduprdicat.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 55
Parexemple,unerequtecorrlengativeestutilepourlisterlespicesdjvendues,
maisquinesontpluseninventaire.
SELECT nom, article, qte
FROM Ventes [as] V
WHERE not exists
(SELECT article
FROM Inventaire [as] I
WHERE V.article = I.article and cout is null);
LattributV.articleestglobaletprendsavaleurlextrieurdelasousrequte.Avecun
telattribut,lasousrequtenestpasvaluetotalementaudpart.Lvaluationestfaite
pour chaque instanciation de lattribut article avec la valeur fournie par un tuple de la
relation Ventes. Dans une telle requte, les seuls attributs pouvant tre inclus dans la
rponse sont ceux de la table de premier niveau. Ainsi, la requte suivante nest pas
excutableparcequelattributcotenestundelatablerfrenceparlasousrequte.
SELECT V.nom, V.article, V.qte, I.cout
FROM Ventes V
WHERE not exists
(SELECT I.article
FROM Inventaire I
WHERE I.article = V.article);
AutresexemplesavecBD3:Dotationdesressourceshumaines
Reprenons le schma de la BD3 libell DOTATION et compos des trois relations ci
dessous.
Empl (noEmpl*, nom, tauxH, noPoste)
Assignations (noPoste*, noEmpl*, debut, quart)
Postes (noPoste*, titre)
Deuxcontraintesrfrentiellessontaussidfinies.
a) Lister le nom et le taux horaire des employs qui ont au moins une assignation de
travail:
SELECT nom, tauxH
FROM Empl [as] E
WHERE EXISTS (SELECT *
FROM Assignations [as] A
WHERE E.noEmpl = A.noEmpl);
LeprdicatdelasousrequteutiliseunattributglobalprfixparE.Lavaleurduntel
attributestfixelextrieurdelasousrequtepourchaquetuplelulorsdubalayage
de la table. Notez aussi que les attributs de la rponse ne sont pas obligatoirement
prfixsparcequeseulslesattributsdeEmplpeuventtreinclusdanslarponse.
b)Listerlenometletauxhorairedesemploysquinontpasdassignationdetravail.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 56
b)Listerlenometletitredupostedesemploysquiontuneassignationdetravail.
Danscecasilfautafficherlesattributsprovenantdedeuxrelationsetcelaenfonctionde
lexistenceduntupledansunetroisimerelation.
SELECT nom, titre
FROM Empl [as] X, Postes [as] Y
WHERE X.noPoste = Y.noPoste
and EXISTS (SELECT *
FROM Assignations
WHERE X.noEmpl = Assignations.noEmpl);
LestablesEmpletPostessontenpremierlobjetdunejointurepourformerlarelation
intermdiaireinterne(connueseulementparlesystme)dontleschmaestlesuivant:
Chaque tuple de cette relation intermdiaire est prise en compte successivement pour
vrifier la clause EXISTS. Lorsque le prdicat EXISTS est vrifi et si la rponse de la
sousrequteestnonvide,alorsletupledepremierniveauestretenudanslarponse.
LavariabledetupleXestglobaleetprendsavaleurlextrieurdelasousrequte.
Expressiondetablepartage(DB2)
Aveccertainesclausesilestutilederfrerunevuedansunesousrequtemmesila
requteprincipaleesttrsoccasionnelle.Parexemple,pourtrouverlesateliersdontlge
moyen des ouvriers dpasse celui de lensemble des ouvriers, il est possible dutiliser
unevuerelationnelleparuneclauseCREATEVIEW.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 57
Larequtesuivantepermetdafficherlenumrodesateliersolgemoyendesouvriers
estsuprieurlgemoyendesouvrierspeuimportelatelier.
SELECT noAtelier
FROM Ancien -- rfrence la vue relationnelle
WHERE age_moy_at >(SELECT AVG(age_moy_at) FROM Ancien);
WITHAncien(noAtelier,age_moy_at)AS
(SELECTA.noAtelier,AVG(O.age)FROMAtelierA,OuvrierO
WHEREA.noAtelier=O,noAtelier
GROUPBYA.noAtelier
SELECTnoAtelier
FROMAncien
WHEREage_moy_at>SELECT(AVG(age)FROMAncien);
Cetteclauseeffectueunseulcalculdelextensiondelexpressiondetableidentifiepar
le WITH et du mme coup supprime tout danger dincohrence lors du calcul de la
rponsesuiteauxactionsduneautreapplication.
7.13FouillehirarchiquedelextensiondunerelationenOracle
Lesdonnesorganisesavecunestructurearborescenteetstockesdansunerelationde
base ou obtenues par calcul peuvent tre extraites par une expression SQL (Oracle)
caractrise par un CONNECT BY. On a vu que lalgbre relationnelle ne permet par
dexploiterdirectementlesstructuresarborescentes,parcequellenestpasrcursive.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 58
LexempledelaFigure7.20concernelareprsentationdespersonnesquisontunparent
dune ou de plusieurs autres personnes, toutes reprsentes dans la mme relation de
base. Toute personne peut tre successivement parent et enfant selon le niveau de
reprsentationdanslarbre.Chaquepersonneestidentifieparsonnasetsonprnom.
Lapersonnequiestparentdelautreapparatenpremirepositiondansletuple.
50,Paul
Enfantde
55,Lise
100,Luce 65,Jacques
185,Andr
Cette relation reprsente donc les personnesayant un rangde parentdu type parent
enfant entre elles. Ainsi, Jacques, dont le nas est 65, est parent de Patricia et de Sylvie,
dontlenasestrespectivement75et95.
Pour trouver toutes les personnes ayant une filiation donne, le systme excute une
requte initiale pour trouver tous les tuples de la relation, considrs comme formant
lensemble de dpart D (identifi par un START WITH). A partir de cet ensemble de
dpart,lesystmeexcuteunerequtepourtrouverenpremiertouteslespersonnesqui
sontjusteendessousetcestuplessontnotsparlesystmecommetantdeniveau1.Ils
sont ajouts lensemble de dpart. Les tuples ajouts ont un lien parental direct avec
unepersonnedelensembleD.AchaquefoisquuntupledelensemblededpartDest
traitparlarecherche,ilestmarqucommetrait.Lersultatdelarechercheestajout
pour obtenir un ensemble de dpart augment D*. La deuxime opration se poursuit
avecchaquetupledeniveau1pourtrouverceuxdeniveau2etainsidesuite.Larrtest
signallorsquetouteslespersonnesdelensemblededpartaugmentD*nesontplus
parentouencorelorsquilsonttousttests(conditiondarrt).
Sommairedelalgorithme
Les tuples de lensemble de dpart sont trouvs avec la clause START WITH et sont
regroups dans lensemble setD. Pour chaque tuple parent (en commenant avec les
parentsdestuplesdelensemblededpart,soitsetD),lestuplesenfantssonttrouvspar
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 59
dbut;
SetD=vide;
SetD=SetD+f_start(p);/*tuplesdustartwith*/
SetD*=SetD;
ForeachtnonmarquinSetD*[WHEREp1];/*filtreavecWHERE*/
MarquerletupletcourantduSetD*;
SetD*=SetD*+f_enf(t);/*tuplesidentifisparConnectBy*/
end_for;
AfficheSetD*;(aubesoinavecLEVEL);
Fin.
Figure7.22
CetalgorithmeestceluiduSGBDOraclepourimplmenterlexplorationitrativedune
arborescence. Loprateur unaire PRIOR est associ au CONNECT BY qui prcise au
moyenduneconditionlarelationentreletupleparentetlestuplesenfantsetcela,au
moyendunattributquiconcrtiselelien.
ClauseSQL(Oracle)pourfouillerunearborescence:
SELECT LEVEL, nas, LPAD(' ',2*(LEVEL-1))||TO_CHAR(nase) [as]
NASEENF
FROM Parent
START WITH nas = 55 --calcul de D
CONNECT BY PRIOR nase = nas --PRIOR attribut du parent
ORDER BY LEVEL, nas;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 60
Figure7.23
Les requtes rcursives ou hirarchiques sont prvues dans SQL93. Toutefois, Oracle,
DB2 et WATCOM SQL ont dj implment leur propre version de la recherche
hirarchique.LesystmeDB2V2auneimplmentationpluspoussedecetalgorithme
afin de permettre aussi les requtes rcursives. Prenons un autre cas, celui de la table
Produit qui reprsente les pices finies obtenues par lassemblage de pices fabriques
ensoustraitance.
Cesdernirespouvanttreaussicomposesavecdespicesellesmmesfabriquesen
soustraitance. Le produit p1 comprend 2 composantes p22 et 3 composantes p23. Le
produit p20 est compos luimme de 6 composantes p26 et 4 composantes p34. Le
produitp23comprend2composantesp20.Commentformulerlarequtepourafficher
lescomposantesetlessouscomposantesdesproduitsp1?
Une requte dexploration pseudo rcursive est toute dsigne pour effectuer cette
recherche.
Ouvrier(nas*,nom,age,dateEmb,nasChef,noAtelier)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 61
Pour calculer cette rponse, il est possible de dfinir une expression de table qui est
calcule une premire fois pour former lensemble setD, et ensuite recalcule aussi
longtemps que de nouveaux tuples sont ajouts lensemble prcdent pour former
setD*. Lalgorithme utilis est similaire celui de Oracle. Il consiste calculer ds le
dpart lensemble setD, i.e. les personnes supervises directement par le chef Patron
dontlenasestn1.Cestlasousrequteinitiale.Ensuite,ilfautcalculerrcursivement
lesOuvrierssupervissparchaque ouvrierdelensembleinitial.Lesemploysdoivent
tre relis aux tuples existants dans lensemble prcdent. La syntaxe en DB2 est la
suivante:
Loprateur UNION ALL est similaire lUNION, incluant cependant dans le rsultat
touslestuples,ycomprisceuxquisontdupliqus.
7.15FonctionsSQL
Lesfonctionsdulangage8sontdivisesendeuxgroupesselonquellessappliquentun
tuple(fonctionscalaire)ouunensembledetuples(fonctiondagrgation).
7.15.1Fonctionsappliqueschaquetupleslectionn
Lesfonctionsscalairessontclassesselonlanaturedesargumentsetdeleurtraitement
particulier:
Fonctionsnumriques:oprateursmathmatiques,arrondi,troncature,valeurabsolue,
Fonctionscaractres(chanes):recherchedunesouschane,longueur,transformation,
Fonctionsavecladate:transformationenformatdateetinversement...
Fonctiondeconversion:conversionnumrique,demonnaie,decalendrier,...
Lesoprateursarithmtiquesetlesfonctionsincorporsdansuneexpressiondulangage
peuventtreutilissdanslaclauseSELECTet/ouWHERElaplacedunattribut.Une
fonction ne diffre dun oprateur que par la forme externe de ses arguments. La
fonctionazroouplusieursargumentsspcifisdanssaliste.Loprateuraaumoinsun
argument et, sil en a deux, ils sont spcifis en notation arithmtique usuelle. La
fonction plusieurs arguments scrit sous la forme bien connue avec la liste des
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 62
argumentsentreparenthses.Finalement,lalibrairiedesfonctionspeuttreaugmente
volont,tandisquelesoprateurssontfigsparlagrammairedulangagededonnes.
Fonctionsetoprateursnumriques
Lagammedesfonctionspeutvarierdunsystmelautre.Parexemple,certainsSGBD
offrent les services dun gnrateur de nombres alatoires, la fonction RAND(), tandis
quecettemmefonctiondoittreimplmenteparlutilisateuraumoyendelafonction
modulo.
**LafonctionTRUNC()joueunrleparticulierdansletraitementdesdates.Eneffet,un
attribut dclar de type date est cod linterne avec un format particulier qui inclut
aussiletempscorrespondantlacrationdutupledanslabase.Cetempsestcompos
delheure,laminuteetlaseconde:hh:mi:ss.Achaqueinsertionoumodificationdune
date,lheurepeuttreajoute,sinonelleestannexeautomatiquementparOracleselon
une valeur par dfaut gnralement dfinie dans un fichier systme dinitialisation
comme tant 00:00:00. Pour supprimer le temps dans la date, il est aussi possible
dutiliserlemasquedelafonctionTO_CHAR()oudefaireappellafonctionTRUNC().
Danscederniercas,latroncaturesopreenenlevantlapartietempsdeladate.
Exemples:
TRUNC (SYSDATE) supprime le temps de la date du jour.
TO_CHAR(dateIn, 'DD-MM-YYYY')
chane date retourne sans le temps
SELECT To_Char(trunc(SYSDATE), DD-MM-YYYY)
FROM DUAL;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 63
Voici quelques exemples qui illustrent lusage des oprateurs binaires et des fonctions
scalaires:
a)Calculerlaracinecarredelamargebnficiairesurlesarticleseninventairedontle
cotdachatestplusgrandque10$.
c)Afficherlemontanttotaldelaventede23articlesauprixde45$lunit.Pourobtenir
larponse,ilfauteffectuerunesimplemultiplicationenutilisantlatableDUAL:
LecalculestpossibledansunSELECToudansunWHEREconditionderfrerune
table de la base de donnes. En effet, la grammaire exige la prsence dune table pour
que lanalyse syntaxique accepte la clause SQL. La table DUAL est en quelque sorte
virtuelleetpermetdesatisfaireauxexigencesdelagrammaireSQL.
d)Listerlesarticleseninventairedontleprixdeventeestinfrieur90%dumontantle
plusleventreleprixdeventeetlecot.
SELECT article
FROM Inventaire
WHERE prixVente < .90 * GREATEST(cout, prixVente);
e)Listerlesarticleseninventaireetlemontantleplsulventreleprixdeventeetle
cot:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 64
Les arguments des fonctions sont des constantes, des attributs ou des expressions de
chane.Lavaleurretourneesttype.Cependant,unefonctiondontundesarguments
estNULLretourneunevaleurqui estunnull,saufpourlafonctionREPLACE().Cette
dernirefonctionaccepteleNULLetpermetsonremplacementparunautrecaractre.
Lesfonctionsontuncomportementgnralprdterminlorsquetouslesargumentsde
sonprototypesontfournis.Ellesontaussiuncomportementparticulierlorsquecertains
argumentssontabsentsourduitsleurplussimpleexpression.
Fonctionsdechane Description
LPAD(ch1,n[,ch2]) Remplissageparlagaucheaveclescar.ch2jusqucequela
longueur totale de ch1 soit n. Si ch2 est absent, le caractre
deremplissageestleblanc.
LTRIM(ch1[,setcar]) Suppression des car. par la gauche dans ch1 jusquau 1er
car.quinestpasdanssetcar.Sicetargumentestabsent,tous
lesblancssontsupprimsparlagauche.
RPAD(ch1,n[,ch2]) Remplissagedroitavecch2jusqulatteintedelalongueur
npourlachanech1.
RTRIM(ch1[,setcar]) Suppressiondescar.parladroitedansch1jusquau1ercar.
quinestpasdanssetcar.
CHR(n) CaractreASCIIquivalentlentiern.
INITCAP(ch1) Retourne ch1 avecune majuscule pourle premier caractre
dechaquemotdech1.Deuxmotssontsparsparunblanc.
CONCAT(ch1,ch2) Concatnationdech1etch2danslordredesarguments.
LOWER(ch1) Retournech1enminuscules.
UPPER(ch1) Retournech1enmajuscules.
SOUNDEX(ch1) Code pseudo phontique de ch1 (signature phontique de
Oracle)
SUBSTR(ch1,m,n) Extractiondunesouschanepartirdelapositionm(incl.)
etdelongueurn.
TRANSLATE(ch1,s,c) Transcodagedech1:chaquecar.dech1retrouvenposition
i dans la chane s est remplac par celui de mme position
dans la chane c. Le caractre de remplacement dans c ne
peut pas tre un null, car la fonction retournerait alors une
valeur nulle. Si la position i est absente dans c, alors le
caractreestsupprimdansch1.
INSTR(ch1,ch2,n,[i]) Retourne la position de la i me occurrence de ch2 dans la
chanech1etcelapartirdelapositionn.Siiestabsent,sa
valeurpardfautest1.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 65
Voici quelques exemples avec BD3 pour illustrer lusage des fonctions de chane,
notammentlembotementdesfonctions.
a)Afficherlenometlenumrodesemploysdontlenomdpasse40caractres
SELECT noEmpl, nom
FROM Empl
WHERE LENGTH(nom) > 40;
b)Extraireunesouschanedunomdesemploysdontlenumroestsuprieur400
partirdelapositionosetrouvelapremireoccurrencedelalettreietcelajusqula
positionosetrouvelapremireoccurrencedupremierblanc.
SELECT SUBSTR(nom, INSTR (nom, 'i'), INSTR (nom, ' ' ))
FROM Empl
WHERE noEmpl > 400;
c) Affichez le nom des ouvriers dont les voyelles sont supprimes sauf une qui est
remplaceparlecaractresoulign_.
SELECT TRANSLATE(nom, 'aeiouy', '_')
FROM Empl;
LafonctionRTRIM()permetdesupprimerparladroitelescaractresjusquaupremier
absentdelalistefourniecommedeuximeargument.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 66
Le principe gnral repose sur le fait que les consonnes susceptibles dengendrer des
confusionssontcellesquiappartiennentlammefamillephontique.Enanglais,ilya
6famillesphontiques:bilabiale,labiodentale,dentale,alvolaire,nasaleetlaryngale.Il
suffirait en principe donc de remplacer les consonnes dune mme famille par un
caractre unique pour rsoudre plusieurs cas dambigut. Finalement, comme les
erreursdanslagraphiesontplusprobablesavecunnomlongquavecuncourtetque
les erreurs se situent trs souvent la fin du nom, le code Soundex ne retient que les
premierscaractresducodegnr.
AlgorithmeSoundex(versionOdell)
1LenominitialestplacdanslavariableCode_S;
2SupprimertouslescaractresnonalphabtiquesdeCode_S.
LachanerestanteestaffectelavariableCode_Cinitial;
3TransformerleslettresrestantesdansCode_Cenlettresmajuscules;
4LepremiercaractreduCode_Cestgardtelquel;
5LesautrescaractresduCode_Csonttraitsettransformsainsi:
5.1LesvoyellesetlescaractresHetWsontsupprimsdansCode_C;
5.2LescaractresB,F,P,etVduCode_Csontremplacsparlechiffrecaractre1;
5.3LescaractresC,G,J,K,Q,S,X,ZduCode_Csontremplacsparlechiffrecaractre
2;
5.4LescaractresDetTduCode_Csontremplacsparlechiffrecaractre3;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 67
5.5LecaractreLduCode_Cestremplacparlechiffrecaractre4;
5.6LescaractresMetNduCode_Csontremplacsparlechiffrecaractre5;
5.7LecaractreRduCode_Cestremplacparlechiffrecaractre6;
6ToutepairedecaractresSoundexidentiquesdansCode_Cestremplaceparunseul
caractre;
7 Les caractres reprsentant les voyelles encore prsentes dans Code_C sont
supprimes;
8LepremiercaractreetlestroischiffressuivantssontconservscommecodeSoundex;
si Code_C na pas suffisamment de chiffres, la chane est complte avec le caractre
chiffre0.
Le calcul de la signature est en quelque sorte un Hashing avec cette diffrence que le
nombredecollisionsestsensiblementimportant,pourpeuquelesracinesdesnomsde
lasourcesoientsimilaires.LefficacitdelasignatureduSoundexpeuttremesurepar
lenombredesignaturessimilairesgnresparlalgorithme:
E = 1 - (nb_signatures_identiques / nb_de_noms_diffrents).
Pour un ensemble sans conflit de signatures, E = 1 ; avec une seule signature pour un
ensembledenoms,E=0.
7.15.3FonctionsSQLpourletraitementdesdates
Les dates13 sont des donnes importantes dans une base de donnes et leur traitement
est plus complexe quon limagine priori. Lhistoire du calendrier remonte au grec
Meton (400 B.C.) qui dcouvrit le cycle lunaire de 19 ans et son effet sur la faon de
reconnatrecorrectementlessaisons.cettepoquelaconnaissanceducycledessaisons
taitunequestionimportantepourlagricultureetdesurvie!Ilsenestsuivitraversles
siclesunesriedereprespourdutempsaumoyendelanotiondedateintgredans
divers calendriers, chacun dnomm par le nom de son auteur. Ainsi pour les
musulmans,cestlafuitedeMahometdelaMecqueversMdineen622quimarquele
point de dpart du calendrier. Pour le monde hbreu le calendrier dbute avec la
cration du monde fixe 3760 ans avant JsusChrist. Pour les chrtiens, cest la
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 68
naissance de Jsus fixe qui dtermine lanne 0. Cest donc dire que lan 2000 en
Occidentcorrespondlan5760pourleshbreuxetlanne1377pourlesmusulmans!
Sur le plan plantaire, une date est une convention dcriture dune ralit temporelle
fortement influence par le systme des plantes. Plus concrtement, un systme
informatique moderne doit tenir compte de plusieurs lments pour reprsenter une
datedecalendrier,notammentducaractreconventionneldesonoriginequivarieselon
lesystmepoliticoreligioculturelderfrence.
Dans un SGBD, chaque date est stocke dans un format interne complexe particulier
chaque systme SGBD. Elle comprend, pour un calendrier Julien qui utilise la notion
dcartavecunpointtemporelfixe,outrelejour,lemoisetlanne,lesicle,lheure,la
minuteetlaseconde.
Datedansundesformatsexternesdisponibles
To_Char()
xx.ee.sss.uuu.urruu.tt 21 :24Jan200016:45:32
t
To_Date()
Figure7.25b
Les dates en format interne obissent une relation dordre; elles peuvent tre lobjet
dune comparaison ou dun calcul par les oprateurs de date, comme une addition ou
une soustraction. Le format des dates doit tre valide audel du sicle courant afin
dviter les problmes du passage du millnaire dbusqus dans les anciennes
applications(legacyapplications). Passagebidirectionneldunedateenformatinterneau
formatexternepilotparungabarit(masque).
LesfonctionsTo_Date()etTo_Char()sontimportantespourlamanipulationdunedate.
Ces fonctions comportent plusieurs arguments qui seront expliqus un peu plus loin.
Plusieursautresfonctionsutilisentunargumentdutypedatepourfairedesoprations
surcellesci.
Fonctionspourlesdates Description
SYSDATE Datedusystme(dujour);fonctionsansargument.
LAST_DAY(d) Datedudernierjourdumoiscomprenantladated
MONTHS_BETWEEN(d1,d2) Nombredemoisentredeuxdatesd1etd2
ADD_MONTHS(d,n) Retourneladateenyajoutantnmoisladated.Lenpeut
trepositifoungatif.
NEXT_DAY(d,j) Retourneladateduprochainjourjquisuitladatespcifie.
LedimancheestcodavecJ=1ouSUNDAY
Figure7.26
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 69
Lavaleurretournepeuttreunentierouunedate.Parexemple,sionajouteunentier
une date, la rponse est une date. Par contre, si on soustrait deux dates, la valeur
obtenueestunentier.
Exemples:
a)Afficherladatedujour
SELECT SYSDATE
FROM DUAL ; /*DUAL est une table virtuelle ncessaire dans
une clause pour satisfaire la grammaire de SLQ */
LorsdelaffichagepilotparSQL*Plus,letempsestenlevetseulementleslmentsde
ladate,formedujour,dumoisetdelannesontaffichsparcetteclause.
Cet affichage peut tre aussi bien contrl par un format explicite au moyen de la
fonctionTO_CHAR()quicomporteunmasque.
SELECT TO_CHAR(dateEmbauche,'DD-MON-YYYY',
'NLS_DATE_LANGUAGE = french')
FROM Employe;
La date affiche aura le format suivant: 23DEC1998 et le mois sera exprim dans la
languespcifieparleparamtreNLS.
b)Afficherledernierjourdumois:
SELECT LAST_DAY(SYSDATE) "dernier jour du mois" <-
libell
FROM DUAL;
Lachanedevientlintituldelacolonnedelatablerponse.Lesguillemetsdoublessont
utilissparcequelelibellcontientdesespaces.
c)Afficherlarrondideladatedujour:
SELECT ROUND(SYSDATE)
FROM DUAL;
d)Afficherladateduprochainlundiaprsle31dcembre1999.
SELECT NEXT_DAY('31-dec-1999', 'MONDAY')
FROM DUAL;
Datepardfaut
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 70
LesystmeSGBDanormalementunformatdedatepardfautdfinidansunfichierde
paramtresprisencompteaulancementdelinstance.AvecOracle,ceformatpeuttre
DDMONYYYY; dans ce cas le gabarit ne spcifie pas le temps qui est par dfaut
00:00:00,soitminuit.Ceparamtrepeuttrespcifiouredfinidanslefichiersystme
INIT.ORA.
Aveclasuppressiondutemps:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY' ;
partir de cet instant, les insertions de tuple avec une date peuvent se faire avec le
nouveau format de date. linterne, le temps sera celui dfini par dfaut, soit par
exemple00:00:00:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 71
rponse>12DEC199823:25:56
FonctionsSQLdeconversiondestypes
Quelquesfonctionsjouentunrleparticulierdanslaconversiondutypeinterneversun
format externe compatible avec lenvironnement. Le paramtre NLSP permet de
spcifierle moisdansunelanguenaturelleparticulire.Parexemple,pourobtenir une
date avec le mois en franais partir de la date stocke en format amricain, il suffit
dutiliserletroisimeparamtredelafonctionTO_CHAR():
Fonctionsconversions Transformation
TO_CHAR(d,masque[,nlsp])) Retourneunechanepourladatedconformmentaumasque
fourni.
TO_DATE(ch1,masque[,nlsp])) Conversiondech1auformatinternedateeninterprtantla
chaneselonlemasquefourni.
TO_NUMBER(ch1,masque[,nlsp]) Fournit la valeur numrique de la chane ch1 conformment
aumasquedunombre
ROWIDTOCHAR(ROWID) VersionchaneduROWID
CHARTOROWID(ch1) ConversiondelachaneenROWIDdetuple
Figure7.27
SELECT TO_CHAR(date_nais,'YYYY-MON-DD',
'NLS_LANGUAGE_FORMAT = french')
FROM Employe
WHERE TO_CHAR(date_nais, YYYY) = 1984;
Ladatenestpasstockecommeuneconstante,maisavecunformatinterneparticulier
Oraclequiinclutleslmentssuivants:sicle,anne,mois,jour,heure,minuteetseconde.La
datereprsenteavecuntelformatnepeutdoncpastreutilisedirectementdansun
prdicatcommepeutltreuneconstantedechanetellequeJAN2594.Elledoittre
transforme pour obtenir une chane qui peut tre compare une autre chane. La
transformation inverse de la date en une date de format interne est effectue par la
fonction To_Date(). Limportance des dates justifie limplmentation dune
arithmtiquesimplifieaveclesdates(aveclesoprateursarithmtiques+et).
DanscertainssystmesSGBD,laconstanteajouteouretranchepeuttreassortiedune
unit: DAYS ou MONTHS. Chez Oracle, lunit est exclusivement et implicitement le
jour(DAY).Lesexemplessuivantsillustrentcettearithmtique:
a)SYSDATE + 1, pour obtenir la date du lendemain (DAY est lunit par dfaut de
Oracle);
b)SYSDATE7DAYS,donneladatedummejourdelasemaineprcdente(Oracle);
c)SYSDATEEMBAUCHE,lvaluationdonnelenombredejoursdetravail.
d)SYSDATE+10 MONTHS donne la date du jour, 10 mois plus tard [pas toujours
implmente];
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 72
Ladatepeuttreexprimedelafaontraditionnelleaveclanne,lemoisetlejour,ou
selon le calendrier Julien (depuis le 1er janvier 4712 BC) ou, autrement, en mois ou en
jours depuis le dbut de lanne. Les fonctions de conversion utilisent des masques
(synonymes:gabarit,modle,patterns)pourspcifierlersultat.Unmasquededateest
unecompositionavecleslmentssyntaxiquescidessous.
Lemasque(oulegabarit)delafonctionprcisecommentdoittreinterprtelachane
decaractreslorsdelatransformationparlafonctionTo_Date().
Lesparamtres:
chane:estunechanedecaractresreprsentantunedate;
masque : ou gabarit sous forme dune constante de chane incluant des littraux
daffichage
nlsp: constante pour spcifier la langue nationale : 'NLS_DATE_LANGUAGE =
'french' .
Exemple:
INSERT INTO Ouvrier ('200056345', 'Vzina,'Claude','M','33.8',
To_Date(24-Jan-2000,DD-MON-YYYY,
NLS_DATE_LANGUAGE = french),'u12', 'ps75');
Suppressiondutempsdansladate
UnedateinsredanslabasededonnesOracleparlafonctionSYSDATEestsuffixe
automatiquementparletempscomposdelheure,laminuteetlaseconde(lesicleest
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 73
aussi ajout et rendu accessible). Cet ajout est rendu possible si le format par dfaut
permetladjonctiondutempsrel.LafonctionTRUNC()joueunrleparticulierdansle
traitementdesdatesensupprimantletempsannextoutedatecreetstockedansla
base.
Siletempsestexplicitementexcluparlemasque,lesystmelenregistrecommetant
00:00:00 (minuit). Pour supprimer le temps dans la date, il est possible dutiliser le
masque de la fonction TO_CHAR() ou de faire appel la fonction TRUNC(). Dans ce
derniercas,latroncaturesopreenenlevantlapartietempsdeladate.
Exemples:
TRUNC(SYSDATE)
/*supprime le temps dans la date du jour retourne par la
fonction SYSDATE*/
LafonctionTO_CHARpeutsupprimerletempsinclusdansleformatdunattributde
typedate.
Exemples:
a)Afficherlenumrodesemploysembauchsaprsle23dcembre90:
SELECT noEmpl
FROM Assignations
WHERE TO_CHAR(debut,'DD/MON/YYYY) >'23/DEC/1990';--supp.du
temps
b)Afficherlenom,lenumrodeposteetlerowid(ourid)delemployquiadbutson
travaille24septembre1994:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 74
To_Date('24/sept/1994','DD/MM/YYYY',NLS_DATE_LANGUAGE =
french') = Trunc(debut);
Cetteadressedetuple(rid)peutvarieraucoursdutemps,carellenecorrespondpas
une identit dobjet immuable. Le ROWID sera plus utile avec le SQL intgr parce
quune variable hte peut lutiliser dans un autre SELECT et accder directement aux
tuples.Letempsduformatinternedelattributembaucheestsupprimparlafonction
Trunc (debut, DD). La fonction de troncature modifie la date pour conserver que le
jour.
c)Afficherlemoisenanglaisdudbut(typDate)decontratetlenumrodesemploys
embauchsaprsle23fvrier1990:
SELECT TO_CHAR(debut, 'MONTH', 'NLS_DATE_LANGUAGE= american'),
noEmpl
FROM ASSIGNATIONS
WHERE debut>TO_DATE('23-FEV-1990','DD-MON-YYYY,'NLS_DATE_LANGUAGE
= french');
La comparaison est faite selon lordre lexicographique des chanes. La fonction MIN()
retournera donc la plus petite date dans lensemble des dates, tandis que la fonction
MAX(),laplusgrande.
SELECT MAX(debut)
FROM Employe
WHERE age between 18 and 45;
Cetteclausefournitladatededbutlaplusrcentepourlesemploysde1845ans.
7.16Fonctiondfinieparlutilisateur
Ilestpossiblededfinirunefonctiondutilisateurquieststockedansledictionnairede
la base de donnes sous forme dun objet (persistant et sans mthode) et que toute
applicationpeututiliserdansuneexpressionSQL,etcelapartoutoilpeutyavoirun
attribut.Cetaccsestpossiblesousrservequelutilisateuraitreulesdroitsappropris
parlepropritairedelafonction.Ladfinitiondenouvellesfonctionsenrichitlalibrairie
desfonctionsSQLetpermetdadapterlesystmeauxbesoinsdetraitement.
Notezbienlepoint.quiarrtelditeurPL/SQLdumoduleOracleSQL*Plus]
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 75
Il faut noter que chaque paramtre est fourni avec son type qui ne comprend pas les
lmentsdelongueurpourlachaneetceuxdeprcisionetdchellepourlesnombres.
CettefonctiondelutilisateurpeuttreappeledansunerequteSQLcommetouteautre
fonctioninternedeSQL.
SELECT article, Profit(prixVente, cout)
FROM Article_v
WHERE prixVente > cout;
Cettefonctioneststockedansledictionnairecommeunobjet.Cesobjetssontidentifis
en consultant la table USER_OBJECTS. De plus, le texte de la fonction est aussi
disponibledanslatableUSER_SOURCE.
SELECT TEXT
FROM USER_SOURCE
WHERE NAME = 'Profit';
LecorpsdelafonctionestunblocdePL/SQLpouvantincorporer,selonlesbesoins,une
ouplusieursclausesSQLoudesappelsdefonction.
VoiciuneautrefonctiondutilisateurLongcpourcompterlenombredeconsonnesdans
une valeur dattribut dont le type correspond celui dun attribut du dictionnaire. La
fonctionTRANSLATE()nepeutpastreutiliseavecunNULLcomme3eargument,car
lavaleurretourneestalorsaussinull.
La fonction est stocke dans le dictionnaire de la base de donnes sous la forme dun
objetappelLONGC.CettefonctionestappeledansuneclauseSQLstandard:
SELECT nom, LONGC(nom)
FROM Ouvrier;
Larponseestlenombredeconsonnesprsentesdanslenomdechaqueouvrierinscrit
danslabase.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 76
Rcursivitdesfonctions
UnefonctiondutilisateurouunblocPL/SQLpeuttrercursif.Parexemple,lafonction
factorielleestdfinieenexploitantlarcursivitdelafonction.
CREATE FUNCTION Fact (n Integer) return Integer
is
begin
if n = 1 THEN return 1;
else return (n* fact(n-1));
END IF;
END FACT;
/
La fonction Fact est appele et excute pour calculer par exemple le factoriel des
nombresinfrieurs20.
SELECT Fact(nombre)
FROM TableNombres
WHERE nombre < 20;
FonctionNVL:
Silavaleurdeexpr1estnonnulle
alorsretournerlavaleurdeexpr1;
sinonretournerlavaleurdeexpr2;
Letypedelavaleurretourneestceluideexpr1.
Exemple: Afficher le numro des employs et leur quart de travail. Sil ny a pas de
quartdetravailspcifi(null),afficherlemessagesuivant:quart_libre.
FonctionDECODE()
La fonction DECODE() du systme Oracle implmente une alternative multiple. Elle
correspondlaclauseCASEdelanormeSQL92.
DECODE
(source,expr1,expr1.1,expr2,expr2.1,expr3,expr3.1,val_defaut)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 77
FonctionalgorithmiqueduDecode():
Sisource=expr1THENreturn(expr1.1)
sisource=expr2THENreturn(expr2.1)
sisource=expr3THENreturn(expr3.1)
elsereturn(val_defaut);siaucunmatchnesttrouv
LafonctionDECODE()estdetypetupleetcomparelavaleurdelexpressionsourceavec
le rsultat de lvaluation de lexpression expr1 et, si la comparaison est vrifie la
fonction retourne expr1.1. Dans le cas contraire la comparaison se poursuit avec
lexpression espr2 et ainsi de suite. Si aucun test nest positif, la valeur ou lexpression
pardfautestvalueetlersultatretournparDECODE.
LafonctionDECODEpeuttreutiliseavecunnombrevariabledarguments.
Employe(matricule*, nom, age, sexe, salaire, noDep)
SELECTarticle,COALESCE(prixVente,cout)
FROM Inventaire;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 78
Par exemple, la figure cidessous donne les rgles de transformation pour les types
implmentsdansDB2V2.
Lalongueur,laprcisionetlchellesontfourniesouimposesparletypeciblersultant
de la transformation. Pour bien comprendre ce rsultat, il faut se rappeler que
linterprte SQL traite une fonction par une recherche de son nom dans le schma
spcifi.Parlasuite,ilvrifiesiletypedechaqueparamtreestidentiqueou,dansle
cascontraire,ilchercheuntypecommuntouslesparamtresenlestransformantselon
desrglespropreschaqueSGBD,voirletableaucidessus).
ExempleavecDB2V2
SoitleschmadelarelationUsineProdcomprenantlesattributstypscidessous:
N.B. la valeur 1 pour lattribut production signifie que lon ignore sil y a eu une
productionlusine,tandisqueleNULLsignifiequelaproductionaeulieu,maiselle
estnulle,i.e.napastgarde.
Larponseestlasuivante:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 79
u3 876.4> letypeestdcimal6.1
u5 1.0> ?pourlaproduction
NULLIF()
Cette fonction a deux paramtres, p1 et p2 de type compatible et retourne une valeur
NULL si p1 = p2, sinon p1. La rponse contient deux nulls pour lattribut pmc, dont
luneestjustifieparlaprsenceduneinstanceayantlavaleur1.
SELECT noUs, NULLIF(c_materiau,-1)AS pmc
FROM UsineProd;
noUs pmc
u2 234.2
u1 1764.8
u3 NULL
u5 NULL
7.18Fonctionspourlesagrgatsaveclestuplesslectionns
Ces fonctions de type ensembliste sont appliques un groupe de tuples et renvoient
unevaleurcalculeenignorantlesvaleursnullesdanslestuples(saufpourlafonction
Count(*)). Ces fonctions dagrgation acceptent aussi les modificateursALL et
DISTINCT.LesfonctionspeuventtreutilisesdansleSELECTetdansleWHEREdune
requte.
FonctionsSQLdagrgation
Cesfonctionssontappliquesdesgroupementsdetuplespralablementformsparle
GROUPBY.Endautresmots,lorsquilyaformationdegroupements,celadfinitaussi
laportedesfonctionsdagrgationduSELECT.
Fonctionsdagrgation Description
AVG(attribut) Moyenne
Count(*)|(DISTINCTattrib) Comptage(NULLinclus)
MAXetMIN([distinct]expr1) Valmaxoumindansunensemble
SUM([DISTINCT,]tauxH) Sommedevaleurs
STDDEV(DISTINCT|ALL],attrib) Ecarttypedelargumentattrib
VARIANCE([DISTINCT|ALL],attrib) Variance
Figure7.29
Laportedetoutefonctiondagrgationestlimitechaquegroupeoupartitiondune
relation de base ou dune relation intermdiaire calcule au regard de la liste des
attributs utilise pour dfinir le groupement list dans le GROUP BY. Labsence du
GROUPBYdfinitimplicitementlaportecommetantcelledetoutelatableobtenue
parlecalculdelarequte.
ExemplesaveclabaseBD1
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 80
a) Lister pour les clients Serge et Ted la moyenne des articles achets (Ventes) peu
importelatransaction.
SELECT Avg(qte) [as] moy_Serge_ted
FROM Ventes
WHERE nom = 'Serge' or nom = 'Ted';
LabsenceduGROUPBYfaitensortequelamoyenneestcalculeavectouslestuplesde
la table Ventes. Lattribut nom ne peut pas apparatre dans le SELECT, puisque la
fonction AVG() sapplique sur lensemble des tuples slectionns, la rponse ne peut
avoirquunseultupleetexcluantlapossibilitdavoirunemoyennepourlesachatsde
sergeetuneautrepourted.Cetteambigutestdtectedsltapedinterprtationde
laclauseSQL.
b)Listerlesquantitsmaximaleetminimaledesarticlesvendusjusqumaintenant:
SELECT Max(qte), Min(qte)
FROM Ventes;
La slection est forme de tous les tuples en raison de labsence du prdicat. Les
fonctions max() et min() sont alors appliques sur cet ensemble de tuples, en ne
considrant que lattribut qte pour afficher la plus grande et la plus petite valeur. Les
fonctionsdagrgationpeuventtreaussiimbriquesplusieursniveaux.
c)Compterlesarticleseninventairedontlaventeentraneuneperte.
SELECT Count(article)
FROM Inventaire
WHERE prixVente < cout;
d)Compterlenombredeventesfaitesdespersonnesdenomsdistincts:
SELECT Count(DISTINCT nom)
FROM Ventes;
Remarque:Silexisteunindexsurlattributnom,lecalculdelarequteentireraprofit,
puisquil sagit essentiellement dun comptage possible par la consultation de lindex.
Dans le cas contraire, cette requte est excute par une projection de lextension de
Ventes, la suppression des doublets par un tri et finalement, le comptage des tuples
danslarelationintermdiaireducalcul.
Listerlenomdesclientsayantachetsdesarticlesdontlaquantitcorrespondauplus
grandnombredunarticlequelconquedjvendudansunemmetransaction.
SELECT nom
FROM Ventes
WHERE qte = (SELECT Max(qte) FROM Ventes);
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 81
Lasousrequteestvalueaudbutdelexcutionetlavaleurobtenueestsubstitue
lasousrequteplaceentreparenthses.
7.19Formationdegroupementsaveclestuplesslectionns
Il est possible de regrouper les tuples slectionns dans le calcul dune requte en
fonction dun ou plusieurs attributs. Le groupement inconditionnel implique tous les
tuples, tandis que le groupement conditionnel impose un critre supplmentaire pour
quelestuplesregroupssoientretenusdanslarponse.Cetteoprationdefiltragedes
groupesestralisedanslavantderniretape.i.e.avantcellequiprcdeletri.
7.19.1Regroupementinconditionneldestuples
Tous les groupes forms avec lextension de la rponse et sur la base dune liste
dattributs sont retenus et affichs sans faire lobjet daucun autre filtrage. Chaque
groupecorrespondobligatoirementuntupledelarponse.
Exemples:
a) Lister le nom des clients et la quantit totale de produits achets qui sont encore en
inventaire.
SELECT nom, sum(qte)
FROM Ventes
WHERE article IN
(SELECT article
FROM Inventaire
WHERE cout is NOT NULL ) --articles en inventaire
GROUP BY nom;
b) Lister les transactions de Ventes (tous les attributs) concernant les achats darticles
effectusavecunequantitgalelaquantitmaximumdjvenduepourcetarticle.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 82
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 83
relationnelle, il faut que chaque colonne de celleci transforme par une fonction soit
dfinieavecunalias.
LesaliaspeuventtrelobjetdunerfrencedansuneclauseSQL:
Exemples:
a)Lister le nom des acheteurs qui ont fait plus de deux achats (chaque groupe ou
partitiondevracomprendreplusdedeuxtuples)dunarticleeninventaire.
SELECT NOM
FROM VENTES
WHERE ARTICLE in (SELECT ARTICLE FROM INVENTAIRE
WHERE COUT is NOT NULL)
GROUP BY NOM
Having COUNT(*) >2; --*signifie un comptage de tuples
La clause HAVING Count() est applique chaque partition (interne) forme par le
GROUPBY.Cetteclauseagitcommeunmcanismedefiltragedesgroupes.Lersultat
de la sousrequte est toujours une seule relation dont lextension est ordonne par
largument simple ou complexe du GROUP BY . Ensuite, la projection sur nom est
effectuesurnom.
b)Lister en ordre alphabtique de nom, le nombre des achats effectus par chaque
personne.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 84
c) Lister le nom des acheteurs darticles prsentement en inventaire et dont le cot est
pluslevque10$.Regrouperlestransactionsparnomennegardantquelesgroupes
dontlaquantittotaleestsuprieure10etafficherletotaldesachatseffectus.
SELECT NOM, Sum(qte)
FROM VENTES
WHERE article in (SELECT article
FROM Inventaire
WHERE COUT is NOT NULL and cout > 10)
GROUP BY nom
HAVING Sum(qte) > 10;
Unefonctiondagrgationoudegroupementestutilisepartoutoilpeutyavoirune
variableouunattribut.Laprojectionestcalculecommedansladernireopration,i.e.
aprslefiltragedesgroupes.
Exemple:Identificationdesdoubletsdansunerelation
PourdfiniruneclprimairelatableEmploye,ilfautaupralablevrifierlabsencede
tuplesidentiquesdanslextensioncourantedeEmploye.
aModificationduschmadelatableEmploye.
ALTER TABLE EMPLOYE ADD PRIMARY KEY(noEmpl);
**** ERROR 02299 DUPLICATE ROWS ****
bIdentificationdestuplesdupliqus.Legroupementpeuttreutilisepourvrifierles
doublets:
SELECT noEmpl
FROM Employe
Having Count(*) > 1;
noEmpl
995
Ensuite,ilsuffitdefairelaffichagedestuplesdupliqus.
SELECT *
FROM Employe
WHEREnoEmpl=995;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 85
dSuppressiondestuplesinutilesdanslatableEmploye
DELETE FROM EMPLOYE WHERE NOEMPL = 995 AND VILLE IS
NULL;
eModificationduschmadeEmployeetcrationdelaclprimaire.
ALTER TABLE EMPLOYE ADD PRIMARY KEY(NOEMPL);
7.20JointureSQL
Lorsquunerequteutiliselesattributsdedeuxouplusieurstables,soitdanslarponse,
soitdansleprdicat,lecalculfaitappelunejointurenaturelleouunejointurethta.
Cetoprateurbinairepermetdejoindrelestuplesdestablesrfresparlesoprandes
etcela,chaquefoisquunepairedetuplesvrifielaconditiondejointure(thta).
7.20.1Jointurenaturelle
Lajointurenaturelleimpliqueuneconditiondejointureparticulirequiutilisetous(ou
avecSQL92unepartiedesattributscommuns)lesattributsdemmenomdansluneet
lautredesrelationsoprandes.AveclabaseBD3Dotationdesressourceshumaines,la
jointure entre les tables Assignations et Postes est possible par lentremise de la
conditiondejointuredanslaquellelesattributscommunsjouentunrleessentiel.
Parexemple,trouverlematricule(noPoste)desemploysquioccupentunposte.
SELECT noEmpl
FROM Assignations A, Postes P
WHERE Assignations.noPoste = Postes.noPoste;
Cettejointureestnaturelleparcequelattribututilisdanslajointureportelemmenom
danslesdeuxtablesoprandes.EnSQL92,laformulationdecettejointurenaturelleest
plussimple.
SELECT NOEMPL
FROM ASSIGNATIONS NATURAL JOIN POSTES;
Silajointurenaturelledoittrerestreinteunseulattributdemmenomdanschaque
oprande, il suffit de le nommer explicitement avec la clause USING(). Ce sera le cas
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 86
lorsquelaclestcomposedeplusieursattributsquisontaussilacltrangredansune
autrerelation.
Une jointure pourrait nexploiter quun seul attribut de la cl trangre. Par exemple,
dans la base Dotation des Ressources Humaines, il suffit denrichir le schma de la
relationPostesaveclattributvillePostepourobteniruneclcompose.Dummecoup,
leschmadelatableAssignationsestaussienrichidummeattributetlacltrangre
estcomposedetroisattributs.
PourfaireunejointurenaturelleennutilisantquelattributnoPoste,ilsuffitdeformuler
laclauseainsi:
SELECT noEmpl
FROM Assignations JOIN Postes USING (noPoste);
Pourfaireunejointurebasesurlesdeuxattributsdelacltrangre:
SELECT noEmpl
FROM Assignations JOIN Postes USING (noPoste)
Assignations JOIN Postes USING (villePoste);
NB:EnSQL92,lesattributsdejointurenaturelleexplicitementutilissdansleUSING
nedoiventpastreprfixsdanslalisteduSELECTetdansleWHERE.
7.20.2Jointurethta(jointuresousconditionthta)
Pourlajointurethta,lajointurenaturelleestaugmenteduneslectionformuleavec
une condition plus ou moins complexe. Cette slection est effectue de prfrence en
mmetemps(modepipeline)quelajointure.Parexemple,silfauttrouverlesmatricules
(noEmpl)desemploysquioccupentunpostedemcano,lajointureestdetypethtaet
est lgrement plus complexe que celle de type naturel. En SQL92, cette premire
jointureestformuleavecloprateurJOIN.
SELECT noEmpl
FROM Assignations [as] A JOIN Postes [as] P
ON A.noPoste = P.noPoste and description = 'mcano';
Danscecasci,laclauseONpermetdespcifierlaconditiondejointureaveclesattributs
quipeuventavoirunnomdiffrenttoutenpartageantlemmedomaine.Ilesttoutefois
possibledeformulerunejointurethtasansfaireappellgalitsurlesattributs.Dans
cecas,lajointuresapparenteunproduitcartsienassortiduneconditiondefiltrage.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 87
7.21Divisionrelationnelle
Lorsquune requte suppose la quantification universelle dau moins un attribut dune
relationdebaseoudunerelationintermdiaire,ilfautsongerladivisionrelationnelle.
Cest un oprateur utile, mais moins utilis dans les activits courantes que les cinq
oprateurs dits essentiels ou de base. Le dividende de la division est une relation
intermdiaire constitue avec un lot dattributs de la sortie augment avec lattribut
quantifi. Le diviseur est une relation intermdiaire forme de lattribut quantifi
universellement. Ces relations intermdiaires sont calcules par des oprations
relationnellessurlesrelationsdebasededonnes.
Exemple:
Listerlenomdesclientsayantachetunexemplairedetouslesarticlesactuellementen
inventairedontleprixdeventeestinfrieur35$.
Les relations Ventes1** et Inventaire1** sont des relations intermdiaires obtenues par
uneprojectionappropriesurunerelationdebase.Parexempleauregarddelaquestion
prcdente, le diviseur Inventaire1 est form des articles en inventaire dont le prix de
venteestmoinsque35.00$.Ladivisionrelationnellenestpasunoprateuressentiel,car
elle peut se formuler avec une expression complexe compose que des oprateurs
lmentaires comme la projection, la slection et la diffrence. Les points essentiels
retenirdanslaformulationdunedivisionsontlessuivants:
a)Ledividendeestunerelationquifournitlesattributsdelarponserecherche.
b)Lediviseurestunerelationquicontientlattributquantifiuniversellement.Lepoint
critiqueestlidentificationdelattributquantifiuniversellement.Ilestsouventprcd
dumottousoutoutes.
7.21.1DivisionrelationnelleenSQL
UneimplmentationpossibleenSQLdelarequtecidessousfaitappelauGROUPBY
etauHavingCount().
Listerlenomdesclientsayantachetunexemplairedetouslesarticlesactuellementen
inventairedontleprixdeventeestinfrieur35$.Rappelonsquilsagitdetrouverle
nomdesclientsactuelsquiapparaissentdanslatableVentesencombinaisonavectous
lesarticlesquisontdanslatableInventaire.
SELECT nom
FROM Ventes V
WHERE article in
(SELECT article FROM Inventaire I
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 88
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 89
Une autre faon moins lgante, mais qui fournit un rsultat correct est le calcul de
lexpression algbrique quivalente la division au moyen des oprateurs de base de
lalgbrerelationnelle:
(r s) = R-S(r) - R-S((R-S(r) x s) - r)
o R-S est une diffrence entre les attributs du schma R et ceux
de S.
FormulationdeladivisionenSQL
La formulation de la division algbrique peut tre ralise sans trop de difficults en
SQL. Nous allons illustrer lalgorithme de passage de lalgbre La clause SQL au
moyendelexemplesuivant:
Question : Lister le nas des tudiants qui sont inscrits tous les cours offerts
prsentement.Lexpressionrelationnellecorrespondanteestlasuivante:
R1 (nas, noCours) R2 (noCours)
Les dividende et diviseur sont obtenus par des oprations sur les relations de base.
LattributnoCourspartagelemmedomainesmantique.
bLescoursdontilsagitdanslediviseursontceuxoffertsprsentementetlistsdansla
table Classe. Cela comprend les cours qui nont pas t choisis, bien que ceuxci ne
serontjamaisdanslarponse.
noCours (Classe)
Ladivisionsexprimealorsaveccesdeuxoprandesdelamaniresuivante:
nas, noCours (Etudiant) noCours (Classe)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 90
Les deux oprandes sont euxmmes des expressions algbriques aussi complexes que
celaestncessaire.SidansuneSGBD,loprateurSQLpourladivisionestimplment,
alors la formulation de la clause est immdiate. Mais cet oprateur nest pas encore
prsentdansleSQL.
Algorithmegnral
Pour formuler une division en SQL, on peut adopter une approche base sur le
comptage des tuples (lautre est fonde sur la logique du 1er ordre). Dans lexemple
prcdent, il sagit de compter combien de cours diffrents sont choisis par chaque
tudiantetnereteniruntudiantdanslarponsequesicenombregaleceluidescours
distinctsoffertsparlesclassesprsentementlhorairepourletrimestreencours.
Enpremier,ilfautsavoirque:
Lattribut(oulesattributs)delarponseestceluiquiserautilisdansleGROUPBY.
Lattribut quantifi universellement (tout) et qui est aussi lattribut de la relation
diviseurserautilispourfiltrerlespartitionsformesparleHaving.
La sousrequte dans le Where du bloc principal exprime la relation de loprande
diviseur.
partirdecesconsidrationslalgorithmedcrituredeladivisionestlasuivante:
ProtocoledcrituredelaclauseSQLpourladivision:
1 Exprimer le dividende de lexpression algbrique en tenant compte du prdicat de
slectionimposauxtuples.Exemple:touslescoursde1999,nesontpastouslescours
prsentsdanslarelationCours,maisbienuneslectiondeceuxci.
2RegrouperlestuplesdudividendecalculparunGROUPBYformulaveclattribut
deladuschmadelarponseescompte.
4FiltrerlespartitionsparunprdicatinclusdanslaclauseHavingetquicomporteune
comparaison avec une sousrequte formule avec lexpression algbrique du diviseur.
LeDISTINCTnestncessairequesilattributdudiviseurnestpasaussilacl.
5SupprimerdansleSELECTdudbut,lesattributsquinesontpasdansleGROUPBY
etyajouter,aubesoin,lesfonctionsdsires.
EnSLQ:noCoursestuneclprimaire,doncilnyapasderedondancesupprimersi
latableestcohrente:
SELECT nas
FROM Etudiant
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 91
GROUP BY nas
Having Count(noCours) = (
SELECT Count(noCours)
FROM Classe);
Unefonctiondagrgationpeuttreinclusedanslarponse:
SELECT nas, Count (noCours),
FROM Etudiant
GROUP BY nas
Having Count(noCours) = (
SELECT Count (noCours)
FROM Classe);
Diviseuretdividendepluscomplexes
Le diviseur est une relation quelconque qui peut tre fournie par un calcul pralable
rendupluscomplexeenyajoutantdesslectionsoudesjointures.
Exemple:Listerlenasdestudiantseninformatiquequisontinscritstouteslesclasses
desociologie.Ledividendeestainsiramenauxseulstudiantseninformatique:
( SUBSTR(noCours,1,3)=ift (noCours,nas(Etudiant)))
Demmepourlediviseurquininclutquelescoursdesociologie:
( SUBSTR(noCours,1,3=soc (noCours(Classe)))
Ladivisionestalorsexprimeainsi:
( SUBSTR(noCours,1,3)=ift (cours,nas(Etudiant)))
( SUBSTR(noCours, 1, 3) =soc (cours
(Classe)))
EnSQL: SELECTnas
FROM Etudiant
WHERE SUBSTR(noCours, 1,3) = 'ift'
GROUP BY nas
Having Count (noCours ) = (
SELECT Count(noCours)
WHERE SUBSTR(noCours, 1,3) = soc
FROM Classe);
2Ledividendepeuttreaussipluscomplexesionajouteunprdicatdeslectionplus
slectifpourleregroupementdestuples.Listerlenasdestudiantsayantplusde22ans
qui suivent des cours en informatique et qui sont inscrits toutes les classes de
sociologie.
Ledividendeesttransformpourneretenirquelestuplesdestudiantsayantplusde22
ans.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 92
Ladivisionestalorsexprimeainsi:
( age>22andSUBSTR(noCours, 1,3)='ift' ( nas,noCours(Etudiant))
(SUBSTR(noCours,1,3)=soc (cours(Classe)))
EnSQL:
SELECT nas
FROM Etudiant
WHERE age > 22 and SUBSTR(noCours, 1,3)='ift'
GROUP BY nas
Having Count (noCours) = (
SELECT Count(noCours)
FROM Classe
WHERE SUBSTR(noCours, 1,3)= 'soc');
Misejourdelextensiondunetable:UPDATE(etDELETE)
Ilestpossibleaussiderutiliserlammequestionfondesurladivisionpourmettre
jourunerelation.Eneffetlamisejourestprcdedunerecherche,quiestformule
parunprdicatdeslectionquipeuttreaussicomplexequelexigelarequte.Lebut
decetteslectionestdidentifierleoulestuplesmettrejour.
Exemple:
Diminuer de 10.00 $ les frais pour les tudiants qui ont t inscrits toutes les classes
dinformatique.
UPDATE Etudiant SET frais = frais - 10.00 WHERE nas IN (
SELECT nas
FROM Etudiant
WHERE SUBSTR(noCours, 1,3)='ift'
GROUP BY nas
Having Count (cours) = (
SELECT Count(noCours)
FROM Classe
WHERE SUBSTR(noCours,
1,3)='ift'));
6.21.2Approcheparlalogique
On peut aussi crer une autre expression SQL en utilisant la clause EXISTS pour
implmenter lquivalent de la division relationnelle. Prenons comme exemple la
questioncidessousaveclabaseDB3.
Listerlenomdesclientsayantachetunexemplairedetouslesarticlesactuellementen
inventaire.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 93
Cette question a pour rponse le nom des clients ayant une certaine proprit, celle
davoir achet tous les articles en inventaire. Examinons en premier le cas particulier
dunseulclientdontlenomestn5;ensuitenousgnraliseronslarequte.Lassertion,
il nexiste pas un article en inventaire qui nest pas vendu n5 doit tre vraie. Pour
infirmer ce test, il suffit de trouver un contreexemple dun article en inventaire, par
exemplea2quinestpasmentionndansunetransactiondeventeauclientn5.Siun
tel article (le contreexemple) existe, il est alors vident que le client n5 ne peut pas
tre dans la rponse de la division, puisquil na pas acquis cet article a2. Pour
dmontrer que cet article a2 est absent de la table Ventes pour le client n5, il faut
effectuerunerecherchedanslatableInventaireafindeconfirmerquea2estbeletbien
en inventaire et vrifier quil nexiste pas une transaction de vente pour cet article au
nomduclientn5(reprsentparlavariablev.nom).
Sicetteclauseafficheunerponse,alorscelaconfirmequelarticlea2esteninventaire
et na pas t lobjet dune transaction dans la relation Ventes. Il faut maintenant
formuler une condition qui garantit quaucun contreexemple nexiste pour chaque
clientdelarponse,peuimportelarticle.Onvrifielabsencedecontreexempleet,du
mmecoup,lesclientsquiontachettouslesarticlessontidentifis.
SELECT nom
FROM Ventes V
WHERE NOT EXISTS
(un contre-exemple pour le nom de chaque client test un
un)
Cette clause fournit donc les clients qui ont achet tous les articles sur la base de
labsenceduncontreexemple.Lecontreexemplecorrespondunarticleeninventaire
quinestpasachetparleclientcourant.Pourchaquearticle,ilestformulainsi:
(SELECT *
FROM Inventaire I
WHERE NOT EXISTS
(aucun client pour l'article courant tel que test par la
sous-requte qui suit)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 94
Lasousrequteestdoncformuleainsi:
(SELECT *
FROM Ventes X
WHERE I.article = X.article and X.nom = V.nom) ;
Enintgranttoutescesclauses,onobtientlarequtesuivante:
Cette clause peut se lire ainsi: Retenir les tuples dans la table Ventes, pour les clients
ayantachetsunarticledesortequaucuntupledanslatableinventairesoitabsentdans
latableVentespourceclientetcetarticle.
Ventes: Inventaire:
nom* article* qte* article* prixVente cout
Serge a1 3 a5 12 8
Ted a2 5 a1 20 15
Serge a5 3
Voici une trace de lexcution de cette requte SQL formule avec la clause logique
EXISTSetaveclesdeuxtablescidessus:
T u p l e d e V e n t e s TupledeInventaire TupledeVentes
V I X
S e r g e , a 1 , 3 a5,12,8(x) Serge,a1,3(x)
Ted,a2,5(x)
Serge,a5,3ok
a1,20,15(x) Serge,a1,3(ok)
S e r g e , a 1 , 3 Ted,a2,5(x)
Serge,a5,3x)
... ... ...
T e d , a 2 , 5 a5,12,15(retenu) Serge,a1,3(x)
Ted,a2,5(x)
Serge,a5,3(x)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 95
T e d , a 2 , 5 a1,20,8(x) Serge,a1,3(ok)
Ted,a2,5(x)
Serge,a5,3(x)
S e r g e , a 5 , 3 a5,12,8(x) Serge,a1,3(x)
Ted,a2,5(x)
Serge,a5,3(ok)
S e r g e , a 5 , 3 a1,20,15(x) Serge,a1,3(ok)
Ted,a2,5(x)
Serge,a5,3(x)
SuividelvaluationdelaclauseSQLavecEXISTS
Figure7.31
Le tuple le plus gauche nest conserv que sil ny a pas de tuples slectionns
immdiatementsadroite.Limplmentationdirecteduquantificateuruniverseldansle
langageSQLrendraitlaformulationplusnaturelleetlargementplussimple.
Le motcl FOR ALL propos comme ajout possible dans la dernire norme soustend
alorsladivisionrelationnelle.Lattributoprandedudiviseurestceluiquiestquantifi.
Uneautresolutionhypothtiqueseraitlasuivante:
SELECT nom
FROM Ventes, Article
DIVIDE [EXACTLY] Ventes BY Article
ON Article ;
7.22Jointureexternegauche(leftouterjoin)
Lajointureexternegaucheestutilepourcalculerefficacementcertainesrponsesquela
jointuresimpleoucompltenepeutpastrouverdirectement.Parexemple,pourobtenir
le nom des articles vendus et leur prix de vente sil est connu, il suffit de faire une
jointureexternegauche.Lajoutdestuplesquineparticipentpaslajointureesteffectu
endernierlieu,aprslajointure.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 96
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 97
VoiciuneclauseSQLdiffrentedelammerequte.
(SELECT article, cout
FROM Inventaire
WHERE cout is NOT NULL and article IN
(SELECT article
FROM Ventes))
UNION
(SELECT DISTINCT article, cout
FROM Ventes);
Jointurecomplte
Unetellejointurepeuttrecalculeparluniondedeuxtablesdemmeschma.
Parexemple,supposonslabasesuivantereprsentantlesemploystravaillantdansles
dpartements. Un employ travaille dans un seul dpartement, mais un dpartement
encadreletravaildeplusieursemploys.
Departement(noDep*, ville)
Employe(noEmpl*,nas, nom, age, noDep)
Lapremirepartiedelaclausefournitlesdonnessurlesdpartementsencadrantdes
employsetinclutaussilesdpartementsdontlenomestinconnu.Ladeuximepartie
de la mme clause donne aussi les donnes sur les dpartements encadrant des
employs, mais ajoute aussi les employs nayant pas encore dassignation de travail
dansundpartement.
Autresoprateurs:union,diffrence,intersection.
Ces oprateurs exigent une conformit du schma des tables oprandes. Ainsi, pour
faireluniondedeuxextensions,ilfautqueleurschmarespectifaitlemmenombrede
colonnesetquechaquecolonnecorrespondanteaitunmmedomaine.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 98
7.23Union
Lunionrelationnelleestsimilairelunionensemblisteetrequiertlidentitduschma
pour les deux oprandes. Ainsi, on obtiendra une mme liste des articles vendus en
quantitsuprieure5etceuxdontleprixdeventeestsuprieurdeuxfoislecotpar
lexpressionsuivante:
(SELECT article
FROM Ventes
WHERE qte > 5)
UNION
(SELECT article
FROM Inventaire
WHERE prixVente > 2 *cout);
Untelnoncestditcomposdunblocdeniveau1etde2blocsdeniveau2.Ilesttrait
en trois tapes : calcul de la premire sousrequte de niveau 2, calcul de la deuxime
sousrequtedeniveau2etfinalement,laralisationdelunion(niveau1)accompagne
delasuppressiondesdoublets.
Pour garder tous les tuples des deux ensembles y compris les doublets, il faut utiliser
loprateur UNION ALL. Le tri dune telle clause compose de deux sousrequtes fait
appelaurangdesattributs(puisquelesdeuxsousrequtesontlemmeschma)ouaux
attributsdelapremiresousrequte.
(SELECT article
FROM Ventes
WHERE qte > 5)
UNION ALL
(SELECT article
FROM Inventaire
WHERE prixVente > 2 *cout);
ORDER BY 1; <- usage du rang pas recommand!
Le rsultat de cette union est tri par un ORDER BY qui se rfre aux attributs de la
premire relation soit par leur rang, soit de prfrence par leur nom. En effet, certains
changements ultrieurs faits au schma auront des effets sur la requte exprime au
moyendurang.
7.24Intersection
Cetoprateurpermetdetrouverlestuplesquisontprsentsdansdeuxtablesetdontle
schma est mutuellement compatible. Par exemple, la clause cidessous fournit les
articlesvendusenquantitsuprieure5etquisonttoujoursdanslinventaire.
(SELECT article
FROM Ventes
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 99
Bien entendu, la diffrence peut aussi tre formule avec la ngation dun prdicat
dinclusion(NOTIN).
SELECT article
FROM Inventaire
WHERE article NOT IN (SELECT article FROM Ventes;
7.26Misejourdelextensiondunetable
Lextension dune relation de base est mise jour par lajout, la suppression ou la
modification dun ou de plusieurs tuples. Les oprations de mise jour peuvent tre
effectuessilutilisateuralesdroitsrequissurlesrelationsoulestablesciblesparles
modifications. Sil est propritaire de la relation, il a tous les droits. Si la relation
appartientunautreutilisateur,illuifaudraobtenirlesdroitsdaccsappropris.Ceux
cisontspcifisparlacommandeGRANT.
Tout propritaire dune table peut utiliser cette commande avec lune de ses tables et
autoriser dautres comptes faire des manipulations sur sa table, notamment celles de
misejouretdesuppressiondestuples.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 100
Lordre des valeurs doit tre celui des attributs du schma. Il est aussi possible de
fournirlalistedesattributsdanslordrecorrespondantceluidesvaleursfournies.Les
attributsabsentsduschmacorrespondentalorsdesindicateursdenullsdansletuple
cr.
LestuplesproviennentdestablesexistantesdelaBASEDEDONNES.Cetteinsertion
peuttreeffectueparunblocdePL/SQL.Siunetableestcrepourrangerlesventes
importantesdfiniescommeayantunequantitsuprieure10,ellepourratrecharge
parleformat2duDMLINSERT:
7.27Suppressiondetuplesdansunerelation
Poureffectuercetteopration,ilfautdabordrechercherleoulestuplessupprimer.Si
laconditionestspcifieavecunecl,unseultupleserasupprim;autrement,tousles
tuplesvrifiantleprdicatdeslectionserontsupprims.Lasuppressionestautorise
parlepropritairedelatableouparlutilisateurquialeprivilgeRESOURCE
DELETE FROM <relation> [WHERE <prdicat>];
Lorsdeloprationdesuppressiondestuples,lesdclencheursdesuppressiondetuples
sontactivs,lespacedisqueallourestemonopolisparcettetableetlajournalisationde
la suppression est faite la fois dans le journal et dans les segments de rollback de la
transaction.Pourvitercettelourdeurquiaccompagneunetellesuppressiondetuples,
il faut utiliser la commande TRUNCATE TABLE. Cette dernire supprime les tuples
sansquilyaitunejournalisationdanslessegmentsderollback(Voirsurlarchitecturedu
SGBD, liste LRT de la ZMP) et une autre dans le journal interne. De plus, lespace peut
treconservousupprimetlindexestmisjour.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 101
Exemples:
a)SupprimerlesventesfaitesReneouMarieClaude.
DELETE FROM Ventes
WHERE nom = 'Rene' or nom = Marie-Claude;
b)SuppressiondetouslestuplesdelatableVentes.
DELETE FROM Ventes;
La sousrequte est en premier value afin didentifier les tuples correspondant des
articlesvendusavecperteouceuxdontlecotestinconnu.Parlasuite,latableVentes
est balaye pour supprimer les tuples prsents dans le sousensemble identifi par la
sousrequte.
7.28Misejourdestuples
Lestuplessontmodifisaprsunerechercheimplicitedestuplesvrifiantleprdicatde
recherche.
UPDATE <relation> set <expression> WHERE <prdicat>;
Par exemple, pour corriger la transaction dachat faite en janvier par Valrie pour
inscrire neuf(9) articles a7 et non pas trois(3) comme cela fut enregistr dans la table
Ventesparlatransactioninitiale.Larechercheestenpremierfaiteenspcifiantlestrois
attributs de la cl de sorte quun seul tuple sera trouv, soit celui de lachat fait en
janvier.
Ensupposantquelatransactionsoitaussiinscritedansunetabledesventesdumoiset
quelle soit faite correctement par Valrie , la nouvelle valeur pour la mise jour peut
treobtenueparunesousrequtesurlatableVentes_Janvier.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 102
Lanouvellevaleurestfournieparlersultatduneslectiondansuneautrerelation.La
sousrequtedoitretournerunseultuple,sinonilyaurauneerreurdansloprationde
comparaison.
7.29Modificationdudictionnairededonnes(DD)
Lamodificationdudictionnairededonnesestuneoprationpluttrareetrserveau
DBA et aux quelques utilisateurs dots exceptionnellement des privilges soustendus
par les rles RESOURCE et CONNECT ou les privilges quivalents accords
lutilisateurparleDBA.
La commande CREATE pour la cration dune table peut tre trs complexe et inclure
notamment,lespacedetableetlesparamtresPCTFREEetPCTUSED.
typ
DEFAULTexpr contrainte
PCFREEentier
PCTUSEDentier
INITRANSentier
MAXTRANSentier
TABLESPACEparam
STORAGEparam
CLUSTERparam
Figure7.31b
Affichagedutypedesattributsdunerelation
LemoduleSQL*PlusaunecommandeDESCRIBEquiafficheladescriptiondesattributs
dunerelationoudunevuerelationnellestockedansledictionnaire.
DESCRIBE<nomrelation>
SQL>DESCRIBEParent
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 103
VoicilestypesdelatableClientfournisparlacommandeDESCRIBE:
DESCRIBE Client
LacommandeDESCRIBEdonnelalistedesattributsdelarelationetleurtyperespectif,
et cela, partir du dictionnaire de donnes. Selon la norme SQL/92 de lISO, la
commande de cration spcifie la cl primaire et les cls trangres dune relation, de
mmequelesvrificationsdudomainedesattributs.
Lacrationdunetablepeutdonctrepluscomplexeetinclureaussidescontraintesdu
domainedfiniesauniveaudelattributouauniveaudelatable.Envoiciunexemple
enSQL92.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 104
LacrationdelammetableavecleSQLDDLdOracleestspcifieparlaclauseDDL
suivante:
Les contraintes dune table peuvent tre modifies par un ALTER TABLE MODIFY ou
unecombinaisondeALTERTABLEDROPetALTERTABLEADD.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 105
Pourdsactivertemporairementunecontrainterfrentielle:
La contrainte rfrentielle est supprime et peut tre recre par la suite par la
commandeALTERTABLEADD.Aumomentdelacration,lacontraintedoittrevraie
pourtouslestuplesdelatable.Lavalidationestrtrospective.
SupprimerlatableClientetdummecoupsonschmaetsonextension:
La table est supprime ainsi que tous les index et contraintes (CHECK et les triggers)
dfinissurcelleci.
Ajoutdunnouvelattributdansunschmaderelation
Unemodificationunobjettabledudictionnairedebasededonnessefaitparlaclause
ALTERTABLE:
ALTER TABLE <relation> ADD (< col spec>);
ALTER TABLE <relation> MODIFY (< col spec>);
Exemple:
Ajouterlacolonne(attribut)taxelarelationVentes:
Lavaleurdunouvelattributestnullepourlestuplesdjprsentsdanslextensionau
momentdelajoutdunouvelattribut.Cettevaleurinitialenullepeuttremodifiepar
unemisejoursubsquente.Linsertionautomatiquedunulldanslestuplesdjdans
la table avant lajout de lattribut fait rapparatre les problmes dinterprtation des
nulls.
Modificationdutypedunattributdansunschma
ModifiezleschmadelarelationVentespourquelenomdelarticleoccupedornavant
troiscaractresaulieudedeuxinitialementprvus:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 106
diteuretformatdaffichagedulogicielSQL*Plus(Rappel)
LemoduleSQL*Plusasonpetitditeurdeligne.Ilaffichelesrsultatsselondesformats
prciss par des directives simples dont les valeurs par dfaut sont drives de la
spcification du type des attributs. Il est aussi possible de faire appel un diteur du
systmedexploitationparlacommandeEDIT.
7.30DirectivesdeSQL*Plus
1Pourinitialiserlesvariablesdenvironnementdelditeur:
SET PAUSE 'appuyer sur le ENTER'
2PourremplacerletamponSQL*Plusparunautrequidevientlecourant
SET BUFFER tampon1.sq1
Le tampon courant pour le module SQL*Plus est chang pour un autre nomm
tampon1.sql
3SETPAGESIZE40
Pourspcifierlenombredelignessurchaquecrandesortie.
4Pourgarderdansunfichier,unetracedelaffichage:
SPOOL C:\trace1.sql trace dans fichier C:\trace1.sql
SPOOL OFF --arrte la trace et retour au fichier par
dfaut
5PourspcifierleformatdaffichageparSQL*Plusetspcifierlalargeurdescolonnes
pourlesvaleursnumriquesetleschanes.
COLUMN salaire FORMAT 999.99
COLUMN nom FORMAT A25
Cettedirectivepermetderemplacerleslargeursdrivesdutypedesattributsparcelles
fourniespourladuredelasession.
6diteurdeligne:Lutilitaireaquelquesfonctionsdditionpluttlmentaires:
CHANGE .chaine.nouvelleChaine.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 107
Exemple:Remplacementdelachanefunctionparfonction
2 pourpositionnerlaligne2commelignecourantedelditeur.
- SAVE A:\fichier.sql
PoursauvegarderdansunfichierlaclauseSQLdansletampon.
GET A:\fichier.sql
PourouvrirunfichieraveclditeurlocaletyinsrerlescommandesSQL.Lasuitede
commandespeutaussitretermineparlecaractre/,auquelcas,lefichierestexcut
lorsdesafermeture.Autrement,lefichierestexcutparlasuiteparlacommande:
start C:\nom_fichier ou @ A:\nom_fichier.
7Pourappelerlditeurpardfautdusystmeetditerlefichiernom_fichieroucelui
nommdaprsletampondeSQL*Plus,ilsuffitdefaire:
EDIT [A:\fichier.sql].
Ildevientalorsfaciledemodifierlefichieretdelexcutersoitpar@ouparunSTART.
Silenomdufichierestabsentdanslappeldelditeur,lefichierouvertportelenomdu
bufferinternedeSQL*Plus.Parexemple:EnentrantEDIT,linterprteappellelditeur
pardfautdemanirevouspermettredelemodifierparlentremisedesfonctionsde
lditeur.Ensuite,ilsuffitdexcutercefichieraveclacommandesuivante:
START A:\fichier1.sql.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 108
Exercicesrsolus
1VoiciuneinstancedelabasededonneJMCdanslaquelleletypedelattributdatem
atmodifipourdevenirunedatedetypeDate.
1.1 Formuler la clause SQL pour afficher les noms des joueurs nayant perdu aucun
matchjouQc.Vousnesavezpaspriorisiunjoueurajououpasunmatch,maisil
doitenavoirjouunpourtredanslarponseescompte.
Rponse:Ilyaplusieursformulationspossiblespourobtenirunebonnerponsedans
lhypothsedetablescohrentes.
1re:LesjoueursdematchquiontjouunmatchQubecsansperdreleurmatch.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 109
2me SELECTnom
FROM Joueur J, Match M
WHERE J.nom = M.nomG and M.lieu =Qc and NOT IN
(SELECT nomP FROM Match WHERE lieu = 'Qc');
2FormulerlaclauseSQLpourlisterlenomdejoueur,lemontantdelacommanditeet
la socit qui commandite un joueur en incluant dans la rponse les socits qui ne
commanditentpasencoreunjoueur.
Rponse:LajointureexternedroiteenSQLsexprimeavecle(+)ductdelarelation
quireoitlesvaleursnullesajoutesdanslecalculdelarponse.Cettejointurepeuttre
aussiexprimeparunLEFTOUTERJOINdeSQL92:
SELECT nom, montant, C.societe
FROM Joueur J, Commanditaire C
WHERE J.societe(+) = C.societe;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 110
Rponse:
SELECT nomP, nomG
FROM Match
WHERE dateM in (SELECT MIN(dateM)FROM Match);
Lesdatessontordonnesselonlordrechronologique.Lafonctionmin()retournelaplus
petite,soitlaplusancienne.
nomP nomG
Gagnon Beaumont
Laclausesuivantefournitaussilabonnerponse:
SELECT nomP, nomG
FROM Match
WHERE dateM < ALL (SELECT dateM FROM Match);
4 Voici une requte SQL dont la rponse est calcule sur la base de donnes ALU
NORD.
Combiendelignesetdecolonnesserontprsentesdanslarponse?
Rponse:
LeGROUPBYestcalculsurlattributsexedelatabletemporairenecontenantqueles
ouvriersdelaseulevilleQubec.LesvaleurspossiblespourlattributsexesontMetF.
Donclarponsecomportera2ligneset3colonnes.
Sommaire
LesimplmentationscompltesdelanormeSQL92sontencorerares.QuelquesSGBD
debonniveauontuneimplmentationdeniveau2delanorme.Lesmanufacturiersde
SGBDsemblenttoujoursavoirlavolontdefaireunpeumoinsquelanormeetdajouter
desclausesquiparticularisentleursproduits.LeSQLestunlangagededonnesutilis
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 111
par les SGBD en sus parfois de leur langage de donnes propritaire. Il permet
dexprimer facilement les requtes jusquau niveau intermdiaire. Les requtes
complexes prsentent cependant quelques difficults lorsque lon veut les exprimer en
SQL.Lesdivisionsrelationnellessontparfoisplusdifficilesexprimer.Endpitdeleur
complexit, les requtes utilisant la division relationnelle sont plus courantes dans le
contexte de lexploitation dun entrept de donnes. Finalement, les oprations de
jointuresexternesgaucheetdroitesontdeplusenplusutilisesdanslesapplicationsde
bon niveau permettant ainsi de faire en une seule opration ce qui en demanderait
plusieurs.
Exercicesduchapitre7
Attention : toutes les fonctions et types tudis dans ce chapitre ne sont pas
ncessairement disponibles dans la version du SGBD qui vous sera rendue disponible
pourfairelesexercicescidessous.
1.Afficherlenometlenumrodesemploysdontlenomrenfermelachaneduprnom
(etdontletauxhoraireestplusgrandque13.00$.
2. Afficher, sans redondance, le numro des employs qui sont inscrits comme
travaillantlesoiroulejour.
3. Afficher, par ordre alphabtique dcroissant, le nom des employs dont le taux
horaireestcomprisentre13.00et26.25$.
4.Afficherlenumrodesemploysinscritscommenetravaillantpaslejour.
5. Le taux horaire pour un employ qui travaille plus de 40 heures par semaine est le
doubledesontauxhorairenormal.Quelestlenomdesemploysquitouchentplusde
750.00$parsemainelorsquilstravaillent10heuresentempssupplmentaire?
6.Quelssontlesnumrosdeposteoccupsparlestitulairesinscritscommetravaillantle
jouroulesoir,maispaslanuit?
7.Listerlenumrodesemploysquinontpasdequartdetravail.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 112
8. Lister le numro des employs dont la date dembauche (dbut) est inconnue ou
antrieureau24sep1994.
9.Listerlenom,lenumrodeposte,ladescriptionduposteetladatedembauchedes
employsdontletauxhoraireestsuprieur12.50$.
10.Listerlenomdesemploysdontlemtierestmcano1etdontladatedembauche
estpostrieureau31dcembre93(31DEC1989).
11.Donnerlavaleurdevritdesconditions**SQL92cidessous:
(1,2,3)isNULL (1,2,null)isnull
not(1,2,3)isnull not(null,null)isnull
(null,null)isNOTNULL (1,null,3)isNOTNULL
** Ces expressions ne sont pas ncessairement implmentes ou disponibles dans tous
lesSGBDcourants.
12. Formuler le schma dune table Fournisseur darticles et trouver deux deux, ceux
qui offrent exactement les mmes articles. Pour formuler la solution, il faut pouvoir
exprimerenSQLquedeuxensemblessontgaux(exercicenontrivial).
13***(Problmeavecunecertainedifficult)Unebasededonnesestconstituededeux
tablesCours(noCours*, inscriptions)etSalle(noSalle*,capacite).Leproblmegnrique
dallocation formul par E. F.Codd et dont la solution nest pas triviale consiste
formulerunerequteSQLavecousansvuerelationnellepermettantdallouerlessalles
descoursenrespectantlacontraintesuivante:(inscriptions)<=(capacit).
Endautresmots,lallocationdoitsefairedemanirecequechaquepersonneinscrite
aitunsigedanslasallesanslimiterouprciserlenombredesigesconserverlibres
pour les inscriptions tardives. Voici les deux extensions utiliser pour lnonc ci
dessus.
Larponseattendueestlasuivante:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 113
La premire tape pourrait tre celle de faire une opration pour trier au pralable les
tuples des deux extensions en ordre descendant selon la capacit de la salle et ensuite,
selon les inscriptions chaque cours. Une autre faon serait de crer une vue pour
calculerunejointureaveclaconditioninscriptions<=capacit.
14***Refaireleproblmeno3enfaisantlhypothsequedanschaquecoursildoity
avoir au moins une place vide pour une inscription tardive. Dans ce cas, la condition
seralasuivante:
(inscriptions)<(capacite).Estcequelessolutionsprcdentessontvalables?Comment
estilpossibledobtenirlameilleuresolutionaveclestablesfournies?
Projet ALU-NORD
Une base de donnes relationnelle compose des tables qui correspondent au MCD ci
dessous doit tre implante et charge avec un tat initial correspondant celui des
extensionsfournies.
Modleconceptuel
La socit ALUNORD fabrique plusieurs pices moules en aluminium dans
diffrentesusinesspcialisesrpartiesdanslemonde.
Lesusinesimplantesobligatoirementdansdiffrentesvillesproduisentdiversespices
sur commande; ces dernires sont le plus souvent stockes sur place et livres
entirement la fin de la production. Le matriau en vrac est livr en volume
prdtermin par le fournisseur sur commande de chaque usine. Les fonctions de
gestion des ressources humaines se limitent grer un dossier sur chaque ouvrier.
Limplantation de cette base doit se faire en ne validant que les contraintes de
participation et de cardinalit et cela sans dvelopper de triggers. Pour y arriver, vous
disposez du mcanisme de contrainte rfrentielle et des actions rfrentielles
disponiblesdansleSGBDutilispourraliserceprojet.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 114
Ouvrier
Metier nas*
noMetier* (1,n) (1,1) nom
Titularise
classeMetier prenom
taux (0,1) sexe
Travaille
dNaiss
b h
Usine
(0,n) VracMat
noUsine*
noMat*
ville
(0,n) Commande (0,m) noFourn*
capacStock
Vol volL
surfaceUsine (0,n) cat
Production
noPiece*
(1,1)
Client Realise lot*
noClient* qte
ville dateDebut
credit (1,n) (0,1) delai
Achete
Voici,titredinformationseulement,quelquesrglespluscomplexessoustenduespar
le MCD et qui ne seront pas au dpart valides dans la base de donnes, car cela
exigerait lutilisation de triggers et de packages qui seront tudis brivement dans un
chapitreultrieur.
LasuppressiondunmtierentranecelledesaparticipationlassociationTitulariseet
dummecoup,lasuppressiondesouvrierscomptentsdanscemtier.Ilestpossiblede
supprimer une entit dans VracMat si et seulement si sa participation lassociation
Utiliseestaussisupprime.
La suppression dune usine entrane aussi celle de ses productions, mais pas de ses
ouvriers,nidesmatriauxenvracquelleutilise.
Unmtiernestinscritdanslabasequesiunouvrierestqualifipourlepratiquerdans
son travail. Un client nest reprsent que sil a effectu au moins lachat dune
production complte par une usine. Globalement, il ne peut pas y avoir plus de 10
mtiers diffrents danstout le rseau des usines. De mme, le mmematriau ne peut
pastrefourniparplusdequatrefournisseurs.Cescontraintesserontformulesdans
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 115
Modlerelationnel
LeMCDcidessusesttransposenmodlelogiquerelationnel(MRD)enappliquantles
rgles de transposition appropries. Certaines des contraintes seront implmentespar
les cls rfrentielles, tandis que dautres le seront par des contraintes dattribut et
finalementcertainespardestriggers.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 116
Domainesdequelquesattributs
Certains attributs ont un domaine smantique particulier dfini dans le tableau ci
dessous. Par dfinition, lindicateur null est hors domaine. Toutefois, elle peut tre
utilise pour valuer certains attributs. Le domaine des autres attributs est considr
commetantimpliciteetdrivdesextensionsdestablescidessous.Lesattributsdont
ledomainenestpasimposaurontundomainesyntaxiquequireposesurletypeetque
vouspouvezdfinirenvousrfrantauxcontenusdestables.
N.B. Un crochet ouvert par la gauche ou par la droite indique une borne exclue du
domaine.Uncrochetfermparlagaucheouparladroiteindiquelinclusiondelaborne
dans le domaine. La valeur nulle nest pas une valeur du domaine, mais correspond
quand mme une ralit pour quelques attributs, notamment les attributs dlai et
noUsine. Les attributs dont le domaine nest pas dfini explicitement doivent tre
spcifisselonlesdonnesfourniesparlestables.
Remarques
1 De par la contrainte sur la capacit de stockage, toute production infrieure 11
units doit quitter lusine immdiatement et donc tre livre au client. Cette petite
production exceptionnelle nest donc pas inscrite dans la base de donnes, ce qui
expliqueladfinitiondudomainesmantiquepourcetattribut.
2Lasmantiquedeplusieursattributspeuttredriveducontextedelarelation.
3 Les signes orthographiques ne sont pas autoriss pour le nom dattribut, sauf si le
systme utilis implmente le Unicode. Seulement les dernires versions des SGBD
assurent la reprsentation des caractres sur 16 bits ou plus. Les donnes peuvent tre
cependantstockesaveclessignesorthographiques.
4Laconnaissancedesdonnesaaussipermisdeformulerquelquesrglesdevalidation
syntaxiques qui viennent en restreindre le domaine et qui seront renforces dans le
schma de la base ALUNORD. Ces rgles ne sont pas compltes, mais il vous est
demanddimplmenterquecellescietcelapournepassurchargerladescriptiondela
basededonnes.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 117
Attribut Validationsyntaxique
nas chanede9caractresreprsentantdeschiffresseulement
noFourn 1relettreestunf
noMetier 1relettreestlecaractrejetsalongueurmax.est3
noUsine 1relettre est le caractre u,les autrestant des chiffres. La
longueurmax.est3
noClient 1relettreestlecaractrec
noMat Chanedontla1relettreestlecaractrem
nom Chanedelettresenmajuscules.
prenom 1re lettre est un haut de case. Les autres lettres sont des
caractresventuellementmixtes.
noPiece 1relettreestunpetladernireuncaractrechiffre.
lot 1relettreestunb.
5LesclausesSQLtudiesdansleschapitresprcdentssontextraitessoitdelanorme
SQL89,soitdecelleduSQL92.LeSGBDutilispourraliservotreminiprojetnapas
ncessairement implment le niveau 3, voire mme le 2 de la norme SQL92. Par
consquent,certainescommandesouoptionsduDDLpeuventnepastredisponibles
pour la ralisation du projet (par exemple : ON DELETE SET NULL est absent dans
Oracle).
Instancedelabasededonneslacration
N.B. Au moment de lexploitation, ltat de la base de donnes peut tre diffrent de
linstancecidessousquidoitcependanttreincluse.Lavaleurnulleestreprsentepar
leNULLoupardesespaces.Linstancedelabasededonnesdoitvrifierlescontraintes
dintgritdfinies.Labsencedunevaleurnullepourunattributdunetablesignifieque
cetattributdoitavoirobligatoirementunevaleurdanslextension.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 118
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 119
Chargementinitialdelabasededonnes
Le schma des relations (tables) doit tre cr de sorte quune table (parent) soit dj
cre avant quelle soit rfrence par une autre table (type enfant). Lors de la
suppressiondestables,lordreinversesimpose!
Le chargement de la base de donnes peut tre fait par lexcution dun script de
lannexeBetlancdeprfrenceaveclacommandeSTART A:\ALU_data.txt(pour
un volume plus important de donnes, il y a le chargeur SQL*LOADER dont les
fonctions sont dcrites en annexe). Le script de chargement est aussi disponible au
moyendulienhypertextedisponiblesurlesiteWeb.
Exploitationdelabasededonnes
Lorsquelnoncdelaquestionfaitrfrenceseulementaunomdelatable,cesontles
valeurs de tous les attributs qui sont demandes, sauf si les attributs sont demands
explicitement. Exemple, lister lusine de Qubec signifie afficher la valeur de chaque
attributdelusinedeQubec.
LorsquelarponseconsisteformulerunecommandeSQL,placezcettederniredans
unfichiersurdisquetteA;ousurledisquedevotrestationouordinateurdetravail.Son
excution peut ensuite tre lance partir du fichier : @A:\fb3.sql ou START
A:\fb3.sql. Le nom du fichier est form par la lettre et le numro de la question,
exemple:b3.N.B.SiexceptionnellementlimplmentationSQLdusystmequivousest
demanddutilisernepermetpasderpondreunequestion,formulezlarequtesur
papierenSQL92.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 120
Contenudurapportduminiprojet
Dans le rapport, il faut identifier chaque question, reprendre le texte de la question
demande et fournir la clause SQL permettant de calculer la rponse. Une trace de
lexcutioncorrectepermetdevrifierlajustessedelarponseobtenue.Pourquelques
questions, notamment les oprations de mise jour et de suppression, certains autres
lments doivent tre prsents afin de dmontrer que lopration demande a t
excuteavecsuccs.Parexemple,silondemandedajouterdestuplesdansunetable,il
faudradoncafficherlatableavantetaprspourdmontrerquelesajoutsdemandsont
tralisscorrectement.Leschmadelabasededonnesseravrifietreconnucorrect
silpasseavecsuccsletestappeltest_alu.rtf.Bienquecetestnesoitpascomplet,ilsera
prsum suffisant pour valider votre schma. Il faudra donc dans votre rapport
prsenterunetraceimprimequiillustrequeletestatpassavecsuccs.
Deplus,vouspouvezvrifierlavaliditdevotreschmaenexcutantleTestAlu que
voustrouverezsurlesitewebouventuellementsurledisqueCDdaccompagnement.
BCrationdetuplesavecunfichierdecommandes
1Reprsenterdanslabasededonneschaquemembredelquipe(lorsqueleprojetest
ralisenquipe)commeunouvrierquitravailledansuneusineexistante(enexcluant
lusine u50) de votre choix et qui titularise un mtier dj exerc par un ouvrier.
Commevaleurdunas,utiliservotrenumrodedossiertudiantauquelvousajoutezun
0devant,maisavecunnomfictif.Ensuite,inscrireladatedujourcommetantcellede
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 121
votreembauchedansuneusinedugroupeALUNORD.Touslesattributsdoiventavoir
unevaleur,validedansledomaineassoci.Lorsqueletravailestfaitenquipe,avecun
seul ordre DML les membres de lquipe sont ajouts dans la base, sauf un. Lorsquil
sagit dune modification ou dun ajout dun tuple, afficher la table avant et aprs les
oprations.
2Ajouter2nouvellesusinesquinontpasencoreutilisdematriauenvrac.
3 Pour un membre de lquipe, formuler un ordre SQL pour modifier la date de
lembaucheenlaugmentantde15jours.
4 Pour la mme personne de lquipe dont la date dembauche a t modifie
prcdemment, changer lusine o elle travaille pour quelle soit u50. Commenter le
rsultatdelopration.
5Supprimeruneusinequevousavezajouteprcdemment.
CSlectionsimple
1 Rechercher et afficher le tuple que vous avez ajout dans la base de donnes (le
membredevotrequipeencorereprsent).
2 Lister toute linformation concernant seulement les deux premiers mtiers prsents
danslatableMetier.Leslibellsdelatabledoiventtreaffichsintgralement.Utiliserle
pseudoattributROWNUMprsentimplicitementdanstouteslestablespourneretenir
quelestuplesdontlerangdanslatablerponseestinfrieurROWNUM.
3Listerlesdiffrentsmtierstitularissparlesouvriersenbonifiantleurtauxhoraire
de15%.
4Enprsumantquelgedelaretraitelgalesoit65ans,listerlenom,lenasetladate
exacte prvue pour la retraite des ouvriers masculins inscrits dans la base de donnes.
La retraite commence au 65e anniversaire dun ouvrier. Utiliser la fonction
ADD_MONTHS()pourlecalculdelgedelaretraite.
5Listerlenom,leprnometlenasdesouvriersdontleprnomestinclusdanslenom.
6ListerlenumrodesusinessituesMontralouBostonquiontunesuperficiede
plusde1500mtrescarrs.
7 Lister la ville et le numro des usines dont 40% de la capacit de stockage est
suprieure1100pices.
8 Lister le nom et le prnom des ouvriers encore sans affectation de travail dans une
usine.
9 Simuler ce quaurait t la date de fin des productions en augmentant le dlai de
livraisonde10%arrondilentiersuprieur.Larponseestfournieaveclesnopice,le
lotetladatedefindeproductionaveclintitulFindeproduction+10%.N.B.:ilya
une diffrence entre une chane encadre par des , qui correspond une constante
littraleetuneautreencadrepardes,quicorrespondunaliasouunintitulde
colonne dans lequel il peut y avoir des espaces. Noter aussi le rsultat obtenu avec
ladditiondunevaleurnulle,i.e.lorsqueledlainestpasspcifi.
10Listerlesnas,nometprnomdesouvriersembauchsentrele1janvier1995etle31
dcembre1998.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 122
DSlectionaveclesfonctionsSQL
1Listerlesouvriersquionttembauchsen1995.
2Combienyatildeproductionsdontleclientestinconnu?
3Listerlaplusgrandesurfacedentreposagedisponiblepeuimportelusine.
4 Quel est lge moyen des ouvriers embauchs au cours des 6 premiers mois, peu
importelanne?
5Quelestletauxhorairemoyenpaypourtouslesmtiersconfondus?
6 Lister le nom, lge et le numro dusine o travaillent les ouvriers ns aprs le 1
janvier1950.Lorsquunouvriernapasdaffectation,lelibellSANSUSINEestaffich
telquel.UtiliserlafonctionNVL().
7Afficherlenombretotaldouvriresinscritesprsentementdanslabasededonnes.
8Quelestleplusgrandvolumedematriauenvracutilisparuneusine?
9 Quel est le dlai le plus court impos aux productions ralises par lensemble des
usinesu12etu18?
10ListerlenometleprnomdechaqueouvrierenleprcdentdulibellM.ouMme
selonlecas.Lenomestaffichenmajusculessuividelapremirelettreduprnom.
11 Modifier votre nom douvrier (ventuellement pour chaque membre de lquipe)
danslabasededonnespourquilapparaisseenlettresminusculessaufpourla1elettre
quiresteunemajuscule.Souvenezvousquevoustesencoreinscrit(s)danslabasede
donnes!
12Quelleestlaquantittotaledepicesproduitesjusquiciparlensembledesusines?
13Quelleestladatedelivraisondespicesdontlaproductionadbutennovembre,
peuimportelanne?
14Quelestlenombredevoyellesdanslenomdesouvriersoccupantunmtieretdont
le nom commence par une des lettres suivantes : {B, D, S}. Afficher le nom et le
nombredevoyellesquilcontient.
15Combiendouvrierssontdeshommes(peuimportelusine)dontlesquatrepremiers
chiffres du nas forment un nombre suprieur 0971? Afficher uniquement le nombre
douvriersobtenu.
16Quelestlgedesouvriersaumomentdeleurembauche?
17Quelleestlaquantittotaledesproductionsdontledlaiestinfrieur10jours?
18Quelestletauxhorairemoyenpaypourlesmtiersdeclasse3?
19Quelestlenombredouvriersmasculinstravaillantdanslusineu12?
20Listerlesnumrosdesusinesquistockentplusde3picesaumtrecarr?
EJointures(interneetexterne),unionetdiffrence
1Listerlenom,lenasdesouvriersetlavilledesusinesoilstravaillentprsentement.
2ListerlenumrodespicesetlesquantitsproduitesparlesusinesdeMontral.
3Listerlenoetlaclassedesmtierstitularissparunhommenenmaipeuimporte
lanne.
4Listerlenodusine,lenodematriauetlacatgorieduVracMatutilisparlesusines.
InclureaussilenumrodesusinesnutilisantpasprsentementunVracMat.
5Listerlenumrodeslotsdepicesetlavilleoilssontraliss.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 123
FFonctionsdegroupement,union,diffrenceettri
1 Donner, pour chaque matriau, le nombre de fournisseurs qui approvisionnent les
usines. Afficher le numro du matriau et le nombre de fournisseurs avec le libell
Nb_fournisseurs.
2 Lister le numro de pice, le lot, la date du dbut et le numro de lusine pour les
productions.Lalisteestprsenteparordrecroissantdesnumrosdelot.
3Compterlenombredusinespourchaquemtier.Afficherlenumrodumtieretle
nombredusinesaveclelibellNombre_usines.
4Afficherlesnumrosdemtiersetleurtauxhoraire,pourlesmtiersexercsparau
moinsdeuxouvriers.
5Listerenordredescendant,lenumrodesusinesquinontpasencoredouvriers.
6 Lister pour chaque no de matriau, le volume total de vrac livr aux usines, peu
importelefournisseur.
7Listerlenumrodematriauquipeuttrelivrparplusdedeuxfournisseurs.
8 Lister par mois danniversaire le nas et le nom des ouvriers de mtier qui ne
travaillentpasencoredansuneusine.
9Listerenordrecroissantdenom,lenasetlenomdesouvriersquitravaillentdansdes
usinesquiontcommandleurmatriauenvrac.
10 Lister le numro et la ville des clients ainsi que le numro de leur lot pour les
productionstermines.
GDivisionrelationnelle
1 Quels sont les numros des usines qui ont des ouvriers de tous les mtiers dont le
tauxhoraireestsuprieur28.00$?
2QuellessontlesusinesdeBostonoudeMontralquiontachettouslesmatriauxde
catgorieDenvrac?
3 Estce quil y a un matriau command par toutes les usines prsentement en
opration et dont la capacit de stockage est gale ou suprieure 3000 pices ? Une
usineestenoprationlorsquelleacommandunVracMatpourassurersaproduction.
Cestbienunedivision,malgrdesapparencesquipeuventtretrompeuses!
4 Quels sont les clients (noClient seulement) qui nont pas achet toutes les pices
produites,peuimportelusine?
HRequteimbrique
1 Afficher le numro, la ville et la surface des usines ayant la plus grande surface
dentreposage? N.B. Dans linterprtation du modle, chaque usine consacre
obligatoirement10%desasurfacelentreposage.
2Quelestlenometlenasdesouvriersnslammeanne(peuimportelemoisetle
jour)quecelleduplusjeunedesouvriers?
3 Lister le numro des pices produites en quantit suprieure la moyenne des
productionsinscritesjusquici,peuimportelelot.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre7LangageSQL 124
4Listerlenumroetlasurfacedentreposagedesusinesdontlacapacitdestockageest
plus grande que 2 fois la capacit de stockage de lusine ayant la plus petite surface
dentreposage.
5Listerlesnumrosdesclientsdontlecrditestsuprieurlamoyenneducrditdes
clientsinscritsdanslabase.
IVuerelationnelle
1 Crer une vue nomme v1 pour obtenir le nombre total douvriers qui travaillent
chaqueusine.N.B.Ilesttoujourspossiblededfinirunlibellparticulierpourdsigner
lersultatdunefonction,etcelibellpeuttreutilisparlasuitecommeunaliasdela
colonne.Danslavuedemande,lenombretotaldesouvriersestlibellnbTotalOuvriers.
2 Crer une autre vue v2 qui permet dobtenir le nombre total douvriers qui ne sont
pas au travail, peu importe le mtier. Notez quil est possible dutiliser un libell pour
reprsenterlersultatdunefonction.Celibellpeuttreparlasuiteutiliscommeun
aliasouattributdelatableintermdiaire.
3 En utilisant les vues prcdentes, formuler une clause SQL pour obtenir le nombre
totaldassignationsdetravailencorepossiblespourlesouvriers.
4 Crer une vue relationnelle fournissant le numro de matriau la quantit totale de
chaquematriaulivrsuiteunecommandeetcela,peuimportelefournisseur.
JTrigger(dclencheur)
Pour rpondre ces deux questions, il faudra avoir terminer le chapitre suivant qui
dcritlelangagedestriggers.
1 Implmenter la contrainte qui limite 10 le nombre total de mtiers diffrents dans
tout le rseau. Tester la contrainte en augmentant le nombre de mtiers de faon
dpassercettelimite.
2 Implmenter une contrainte qui limiterait quatre le nombre de fournisseurs du
mmematriau.TestercettecontrainteavecuntriggerdnoncBEFOREINSERT.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 125
Chapitre8
Indexation,vuerelationnelle,droitsdaccsetbasededonnesractive
8.1Indexation
Il y a plusieurs types dindex allant du simple squentiel, index avec un ou plusieurs
niveaux,aupluscomplexereprsentparlafamilledesindexorganissaveclastructure
dunarbre.Danstouslescas,lindexutilisparlemoteurdelaBDestenquelquesorte
un mcanisme daccs rapide aux donnes, qui vient bonifier laccs squentiel
(balayage) de base toujours disponible par dfaut. Sous cet angle daccs rapide, la
famille des index inclut aussi celui par Hashing qui implmente un accs rapide aux
tuplesparlentremisedunefonctiondecalculdadresse.
LesindexlesplusutilissparlesSGBDsontceuxdelafamilledesBarbres,notamment
leB*arbre.RappelonsquunBarbreorganiselesvaleurssouslaformedunarbrenaire
defaonpermettreparexempleunerecherchedansunlotde2millionsdetuplesen
moins de 5 lectures sur disque. Le B*arbre se distingue par le fait que les nuds
internesnepointentquesurdautresnudsinternes,saufpourlesfeuillesquipointent
surlesdonnesregroupesdanslesfeuilles.Deplus,lagestionetlquilibragedelarbre
sontfaitspourmaintenirunehauteurmoyennequasifixeetunremplissagemoyendes
cellulesappelfacteurdoccupation(fillfactor)quipeutvarierde0.25(Oracle8)0.66.
8.2B*arbre
Comme nous lavons vu dans un chapitre prcdent, le B*arbre est une hirarchie de
cellules dordre p, ce qui signifie quil y a p pointeurs et p1 valeurs dans les nuds
internes.Parexemple,lindexationdumatriculeemploy,dontledomainevariede1
100,prsentelastructuresuivanteunmomentparticulierdelexploitationdelaBD.
20
17 25
B*arbredordre3(pointeursetauplus2valeursdecl)
Figure8.1
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 126
Chaque cellule interne est un nud et les cellules du dernier niveau sont des feuilles.
Chaque feuille a une mme structure qui peut varier selon le type darbre. Voici une
structuretypiquedelacelluleinterne(nud)
Pointeur sur le sousarbre
vivi+1 droit dont les cls sont
suprieuresvi+1.
Pointeur sur le sousarbre Pointeur sur le sousarbre droit
gauche dont les cls sont dontlesclssontsuprieuresvi
infrieures(etgales)vi. ougalesvi+1
Structuredunnud
Figure8.1a
Le pointeur la gauche dune valeur conduit un sousarbre dont les valeurs sont
infrieuresougaleslavaleurvi,tandisquelepointeurdedroiteconduitunsous
arbre dont les valeurs sont suprieures vi. La smantique des pointeurs est la mme
pour tous les nuds internes. La structure dune feuille est toutefois lgrement
diffrentepuisquelepointeurfournitladressedutuplesouslaformederid(rowidou
adressedetuple).
CaractristiquesdunB*arbre
LintrtduB*arbreoudelunedesesvariantescommeleB+arbre,rsidedanslefait
quilnestjamaislargementdsquilibretquesahauteurestquasiconstantequelque
soit le chemin parcouru pour aboutir une feuille. A tout moment, cette structure
arborescente(similaireauxarbresAVL)prsentelespropritssuivantes:
1Chaquevaleurindexeprsentedanslesnuds(internes)estaussiprsentedansles
feuilles.Lesvaleursdechaqueblocdindexsontenordrelexicographique.
2 Seulement quelques valeurs de cl sont utilises par les nuds internes de larbre.
Cestunindexnondensesurlesblocsstockantlestuplesdunemmetable.
3Chaquevaleurindexeetprsentedansunnudinterneapparataussicommetant
lavaleurla plusdroitedanslesousarbrepointparlepointeurgauchedelavaleur
indexe.
4Alajoutdunenouvellevaleur,silafeuille(celluleterminale)devientsature(i.e.le
facteurdesaturationestatteint),elleestdiviseendeuxfeuillesdemmeniveauetla
valeurcentraledelafeuilledoriginedevenuesature(celleavantdivision)estdplace
verslenuddeniveausuprieur.Si,cefaisant,cenuddevientsatur,ladivisiondes
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 127
Ajoutde20:lacellulecontientalorsunpointeursurletupleidentifiparlavaleur20.
20
null
tuple
Ajoutde40:idem
2040
tuple tuple
Ajoutde25:cetajoutdanslacelluleprovoquelasaturationetdoncladivisionendeux
feuilles,suiviedelacrationdunnud.
25
2025 40
Lavaleurlaplusdroitedanslesousarbregaucheestcellequiapparatdanslenud
quipointesurcesousarbre(liengauche).
Ajout de 15 : ajout de la valeur dans une feuille avec division de la feuille et insertion
dunevaleurdansunnudinterneparent.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 128
2025
1520 25 40
Blocsdetuples
tuple tuple tuple
Ajoutdelacl17:
20
null
17 25
1517 20 25 40
tuple
tuple tuple tuple tuple
Lajoutde17dansunefeuilleaprovoqusadivisionetlacrationdunenouvellefeuille,
mais aussi la rplication de la valeur centrale vers un nud. Ce dernier est devenu
satur(>2)etsestdivisprovoquantlacrationdunautrenuddemmeniveauetdu
dplacement dune copie de la valeur centrale vers ce nouveau nud suprieur. Le
processus se rpte jusqu ce que linsertion de la valeur dans un nud ne provoque
plusdedivision.
Ajoutde14:
20
1517 25
1415 20 25 40
17
tuple
Ajoutdansunefeuilledunindexdordre3
Figure8.2
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 129
Lajout sature une feuille. Il y a donc cration dune nouvelle feuille pour y ranger la
valeur 17. La valeur centrale 15 estrplique dans le nud suprieur quelle ne sature
pas. Le rle de la valeur qui est dplace dans une cellule de niveau suprieur est de
servir de sparateur entre les deux sousarbresinfrieurs : le gauche et le droit. Si le
systme avait plac une autre valeur comme sparateur, disons le16 qui nest pasune
valeurindexe,lamcaniquedelindexationauraittoutaussibienfonctionn,laseule
conditionquecettevaleuraitunbitpourindiquerquecestunsparateurtrangeraux
valeurs. Dans un arbre indexant des chanes de caractres, il devient alors possible
dconomiserdelespaceenutilisantdessparateursformsdechanesbeaucoupplus
courtes, ce qui permet daugmenter sensiblement le nombre dentres dans une page
dindex.
La croissance dun B*arbre est symtrique parce que le rquilibrage est effectu
gnralement aprs chaque lot dinsertions (cette opration est dpendante de
limplmentation). A ltat stable, la longueur du chemin qui spare la racine de toute
feuilleestapproximativementlamme.Parexemple,avecdesclsde100octetsetdes
pointeurs de 4 octets, un arbre dordre 50 avec une cellule de la taille dune page peut
avoiraucinquimeniveau,plusde2,500,000nuds,chacuncontenantprsde50cls.
Endautresmots,larechercheduneclparmiles3millionsdetuplesncessiteradansle
piredescas6accsaudisque.
FacteursdecroissancedunB*arbre
La hauteur dun B*arbre dpend de plusieurs facteurs dont principalement le nombre
de tuples dans la table indexe. Avec un nombre important de tuples, la hauteur de
larbre augmente bin sr, mais trs lentement. Il est courant davoir maintenant des
tables contenant des milliards de tuples et dobtenir des hauteurs denviron 7 (sept)
niveaux. Un autre facteur important est celui de la longueur de la cl ou de la valeur
indexe.Parexemple,plusunechanedecaractresindexeestgrande,moinsilyaura
dentresdansunemmecelluleoupage(ordrepluspetitdelarbre)et,partant,plusla
hauteurdelarbreseragrandepourindexerlemmenombredetuples.Lahauteurde
larbre peut cependant tre raccourcie par lutilisation de sparateurs de sousarbres
formsentronquantlachanedelapremirecldusousarbredroit.
(90entresparpage)
(1000entresparpage)
pagej pagej
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 130
Finalement,lorsquelattributindexesttrsslectif,commecestlecaspourunecl,la
hauteurdelarbresera plusgrandequedanslecasdunattributmoinsslectifcomme
lattribut ville. En gnrale, lordre de la cellule est choisi pour y ranger un grand
nombredevaleurs(exemple:cellule=page)desortequelessuppressionsetlesajoutsne
gnrentpaschaqueoprationunrajustementduB*arbre.Ceciviteuntravailqui
peut exiger une ou plusieurs lectures de nouvelles pages sur le disque et affecter la
performanceduSGBD.
SuppressiondansunB*arbre
Lasuppressiondunevaleurdansunefeuilleserpercuteaussiauniveaudesnudso
lonobservenonplusunesaturation,maisunesoussaturation.Achaquesuppression,la
valeurestphysiquementsupprimedanslafeuilleetsicettevaleurapparataussidans
unnud,elledoittreaussienleveetremplaceparlaclquisetrouvedanslafeuille
lagauchedelavaleursupprime.
Loccurrencedunefeuillesoussaturesuiteunesuppressiondunevaleurdclenche,
sil y a lieu, la fusion avec une feuille adjacente (gauche ou droite) qui est aussi sous
sature, suivie dune rpartition des valeurs, de telle sorte que les deux feuilles soient
remplies moins de la moiti de la valeur de saturation. Sinon, il y a fusion des deux
feuilles pour obtenir une seule qui nest pas sature. Cette cration ou disparition des
feuilles a aussi une rpercussion au niveau des nuds. Aprs plusieurs suppressions,
larbrepeutalorsdcrotreenhauteur.
Indexavecdesvaleursdupliques
Les valeurs dupliques peuvent tre aussi indexes par le B*arbre. Le seul ajout est le
chanage des feuilles dont la valeur est identique, mais avec des adresses de tuple
diffrentes.Auniveaudesnuds,uneseulevaleurestutilisepourlindexation.
20
1517 25
1415 20 25 40
tuple lesvaleursidentiques.
Indexavecvaleursdupliques
Figure8.3
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 131
LarecherchedestuplesvrifiantlecritreduneplagedevaleursestpossibleavecleB*
arbre par lentremise des pointeurs latraux qui enchanent les cellules dun mme
niveau. La cellule de dbordement qui nest pas pointe par un nud interne est dite
dconnecte par rapport aux nuds (ex. Systme SGBD SYSBASE) de larbre. De plus,
lesentresdelindexpeuventtresimplesoucomplexes.Danscederniercas,lentreest
traitecommeunecompositionordonne(juxtaposition)desvaleursdattributsquifont
lobjetdelindexationdelatable.Parlasuite,larechercheavecuneclconcatnesera
trssensibleaurespectdelorthographedelachane.Dunautrectlarechercheavec
unevaleurpartielle(prfixe)nestpastrsefficace.Elleestcependanthorsdequestion
avec un suffixe, car la fouille du B*arbre avec une cl partielle tronque du dbut est
impossible.
Recherchedansunetableavecunattributprimaire
La recherche dans une seule table lance par une clause de slection est rapidement
effectuesileprdicatestconjonctifetsilesattributsduprdicatsontindexs.
Exemple:
Employe(nas*,nom,age,salaire,ville)
Select*
FromEmploye
Whereage=24;
Lindexation de lge dans la table Employe permet dobtenir rapidement les rid des
tuples des employs de 24 ans. Ensuite il suffit de lire ces tuples en utilisant bon
escientlesridobtenus.
Silaclausedeslectionestunedisjonctive,lecalculdelarponsenebnificiepasautant
delindexationdunseuldesattributs.Puisqueledeuximeattributexigeralebalayage
squentieldelatable,autantalorsnepasutiliserlindexereteffectuerlavrificationdu
prdicat disjonctif chaque accs un tuple de la table. En revanche, si les tous les
attributsdelaclausedeslectionsontindexs,alorslesindexserontpleinementutiliss
pourobtenirlesadressesdestuplesdelarponse(rid).Dansladerniretape,chaque
rid de cet ensemble dadresses de tuple permet dobtenir directement le tuple
correspondantetdeffectuerenlignelaprojectiondesortie.
Exemple:
Lesattributssalaireetvillesontindexs.
Select*
FromEmploye
WhereSalaire=25000.00Andville=Qubec;
Lindexsursalairefournitlesriddesemploysayantlesalairede25000.00.Cesadresses
sontregroupesdansunensembletemporaireT1.Ensuitelindexsurlavillepermetde
former lensemble T2 avec les rid des employs de Qubec. Lintersection de T1 et T2
fournitlesriddestuplesquiconstituentlarponse.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 132
Ce type de calcul est efficace avec les attributs indexs slectifs cestdire dont le
facteur de slectivit est prs de 1. Par contre, si le facteur de slectivit est infrieur
0.6, lensemble des rid constitu au moyen de lindex contiendra beaucoup trop de rid
que le SGBD devra grer ventuellement sur disque entranant par le fait mme une
augmentationdeslecturesetcritures.Dansuntelcas,leSGBDpourraitprfrerfaire
unbalayagesquentieldelatable.
Rechercheavecunprdicatdintervalle
Une telle recherche peut tre aussi effectue avec le B*arbre. Lintervalle est formul
avecleprdicatsuivant:
Select*
FromEmploye
WhereSalaire=25000.00Andsalaire<=50000.00;
Enpremier,ilyaunerecherchedanslindexaveclaborneinfrieuredelintervalle.Au
termedecetteoprationlesriddestuplesindexsavec25000.00sontregroupsdansun
ensembleT1.Ensuitelesentresdecenuddindexsontparcouruessquentiellement
etensuivantlepointeurhorizontaljusqulatteintedupremiersalaireplusgrandque
labornesuprieure.DurantcetteoprationlesridsontajoutsT1.Ilnerestequlire
lestuplesaumoyendecesadresses.Cestcetteoprationquialourditsouventlecalcul.
Eneffet,lesridpeuventlalimitedemanderautantdelecturesdeblocslorsquetousles
tuplessontdisperssavecleratiodeunparbloc.
8.3FonctiondeHashing
Cette fonction H() permet de stocker et de retrouver une ou plusieurs valeurs par
lentremise dune adresse qui est drive de la valeur mme. Par exemple, si le nom
dune socit est lobjet dune indexation par la fonction H, la recherche de la socit
ViticoledeGers dbutera par un accs un tuple dont ladresse est calcule par la
fonction H(ViticoledeGers). La valeur obtenue est utilise comme rid de sorte quen
allant cette adresse on trouvera le tuple ou le dbut dune chane de tuples, parmi
lesquelssetrouveraceluirecherch.
LafonctionHnegnrepasunordreinternelimagedelordredesvaleursexternes,
de sorte quil ny a plus de relation dordre parmi les valeurs calcules et celle des
adresses de Haching. Ainsi, le stockage des noms de personnes ordonns en ordre
lexicographique sera effectu des adresses qui ne respectent pas la mme relation
dordre.Finalement,lafonctiondeHashing(H)permetlagestiondensedesvaleursetla
gestion des collisions par le chanage dans une zone de dbordement. Ainsi, si les
matriculesstockersontlargementdiscontinus,lafonctionHpeutlestransformerpour
les stocker avec un plus petit nombre dadresses contigus, facilitant ainsi le parcours
squentielsurunpluspetitnombredepages.Toutefois,ilyauradescollisionsetcelles
cidevronttregresparlelogiciel.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 133
Enmoderecherche,lafonctiondeHashing(H)estthoriquementtrsrapide.Elleexige
davoiruneorthographeexacteducritrederecherche.Ainsi,unevaleurenminuscules
donnera un mauvais accs si la valeur utilise initialement avec la fonction H tait
composedunmlangedelettresminusculesetmajuscules.Ilenestdemmepourles
recherches approximatives, comme cest le cas avec des valeurs partielles ou voisines.
Par exemple, les recherches des articles fabriqus respectivement par Deschnes ou
Deschainesnedonnerontpaslesmmesrsultats,malgrlefaitquelenomdsignela
mme personne, sauf si la fonction Soundex est utilise lors dune recherche dite
approximative.
8.4Densitdelindexetleplacementregroupdestuples
Unindexdontlespointeursdesfeuillesconduisentdirectementuntupleestditdense,
tandisquesilspointentsurunepagedetuples(lot),ilestqualifidenondense.
rfrenceunepage(nondense)
pagej
rfrenceuntuple(dense) pagej+1
Figure8.4Densitdunindexpouraccderauxtuples
Unindexnondensepointesurlapagequicontientuntupledontlavaleurdattributa
t trouve dans lindex. Lavantage dun tel index consiste en une utilisation plus
optimale de lespace des pages dindex lorsque lattribut index a un facteur de
slectivit faible. En effet, les tuples partageant la mme valeur sont rangs
(ventuellement)danslammepageetuneseuleentreestncessairedanslindexavec
fournissantunseulrid pourfairerfrencecettepage.Parcontre,certainesrequtes
de comptage exigent un accs physique aux tuples pour obtenir une rponse. Ainsi, la
requte pour calculer le total des salaires pays aux employs gs de plus de 25 ans
exigenormalementunaccsauxpagesdedonnes.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 134
Avec un index dense certaines requtes peuvent tre calcules sans avoir accs aux
tuples. Par exemple, le comptage des ouvriers qui ont 25 ans est fait sans accder aux
pages, puisque chaque rid de lindex sur ge identifie indirectement un ouvrier qui
satisfaitlecritrederecherche.Lecomptagepeutdoncsefaireauniveaudelindexsans
accsauxpagesdedonnes.
Indexregroup
Un index regroupant (clustering index) est un index dans lequel deux entres voisines
pointentsurdestuplesquisontaussivoisinsdanslespacedestockagedestuplesdela
BD,cestdiredanslammepagededonnesoudansdespagesvoisines.
Indexsurge 35
47
35 47
Indexavecregroupementdestuplesdanslapage
Figure8.5
Cetypedindexestcrlorsdelindexationdunestructuredetableappeleclusterdans
laquelle cohabitent des tuples de plusieurs tables qui sont prsums tre lobjet de
jointures frquentes. La cration dun cluster doit tre suivie de celle dun index de
regroupementpourquelepremierpuissetreexploitparleSGBD.
Exemples:
CREATEINDEXcluster_idxONCLUSTERLieu_travail;[Oracle]
leclusterLieu_travailestprsumdjcr
CREATENONCLUSTEREDINDEXarticle_idxonVentes(article);[SYSBASE]
8.5Indexclstransformes
Lorsquelesajoutssonteffectusdansunordrecroissantdelavaleurdunattributetque
des suppressions rgulires sont aussi faites dans un ordre quelconque, cela engendre
undsquilibreduBarbre,suividudclenchementduprocessusderajustement.Pour
viter ce phnomne pisodique, certains SGBD, dont Oracle8, offrent la possibilit de
transformerchaquevaleurindexeeninversantsystmatiquementlordredesesoctets,
ce qui entrane une randomisation des entres de lindex. En ce faisant, les espaces
librsparlesentressupprimesontuneplusgrandechancedtrerutilissencours
des ajouts, avant mme lamorce du travail de rorganisation. Bien entendu, cette
rpartition est faite au dtriment de la recherche par plage de valeurs (index scan),
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 135
puisque trois valeurs initialement ordonnes lors de leur insertion dans lindex ne le
serontplussuitelinversiondesoctetsdecesmmesvaleurs.
8.6Indexinvers
Un index invers (inverted index) sur un attribut est un index construit avec les
diffrentesvaleursdelattributdontchacuneestassociunelistederidsdetuples.
Parexemple,pourslectionnerlessoudeursdanslatableOuvrier,leSGBDaccdeun
indexinversetdansuneseuleoprationobtientlalistedesridsdestuplesreprsentant
unemploysoudeur.Demme,pourobtenirlessoudeurset/oulesfraiseurs,ilsuffitde
faire la concatnation des deux listes et ensuite de rfrer aux tuples identifis par les
adressesdetuple.
specialite
soudeur r23 r34 r44 <listederids
fraiseur r89 r56
sableur r123 r78 r22
Indexinverssurlaspcialit(visionlogique)
Figure8.6
LattributquiestinverspeuttreorganisselonunB*arbreavec,danslesfeuilles,les
ridquiconduisentauxtuplesutilisantcettevaleur.Cetypedindexpermetlindexation
des attributs, peu importe leur slectivit, et le calcul des requtes comportant un
prdicatcomplexeformaveclesoprateursOUetETlogiques.Ilestparticulirement
utile dans les grandes bases ou les entrepts de donnes comportant des millions de
tuples.
8.7Indexbitmap
Ce type dindex est particulirement utile pour indexer les attributs faible slectivit
pourlesquelsleB*arbrenapasdeperformanceexceptionnelle.Ilseraparticulirement
exploit avec un star schema de lentrept de donnes (data wharehouse). Par exemple,
indexer une table des employs avec lattribut sexe dont le facteur de slectivit pour
unerpartitionuniformeest0.5,najoutepaslefficacitdelarecherchedesemploys
fminins!Eneffet,ilestfortprobablequelecalculsoitfaitparunbalayagesquentielde
latable.
UnerechercheclassiquedansunB*arbreaboutitunefeuilleolesystmetrouveun
ridpermettantdaccder,selonlecas,lapagededonnesouautuple.Danslecasde
lindex bitmap, la structure de B*arbre est toujours utilise pour organiser les valeurs
(de prfrence peu nombreuses) de lattribut index. Cependant, les feuilles ne
contiennentpaslesrids,maisunvecteurdebitsdanslequelchaquepositionreprsente
un tuple de la table ouvrier identifi par son adresse. La longueur du vecteur de bits
correspond au nombre de tuples dans lextension de la table. Par exemple, un index
bitmapsurlaspcialitdelatableOuvrierpermetdavoiraccsdesvecteursde4bits,
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 136
soit un bit par spcialit du domaine. Pour chaque valeur de lattribut specialite, le
vecteurcorrespondlacolonnedelatablecidessous.
Ouvrier (nas*, nom, salaire, specialite, noUs)
Lextensionestlasuivante:
CREATEINDEXBITMAPONOuvrier(spec)
TABLESPACEspec_espaceSTORAGE(INITIAL2MPCTINCREASE10);
Un autre index bitmap peut tre aussi cr sur lattribut salaire. Ce deuxime index
permettradecalculerrapidementlarponseunequestiondugenresuivant:
Quelssontlesemployssoudeursquigagnent30000.00$?
En effet, avec un index sur lattribut salaire, il suffit de faire lintersection des deux
colonnes, salaire de 30 000.00 avec celle de soudeur. Les tuples du rsultat sont
accessiblesvialacldelatableOuvrier.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 137
Louvrierdcritparletuple00234:020:8922estunsoudeurgagnant30000$paranne.
Cestleseultupledelarponse.
8.8Indexpartitionn
AvecleSGBDOracle8,lesindexpeuventtreaussipartitionnscommecestlecasavec
les tables. En ce faisant, chaque partition peut avoir ses caractristiques de stockage,
notammentunfichierexclusifutilispourlestockagedesseulesdonnesdelapartition.
Lutilitdecemcanismerestecependantdmontrer.
Crationdesindexsimpleetcompos
Un index (B*arbre) est avant tout un mcanisme qui privilgie un chemin daccs
particulieretrapidepouraccderauxtuples.Sicettevaleurestunique,i.e.associeun
seul tuple, cela permetde vrifier lunicit de valeur dansune colonne dattributs sans
faireunaccsphysiqueauxtuplesdelatable.
Un message derreur est mis si une deuxime valeur identique est ajoute. La
spcification dune cl primaire active dans le schma dune table gnre
automatiquement un index interne gr par le systme. Cela nest pas le cas avec la
spcification de la cl trangre qui peut tre index par la cration subsquente dun
index. Un index peut donc tre cr, au besoin par le DBA, afin dacclrer laccs aux
tuples.
CREATE[unique]index<nom_index>on<nom_relation>(col1,col2,...)
Lacommandedecrationdunindexpeutavoirdesargumentsconcernantlestockage:
tablespace,PCTused,PCTfree,initrans,etc.Lindexestluimmeunetablequipeuttre
consulte comme nimporte quelle autre table de base de la BD. Toutefois, en cours
dexploitation,latabledindexestparcourueavecunestructuredeBarbreouunedeses
variantes.
CREATEINDEX nomdelINDEX
schma.
ON table ( colonne
schma.
ASC
DESC
CLUSTER nom_cluster
schma.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 138
extension
TABLESPACEnom_tablespace
NOSORT
Figure8.9
Caractristiquesdesindex
Unindexeststocksouslaformedetuplesdansunetablecomportantunecolonnepour
lentre de lindex et une autre pour le rid du tuple index. Si un index est unique,
chaque valeur dindex est apparie une seule valeur de rid, donc un seul tuple de
donnes.
Les proprits dun index sont parfois explicitement spcifies ou soustendues par la
procduredecrationdesindexduSGBD.
b)Lestuplesdindexpeuventcohabiteraveclestuplesdedonnesdanslemmeespace
dedonnes,maisdansdessegments(doncdespages)diffrents;ilspeuventaussitre
avecprofitregroupsdansuntablespacespcialisrservexclusivementaustockagedes
index.
c)Lesentressontmisesautomatiquementjouraucoursdelexploitationdelabase,ce
quipeutentranerunralentissementlorsdunemisejourintensive.Ceralentissement
vautaussipouruneentrecomposedeplusieursattributsdelammetable.
d) Les index sont utiliss implicitement par loptimiseur de requtes. Il est possible de
bloquerlusagedunindexdanslaphasedoptimisationparlaformulationduprdicat
ou en fournissant directement une directive loptimiseur (hint). La recherche des
donnesdansunetableestacclreparunindex,maislajoutestralentiparlamise
joursousjacentedelindexenquestion.Leparcourscompletdunetable(fulltablescan)
nestpasncessairementacclrparunindex.Ceparcoursexhaustifestuneopration
quidemeurelenteetquelondoitdeprfrenceviterdanslesapplications.
e) Les index utilisent lespace de la ZMP (Zone de Mmoire Partage gre par le
moteurSGBD)quiautrementseraitutilisparlespagesdedonnes;unindexnedevrait
treutilisquepourlestablesdontlacardinalitestdelordrede1000tuplesetplus.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 139
f)Unindexpeuttredenseounonselonquelesentrespointentsuruntupleousurun
lotdetuples(i.e.unepage).Enoutre,ilpeutinduireunplacement(clustering)destuples
associlordredesentresdelindex.
Usagedesindexparloptimiseur
En rgle gnrale, les index sont utiliss pour le calcul dune rponse, car ils sont en
principe capables den acclrer lobtention. Il est cependant possible den bloquer
lexploitation par une formulation syntaxique particulire des clauses SQL ou par le
recoursauxhintsdeloptimiseurduSGBD.
Loptimisation est bloque dans le cas des requtes suivantes qui comportent une des
caractristiquessuivantes:
a)Unattributindexestmodifiparunefonctionouuneexpressionarithmtique;
b)UnattributindexestmodifiparunNOTouun!=ouesttestpourunNOTNULL;
c)LabsencedelaclauseWHERE;
d)Unattributindexassociunerecherchedecaractresparloprateurdechane%
placendbutdechane.
Les mcanismes dtaills mis en uvre dans loptimiseur seront tudis dans un
prochainchapitre.
Exemplesdecrationdindex:
a)Crerunindexaveclenomdelarticleeninventaire(clcandidate):
CREATEUNIQUEINDEXidx_article_InventaireonInventaire(article);
Le nom de lindex est choisi par le DBA et peut tre normalis en le prfixant par
exempleparidx_,suividunomdelattributindexetfinalementterminparlenomde
latable.
b) Crer un index unique et compos dont les entres sont formes avec les attributs
(description et proprio) de la relation Pieces. Cette paire dattributs tant une cl
candidate,unindexuniquepeuttrecr.
Pieces(nop*,description,km,ville_p,proprio)
CreateUNIQUEindexidx_desc_propr_PiecesonPieces(description,proprio);
Cet index compos peut acclrer de faon significative le calcul de la rponse aux
requtes qui utilisent les deux attributs dans un prdicat conjonctif de slection. La
rechercheestraliseparlaconsultationdelindexcompospourobtenirlensembledes
ridsdelarponse.
SELECT *
FROM Pieces
WHERE description =porte And proprio ='f1';
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 140
Silarequteestexcutefrquemment,legaindeperformanceseraalorsdautantplus
important. Lorsquune requte conjonctive ne concerne quune seule table, lexistence
dunindexsurlundesattributspermetnormalementdacclrerlecalculdelarponse.
Loptimisation en tient compte pour tablir le plan dexcution de la requte. En
revanche, une requte disjonctive ne gagne pas ncessairement en temps de calcul en
utilisant un seul index. En effet, il faudra faire un balayage complet de la mme table
pour vrifier la deuxime partie du prdicat disjonctif. Autant alors viter lappel de
lindexetvrifierleprdicatlorsdunseulbalayagesquentiel.Sitouslesattributsdu
prdicat sont indexs, alors les index peuvent tre utiles. Le balayage dune table (full
table scan) est une opration longue quil faut autant que possible viter en raison du
transfert dun nombre important de pages entre les disques et la zone de mmoire
partage(ZMPouSGAOracle).
Avecunerequteconcernantplusieurstables,labsencedetoutindexpourlesattributs
non primaires utiliss dans le prdicat soustend un balayage obligatoire complet des
deuxtables.Avecunseulindex,loptimiseurchoisiraentreplusieursplansdexcution
en estimant lequel sera le plus rapide pour calculer la rponse. Cest la base de la
stratgiequireposesurlecotdecalcul.
Suppressiondunindex
Lindex est un objet de la BD comme lest une table de donnes. Il peut donc tre
supprimparlacommandeDROPINDEX:
Dropindex<nomdelindex>
Lindexestalorssupprimetsadfinitionestenlevedudictionnairededonnes.
Exemple:Supprimerlindexnommidx_piece_inventaire:
Dropindexidx_piece_inventaire
Lespaceutilisparlindexestlibrsansentranerautomatiquementunerorganisation
de lespace disque impliqu dans la suppression des pages de lindex. Cet espace sera
cependantventuellementrutilisparleSGBD.
8.9GuidedutilisationdesindexencoursdexploitationdelaBD
Plusieurs rgles de pratique sont proposes par les socits qui commercialisent les
systmeshautdegammesurlusagedesindexdanslexploitationdelaBD.Ilfauttenir
comptedesfacteurssuivants:
a)Lesindexutilessontceuxncessaireslexploitationcourantedesdonnes(vitezles
traitements hypothtiques ou prvus mais non confirms par des applications en
production)enfonctionduprofildutilisationdesdonnes.Ilestutiledavoirrecours
un fichier de commandes pour crer les index, afin de spcifier plus facilement les
paramtres concernant lespace de donnes (tablespace) ncessaire la cration du
segmentdindex.Ildevientalorstoutaussifaciledelessupprimerquedelescrer.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 141
b)Ilfautsupprimerlesindexlorsquilsagitdetraiterunfluximportantdetransactions
du type mise jour sur une table. Les index sont dabord supprims, puis recrs au
besoinaprslesmisesjour.Cetteoprationestindiquelorsdestraitementsenlotou
duchargementdunetableavecunfichierdedonnesvalides.
c)Durantunesessionintensivedecrationderapportsetdecalculderequtes,leDBA
verra crer les index ncessaires en tenant compte des tables qui seront utilises au
coursdelaprparationdurapportetducalculdesrponses.
d) Lindex de cl (en version systme) est aussi utilis pour assurer lunicit de la cl
monoattribut,i.e.pourrenforcerlacontraintedeclspcifiedanslemodlerelationnel.
Aubesoin,laclprimairepeuttredsactiveparunDISABLEpourbloquerlamise
jourdelindexsystmesousjacent,maislindexsurlaclprimairenestpasdtruit.La
ractivation de la cl primaire lance cependant la mise jour rtroactive de lindex
systmecorrespondant.
e)Uneacclrationdelajointureestpossibleparlacrationdesindex:lesattributsde
jointure qui sont indexs permettent un accs plus direct aux tuples vrifiant la
conditiondejointure.
Exemple:
SELECTEmpl.nom,Y.dnoDep,Y.nomDep
FROMEmplE,DepY
WHEREEmpl.noDep=Y.noDep;
Danscecas,lindexsurlaclprimaireestautomatiquementutilisenconjonctionavec
celuicrparleDBAsurlacltrangre.
IndexsimpleetcomposdeOracle
DeuxsortesdindexsontdisponiblesavecleSGBDOracle:simpleetcompos.Dansles
deuxcas,ilssontdetypedense,i.e.quelesentrespointentsurdestuplesetnonsurdes
pages. Lindex simple est construit avec les valeurs dun attribut dune seule table. On
doit viter de crer un tel index pour les attributs peu slectifs dont le facteur de
slectionestsuprieur.35,parexemplelesexedunepersonneoulenom.Ilconvient
dutiliserlindexsimpledclarUNIQUEpourvaliderlunicitdesvaleursdunattribut,
carlavrificationestalorseffectuesansfaireunaccsauxtuplesdelatable.
CREATEUNIQUEINDEXidx_assig_emplONAssignations(noEmpl);
Lindex compos est dfini avec plusieurs attributs dune mme table. Il y a alors
acclrationducalculpourlesrequtesdontleprdicatserfretouslesattributsde
lindexcompos.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 142
CREATEINDEXidx_no_poste_no_mpl_assignationsON
Assignations(noPoste,noEmpl);
Lindex compos est construit avec les entres formes de plusieurs attributs ordonns
dunemmerelation.Uneentrepeutavoirjusqu16attributsdontlordreestfigds
lacrationdelindex.SileprdicatduneclauseSQLfaitrfrenceaupremierattribut
de lindex compos, celuici sera employ pour acclrer le calcul. Si seulement le
deuximeestrfrenc,lindexnepeutpastreutilis.Danscecas,silexisteunindex
simple sur un des attributs de lentre de lindex compos, il sera mis contribution
pourlecalculdelarponse.
Voiciunexempleaveccrationdunindexsupplmentairemonoattributpourlarelation
Assignations, en sus dun index compos existantsur les attributs (noposte, noempl).
La requte suivante utilise une jointure qui fait seulement rfrence au deuxime
attributdelindexcompos,soitlenoEmpl.
SelectE.noEmpl,E.nom
From EmplasE,AssignationsasA
WhereE.noEmpl=A.noEmpl;
Le calcul de la rponse en labsence dun index simple sur la cl trangre ne tire pas
profit de lindex compos qui inclut la cl trangre. Il y aura un balayage complet et
squentiel de la table Assignations, puisque cette jointure fait rfrence au deuxime
attribut de lindex compos. Une meilleure performance sera obtenue par la cration
aveclattributnoEmpldunindexsimplesurlacltrangre.
CREATEINDEXidx_noEmpl_AssignationsON
Assignations(noEmpl);
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 143
SELECT*
FROMAssignationsA,EmplE
WHEREA.noEmpl=E.noEmplandarticle=a1;
LabsencedelattributnoPosterendlindexcomposinutilisable.
c) La ngation dans une condition bloque lusage des index composs par loptimiseur
puisquelesvaleurshorsdomainenesontpasindexes.
SELECT*
FROMVentes
WHEREnom!=ChristineandVentes.article=a1;
Quandfautilcrerunindexcompos?
Lorsquecertainsattributssontfrquemmentutilissensembledanslexploitationdune
BD, il peut tre alors avantageux de dfinir quelques index composs. La dcision
dpendra du suivi de lexploitation fait par le DBA et des statistiques de performance
mesuresparlenoyauduSGBD.
8.10IndexationavecOracle
Les relations cres ne sont pas indexes automatiquement, sauf pour la cl primaire
(simple ou compose) qui est spcifie dans le schma dune table par la clause
PRIMARY KEY. Cette clause impose la cration de lindex sur la cl primaire, lequel
index est maintenu par le systme SGBD indpendamment du DBA. La clause
PRIMARY KEY spcifie une contrainte de cl vrifie par le SGBD au moyen dun
mcanismeappropriquipeuttreunindex,untriggerouunefonctiondehasching.
dindex donnes
Page
Page de
dindex donnes
Indexetdonnesdansdiverssegments
Figure8.10
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 144
Lespace dune page dindex est gr peu prs comme celui des donnes, soit avec le
paramtre PCTFREE. Par exemple, avec un PCTFREE de 20 %, de nouvelles entres
dindexpourronttreajoutesdansunepage(viadenouvellescellules)etcela,tantquil
ya20%despacelibredanscelleci.LorsqueloccupationpasselabarreduPCTFREE,la
page perd son statut de page insrable. Il est alors impossible dajouter de nouvelles
entres tant que lespace utilis nest pas revenu un niveau infrieur la valeur du
PCTUSED.cemoment,lapagedevientnouveauinsrableetestajoutelalistedes
pages libres (free list). La libration despace provient, soit des modifications soit des
suppressionsdesentresdelindex.Toutefois,lamisejourdunindexnonuniquepar
lajout de ROWID comme une entre sera possible grce lespace disponible (20 %)
pour le dbordement. Puisquun index est lobjet dune grande activit en cours
dexploitation, le PCTFREE doit tre assez lev pour un index non unique afin de
permettre linsertion des adresses de tuple dans les feuilles et cela, pour une entre
existante.
20%pourlePCTFREE
70% pour le
PCTUSED
Occupationdunepagedindex
Figure8.11
Enfin, il y a avantage privilgier la consultation des pages dindex par des lectures
logiques(logicalread),cestdiredeslecturesdanslespagesdjprsentesdansleSGA,
de manire viter les lectures physiques (physical read), cestdire celles toujours
lentes des pages physiques sur un disque. Les lectures logiques seront probablement
plusfrquentessilesadressesdetuplepourunemmeentresontdanslammepage.
LespagesdesindexsontrangesdanslaZMPetsontlobjetdeverrouillage.Ainsi,un
tuplededonnes,quiseratrouvparunindexetdontlavaleurdelattributindexsera
modifie,forceralesystmeverrouillerlentredelindex(letuplecorrespondantson
entre) en plus de poser un verrou RX sur la table modifier. Le double verrouillage
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 145
La mise jour des index suit toute modification et toute insertion de tuples dans les
relationsetestassureautomatiquementparleSGBD.Pluslesattributsdunetablesont
indexs,plusletempsglobaldemisejourestimportant.Eneffet,leSGBDdoitfairela
modification dans le tuple, mais aussi dans tous les index faisant rfrence aux tuples
modifis.
Unindexpeuttresimpleoucomposselonquesonentrecomprendunouplusieurs
attributs.
CREATEINDEX[schma.]<nom_idx>ON[schma.]<table>
(attribut[asc|desc],...)INITRANS<entier>
MAXTRANS<entier>TABLESPACE<tablespace>
STORAGE<initial,next,MINEXTENTS,...>
PCTFREE<entier>[NOSORT];
LasuppressiondunindexestraliseparlacommandeDROPINDEX.
DROPINDEX[schma.]<nom_index>;
Exemple:
CREATEINDEXidx_proprio_piecesonPieces(proprio)ASC
INITRANS3MAXTRANS6Tablespaceespace1
storage5Minitial10Knext10Kminextents2maxextents20
PCTINCREASE20PCTUSED40PCTFREE40;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 146
contrleursdiffrentsestaussiunfacteurdeperformancepourautantquelesindexet
lesdonnesdestablessoientrangessurdesdisquesdiffrents.
8.11Indexationdelaclprimaireetdelacltrangre
Une cl primaire simple ou compose, spcifie dans le schma dune relation, est
implmente par la cration automatique dun index systme qui est rendu
immdiatement, actif, sauf si la clause DISABLE est spcifie. Les valeurs nulles sont
exclues implicitement de la cl et napparaissent donc pas dans un tel index systme.
Toutefois,laclprimairepouvanttredsactive,lesattributsquilacomposentdoivent
tredclarsNOTNULL,carautrementlinsertiondetuplesavecdesattributsprimaires
nulsseraittolrejusqulaprochaineractivationdelindexdelaclprimaire.Cest
ce moment que la contrainte de cl sera vrifie. Normalement, lindex sur la cl
primaire est actif la cration de la base de donnes et le demeure au cours de son
exploitationtransactionnelle.
VoiciunexemplepourillustrerladsactivationdelaclprimairedelatableEmpl.
ALTER TABLE Empl primary key DISABLE;
Ajoutdetuplesdansunetableenfant
Enlabsencedunindexsurlacltrangre,lacontrainterfrentielleestvrifieparun
trigger ou une procdure interne qui soustend le balayage complet des donnes de la
table.
TableUsine
LestuplesdeUsinesontverrouills
TableAtelier
T1:(a2,.u1)
Ajoutdunatelier
Suitelajoutdanslatableenfant,untriggerbalaielatableparentpourdterminer
si lusine rfrence dans le nouveau tuple est bien prsente dans la table Usine.
Pourfairececi,toutajoutesttemporairementbloqudanslatableUsine.
Figure8.11a
Dans ce cas, pour viter un verrou bloquant sur la table et favoriser la performance, il
suffira de crer un index avec la cl trangre, index qui, ajout celui de la cl
principale de la table parent, permettra de vrifier la prsence dune valeur de cl
primaire (ajout dans la table enfant) ou de cl trangre (suppression dans la table
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 147
parent) sans verrouiller ni accder aux tuples de la table parent. Une contrainte de cl
trangreestautomatiquementrenforceenlabsencedelaclauseDISABLEpourlacl
primaire de la table parent. Cependant, cette contrainte rfrentielle ne se traduit pas
ncessairementparlacrationautomatiquedunindexaveclacltrangre.
TableparentUsine
noUsine, noUsineIdx
25 Verrousurlentre
TableenfantAtelier Ajoutdunatelier
noUsine
25
Figure8.12
Elleestimplmenteparunmcanismeinternequifaitrfrencelaclprimairedela
table parent ou par un trigger qui soustend le verrouillage complet de la table parent
suividesonbalayageenentier(fulltablescan).AudbutdelatransactionT1quiajoute
untupledanslatableAtelier,silusinerfrenceparcenouveautupleestabsente,le
triggerenclenchdoitaboutirunchec.
Laprsencedunindexsurlatableparent,permetausystmedevrifierlaprsencede
lusinerfrenceetdeplacerunverroupartag(Sharedlock)surlentredelindexdela
cl primaire, qui bloque de facto la suppression de ce tuple parent par toute autre
transaction. Le verrou est maintenu jusqu la fin de la transaction T1. Leffet net sera
uneplusgrandeconcurrenceauxdonnesauprofitdesautrestransactions.
Demme,lasuppressionduntupledanslatableparentparT1exigelavrificationde
larfrenceventuelledecetupleparceuxdelatableenfant.Pourviterdebloquerla
table enfant aux autres transactions, un index cr avec la cl trangre permet de
vrifier rapidement une rfrence la cl primaire, de poser un verrou temporaire sur
lentrecorrespondantedanslindexdelacltrangre,bloquantmomentanmenttoute
suppression aux tuples enfants et cela, par lemoyen dun verrou partag appliqu sur
lentre de lindex pour la dure de T1. Ainsi, toute autre transaction T2 est interdite
dajoutduntupledontlacltrangreauraitlavaleurdelentredelindexverrouille
parT1.
Pertinencedelindexation
Ilnestpastoujoursappropridindexerlesattributsdunerelationsanstenircomptede
lexploitation relle des tables. Ce nest que par un suivi appropri et rigoureux de
lexploitationdesdonnesetunbontravaildecoordinationaveclesconcepteurs,quun
DBA peut mettre au point et adapter les accs la BD par des index qui sont
essentiellement un mcanisme daccs rapide aux tuples. Lindexation doit tre revue
priodiquement pour tenir compte des changements dans le profil dexploitation des
donnes.Unindexfortutilispendantunepriodepeutdevenirnuisibleparlasuitesi
letauxdaccslatableindexechuteradicalement.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 148
Observationspratiquespourlindexation
1.Laspcificationdelaclprimaireengendrelacrationdunindexsystmeuniqueet
actif,saufsilestdsactivparlemotclDISABLE.
2. Si la cl est utilise frquemment dans une jointure impliquant la cl trangre, une
meilleure performance pourra tre obtenue avec un index actif dfini sur la cl
trangre. La contrainte rfrentielle doit cependant rester active. Par contre, un tel
indexpeutralentirlesmisesjoursurlacltrangre(DELETECASCADE)parceque
cellesci doivent tre rpercutes sur lindex. Il faut donc viter dans ce cas de figure
lindexationdelacltrangre.
3.Silacardinalitdunerelationestsuprieure1000tuplesetquecettetableestutilise
frquemment dans une jointure, la cration dun index avec les attributs de jointures
acclregnralementlecalculdelarponse.
4. Un index compos est utile si les attributs indexs sont souvent utiliss comme une
suite conjonctive de valeurs. Un tel index compos est moins utile avec les requtes
disjonctives.
5.Unindexnestpasncessairepourdesexploitationssquentielles dutypefullscan
commelaprparationdelistesexhaustivesdestablesquiutilisenttouteslesvaleursdes
attributs dune relation.Un index est gure utile avec un attribut dont la slectivit est
infrieure0,35.
7.LesattributsdelaclauseWHEREserontlobjetduneindexation.Avecunecondition
dgalit, le calcul est acclr avec une fonction de Hashing, tandis quavec une
conditionimpliquantuneplagedevaleurs,lecalculestplusrapideavecunindexenB
arbre.
8. Gnralement, un index sur une relation peut tre de type cluster pour acclrer les
requtesdejointureassortiesdunintervalle(plage),saufsilvaluationnestfaitequau
niveaudelindex.Danscederniercas,leclusteringnestpasncessaire.
Durant la phase danalyse, le DBA doit en premier rpertorier les applications et les
attributs utiliss par cellesci pour accder aux donnes. Si certains attributs sont
frquemmentutilissparlesapplications,cesontdesattributscandidatslindexation.
Ilfautaussiconsidrerlesapplicationsdjplanifiespoursattarderparticulirement
cellesquifontdetrsnombreuseslectures.Encontrepartie,silesapplicationsontaussi
unechargedemisejourtrsimportante,ilfautprendreencomptelefaitquelesindex
sontpluttlourdsmettrejour.Quellequesoitladcision,leDBAdoitsurveillerde
prs lvolution des performances du systme et prendre les mesures qui simposeront
pourlesamliorer,notammentlacrationoulasuppressiondindex.
8.12Placementdestuplesparlecluster
Le clustering ou le regroupement des tuples dune ou de plusieurs tables est un
mcanisme de placement des tuples partageant une mme valeur pour les attributs
dfiniscommeattributsduregroupement.Ilyadonccrationdunenouvellestructure
de page caractrise par deux enttes. Normalement les tuples de deux tables
diffrentes sont rangs dans des pages diffrentes respectivement alloues aux deux
tables. Il en est autrement avec le cluster. Il sagit pour le systme SGBD de placer
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 149
physiquement les tuples qui interviennent dans le calcul des jointures le plus prs
possible les uns des autres, de prfrence dans la mme page. Il y a deux types de
placement index : le cluster index et le cluster avec Hashing. Le premier implique
deux ou plusieurs tables, tandis que le deuxime soustend une mme table dont les
tuples sont placs dans des pages dont ladresse est drive de la valeur dun attribut.
CesclusterssontspcifisetcrsaubesoinparleDBA.PrenonslexempledelaBDde
Dotation des ressources humaines, BD3 dans laquelle le taux horaire est multipli par
100.
Pourconnatreladescriptionduposteoccupparunouplusieursemploys,ilfautfaire
unejointureentrelestablesAssignationsetPostes,enutilisantlattributnoPoste.Pour
acclrer le calcul, le systme peut placer, de prfrence, les tuples de ces deux tables
danslammepageensebasantsurlavaleurdenoPoste.Ainsi,lestuplesdecesdeux
tuples qui concernent les employs occupant la fonction j75 seront placs dans la
mmepagepourenfaciliterlesaccsetlescomparaisons.Lesattributsspcifisavecle
critredeplacementsontappelslaclduregroupement(ouduclustering).Dansnotre
exemple,lenoPosteestlattributdeclustering.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 150
Le placement par clustering ne se limite pas au seul calcul dune jointure. Il peut tre
utilis pour grer le placement des tuples de diverses tables dune BD que les
applicationsrapprochentparleurtraitement.
Pagedecluster(structurelogique) Pagedecluster(structurelogique)
(j34,peintre) (j21,mcano1)
(j34,P651,22mars1991,jour) (j21,P762,23dec1990,nuit)
(j34,P337,21jan1992,nuit)
(j34,P345,24sep1994,jour)
Par exemple, si une application en L3G doit faire la liste des transporteurs dans la
colonne gauche dun rapport et ensuite celle des pices dans la colonne droite, elle
exploite simultanment les deux tables Transporteurs et Pices sans faire de jointure.
Danscecas,onauraavantageplacerlestuplesdesdeuxtablesdanslesmmespages
en dclarant les deux cls, primaire et trangre, de ces tables comme un attribut de
clustering (cestdire placement regroup). Les tuples ayant la mme valeur pour
noPostesontrangsdanslesmmespagescequiacclrelecalculdelajointure.
8.12.1PlacementparHashing(Hashclustering)
Dans ce cas, le placement concerne les tuples dune ou de plusieurs tables dont le
rangementdanslaBDestcalculparunefonctiondeHashing,soitlafonctionHfournie
parleSGBD,soitselonlavaleurfournieexplicitementparunattribut.
Lespacedesclsduclusterestdfinicommelaplagedesvaleurspossiblesdfinieparlesbornes
infrieure et suprieure. En pratique, toutes les valeurs de la cl du cluster ne sont par
utilisesparlacl.Lintervalledecesvaleursestdonccondensenpremieruneplage
pluspetiteaumoyendunefonctionTappeleparlapplicationetdontlesvaleurssont
parlasuitetraitesparunHashingpourdonnerlesadressesdepages.Parexemple,le
tauxhoraire(x100)payunemployvariede12501450danslatableetseulement5
%decesvaleurssontrellementutiliss,soitenviron50numros.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 151
Page0
Valeursdelattribut
(x100)
T Page1
1300:mod(50)=0
1752:mod(50)=2
1249:mod(50)=49
Page2
1325:mod(50)=25
1431:mod(50)=31 Page
Figure8.14 49
LafonctiondetransformationTconsisteradonccalculerpourchaquetauxunevaleur
entre 0 et 50 par une transformation approprie souvent base sur un modulo. En
supposantlatailleduntuple1Koetque200valeurssontthoriquementpossibles,il
faudraprvoirunmaximumde4tuplesayantlesmmesvaleursdeHashingregroups
dans une mme page de 4 Ko. Lespace prvoir pour le stockage des tuples et les
collisionsseradoncde4*1Ko/t=4Ko,soitlatailledunepage.
PourcrerunclusterdeHashing,ilfautspcifierlesattributsdeclusteringetlenombre
devaleursdeHpossibles,ainsiquunestimdunombredetuplesayantlammevaleur
pourlafonctionH.Danslexemplecidessus,ilpeutyavoirjusqucinquantevaleursde
Hashingdiffrentes(mod50).Onestimeque4tuples,quiontlammevaleuretdontla
tailleestprsde1Ko,ncessitentunespacederangementde4K(SIZE).Ilyauradonc
jusqu4tuplesparpage(de4K).LeSGBDfournitpardfautsafonctiondeHashing.
CREATECLUSTERTAUX_CLUST(c_tauxnumber(4))
SIZE4KespaceduclusterpourrangerlestuplesdemmeH;taillemax=1page)
HASHKEYS50;nombrepossibledeclsdeHashing
Aprs la cration du cluster, il faut crer la ou les tables (pour en ranger la dfinition
dans le dictionnaire) en spcifiant que les tuples seront rangs dans le cluster
TAUX_CLUST,quiestenfaitunespacedetableunpeuspcialquantlastratgiede
rangementdestuplesdelaoudestablesassociesaucluster.
Lelienentrelattribut declusterc_tauxetlattributdelatabletauxHestfaitlorsdela
crationdelatableetdesonassociationaucluster.Lorsquunerequtefaitrfrencela
tablerangedansuncluster,leSGBDutiliselavaleurdelattributdecluster(fourniepar
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 152
lattributdelatablecorrespondant)pourcalculerunecldeHashingetlirelapagequi
contientleoulestuplesdemands.
SELECT *
FROM Empl
WHERE tauxH = 1250 ;
Lattributtauxestinscritdansledictionnaireavecunindicateursignalantquilestutilis
danslaspcificationduncluster.LeSGBDeffectuelecalculdelacldeHashingpartir
delavaleur1250pourainsiconnatredirectementladressedelapagetransfrerdans
la ZMP: MOD(1250, 50) = 0. Laccs est plus rapide par rapport celui ralis par un
indexquidanscecaspeutncessiterletransfertdeplusieurspagesavantdidentifierle
riddutuple.
ClusteravecHashingexplicite
Il est aussi possible de fournir la fonction de Hashing (H) en remplacement de celle
fournieparleSGBD.Parexemple,lafonctionpourgnrerlenopostepeuttredfinie
commeunnombregnrparlasquenceposteIDseq:
CREATECLUSTERPOSTEID_CLUST(poste_ID_SEQNUMBER(3))
SIZE4K espacepourrangerlestuplesdemmevaleurH
HASHIS(no_poste)mod(25)/*nognrparlasquence*/
HASHKEYS31;arrondiaupremiernombrepremiersuivant25
Dans ce cas, le placement des tuples est dirig par le modulo 25 de lattribut no_poste
dontlavaleur,danscetexemple,estgnreautomatiquementparunesquence.
8.12.2Clusterindex
Un cluster index regroupe dans la mme page les tuples ayant la mme valeur pour
lattribut de cluster. Un tel cluster doit tre index pour permettre dexploiter la
cohabitationdestuplesdanslammepage.Danscetypedeplacement,ilfautcrerun
objetclusteretensuitecrerobligatoirementunindex.Ilestaussipossibledutiliserun
cluster index avec une seule table pour regrouper les tuples ayant une mme valeur
dattribut.Considronsunmodlepourreprsenterlescomptesbancairesetlesclients.
CREATECLUSTERclust_comptes_bancaires(c_no_comptenumber(3));
CREATEINDEXind_clust_comptes_bancairesONCLUSTERclust_comptes_bancaires;
CREATETABLEComptes(
noComptenumber(3)primarykey,
villevarchar2(35))
CLUSTERclust_comptes_bancaires(no_compte);
CREATETABLEClient(
naschar(8)primarykey,
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 153
nomvarchar2(45),
...
noCompteClientnumber(3)ForeignkeyReferences
Comptes(no_compte))
CLUSTERclust_comptes_bancaires(noCompte);
Unepageduncluster(indexoupas)regroupedoncdestuplesdesdeuxtablessurla
basedeleurvaleurcommunepourlattributducluster.
Indexducluster
Enttedelapage4
nas7,Tremblay,c35
tuplecompte
tupleclient
C35,Qubec
nas56,Gagnonc35
tuple client
tupleclient
nas78,Poulin,c38
Figure8.15
LespagesduplacementnesontpasprdterminesparlemoteurduSGBD,maisbien
parlavaleurdelaclducluster.Lesdeuxtuplesdelexempleontunetaillediffrente,
mais sont associs au mme attribut de cluster. Donc les trois tuples concernant le
comptec35setrouverontdanslammepage.
Un cluster, de par sa structure mixte, freine laccs squentiel tous les tuples dune
mmetable.Eneffet,cesmmestuplessontrangsdansplusdepagesquencessaireet
cela constitue une charge supplmentaire pour la lecture squentielle des pages sur
disque.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 154
Pagesregroupes(clustered)
Lajointureestfaitevialindexetaveclaconditionsuivante:
Client.noCompte=Compte.noCompte
Le calcul dune telle jointure est trs rapide, car les tuples sont dj regroups dans la
mmepage.
Indexderegroupement(cluster)etsesproprits:
1 Une cl entirement nulle a une entre dans le rpertoire. Ce type dindex est donc
diffrentdeceluienBarbrequinindexepaslesvaleursnulles.
2Lindexdeclusterestobligatoirepouraccderauxdonnes.Uneentrepointesurla
1erepagepourunevaleurdonnedelaclducluster.
Autreexemple:
CREATE CLUSTER Lieu_travail (no_usine number)
SIZE 4K, -- espace pour ranger les tuples ayant la mme
--valeur pour l'attribut du cluster
TABLESPACE espace_table1;
8.13Crationetsuppressiondevues
Au chapitre sur le modle relationnel, la mise jour par lentremise de la vue
relationnelle a t prsente comme tant possible dans certaines conditions prcises,
lesquelles ne peuvent pas tre gnralises. Avec les implmentations SQL
commerciales,lamisejourtraversunevueestlimitedavantage.
CREATEORREPLACEVIEWVentesImportantes(nom,article,qteTot)AS
SELECT*FROM VentesWHEREqteTot>5;
Une vue relationnelle ne peut pas tre supprime, ni tre utilise pour la mise jour
dunerelationdebasesilyaviolationdescontraintesrelationnellesactivesetrenforces
parleSGBD(viewdependency).
Une vue est conserve sous forme dune dfinition SQL et ne correspond pas
gnralement une soustable relle et persistante. La vue na donc pas dextension
permanente et nest pas un instantan (snapshot). Une vue compose dune jointure de
deux relations de base pourrait tre autorise faire une mise jour seulement
certainesconditionstrsparticuliresquiexigeraientunecertaineintelligencedelapart
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 155
duSGBD,enplusduneconsultationfrquentedudictionnaire.Cependant,enpratique
les systmes nautorisent pas la mise jour travers une vue dfinie par une jointure.
Finalement, une vue peut tre reprise par une requte SQL ( titre de relation
intermdiaire) en remplaant ainsi la variable du type table qui nexiste pas en SQL.
Ainsi,onaura:
SELECT V.article
FROM VenteImportante V ; -- VenteImportante est une vue
Lextension dune vue peut tre affiche par une consultation de la vue et sans
spcification du prdicat WHERE. La vue est aussi dynamique, puisque toute mise
jourserarefltedanslavueaussittquelleestrecalcule.Lanotiondetabletemporaire
delanormeSQL92estdiffrentedelavue,puisquilsagitdunevritabletableinscrite
dynamiquement dans le schma et qui nest pas actualise par les mises jours
subsquentes.Elleestdoncainsidiffrentedelanotiondesnapshotquiestuninstantan
destablesetquipeuttremisjour.
Pourcrerunevue,lutilisateurdoitnormalementavoirlesdroitsdelectureetdemise
joursurlaoulestablesdebaserfrencesdanslavueetavoirleprivilgesystmede
crerdesvuesdanssonschma.Toutefois,unutilisateurautoriscrerdesvuespeut
le faire mme sil na pas les droits daccs sur les tables de base dont il nest pas le
propritaire.CetteoprationestpossibleaveclaclauseCREATEFORCEVIEW.
LatableVentespeutnepastreencorecreaumomentdelaformulationdecettevue.
Fonctiondagrgationdansunevuerelationnelle
Une vue dfinie avec une fonction dagrgation (ex. SUM()) doit aussi dfinir un alias
essentielpourrfrerlavaleuragrge.Unetellevuenepermetpaslamisejour.
CREATEVIEWventePopas
SELECTarticle,SUM(qte)AStotal
FROMVentes
WHEREqte>4;
Variabledetable
Il en est autrement avec la variable du type table que certains langages implmentent.
Lexemplecidessous,illustrelestockagedursultatdunerecherchedansunevariable
detableetsarutilisationdansuneautreexpressiondulangage:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 156
(vuerelationnelle)
G_transactions=(SELECTVentes.articleFROMVentes);
Select G.article
FROM G_transactions G ;
Linconvnientmajeurdecetteapprocheestlecaractrestatiquedelavariabledetable.
Une application qui utiliserait cette variable na pas lassurance davoir accs aux
derniresmisesjourfaitessurlaBD.Eneffet,seuleslesrelationsdebasesontmises
jour et les modifications ne sont pas propages aux variables de table. La vue est
similaireunevariabledetable,ladiffrencequelatablecorrespondantlavueaune
vie phmre et est recalcule chaque fois que celleci est rfrence par une clause
SQL.Linstantanseraaussisimilaireunevariabledetable.Linstantanmatrialiset
synchronis pour la mise jour correspond une variable de table mais dont le
contenuestfidlelabasededonnes.
8.14Droitsdaccsetcontraintepourlecalculdunevue
Lexpression de la vue par une sousrequte permet de reflter ltat rel de la BD au
moment de son excution. La vue tant un objet du schma de la BD, elle a des
privilgesdaccs,dinsertion,desuppressionetdemodificationcommepourtoutetable
delabase.
CREATE VIEW VentesRecentes as
SELECT * FROM Ventes
WHERE date > To_Date('01-jan-1995',DD-MON-YYYY);
Ainsi, un usager Paul qui nest pas le propritaire de la vue peut cependant lutiliser
pour avoir accs aux ventes enregistres aprs le 1 janvier 1995. Il doit auparavant
obtenirdupropritairedelatableledroitdeslectionquecedernierformuleraainsi:
GRANTSELECTONVentesRecentesTOPaul;
LusagerPaulpeutdornavantutiliserlavueVentes_Recentespoureffectuerseulement
desslections.
Peutilfaireuneinsertionconcernantuneventede1996?Ilnepeutlefairequesilale
privilgedajout(insert)surlavueVentes_Recentes.Ceprivilgeluiestaccordparla
clauseGrant.
GRANTINSERTONVentesRecentesTOPaul;
Peutilalorsaussiajouteruntuplepourenregistrerunetransactionde1994mmesila
vuenerfrencequelestuplesde1995?Oui,carleprdicatdunevuequalifielestuples
quipeuventtreslectionnsetnecontraintpaslestuplesquipeuventtreajouts,sauf
siloptionCHECKOPTIONestexplicitementinsredanslexpressiondelavue.Dans
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 157
cecas,loprationrsultantsurlestablesdebasenesteffectuequesileprdicatdela
vuenestpasinfirmparcelleci.
Pour accepter que les transactions ajoutes par Paul se limitent lanne 1995, il faut
modifierlexpressiondelavue:
CREATE view VentesRecentes_ajout as
SELECT * FROM Ventes WHERE date >'01-jan-95'
WITH CHECK OPTION;
Cette dernire option va lancer une vrification du prdicat de la vue et cela, pour
chaquetupleajoutparPaul.Encasdchec,letupleserarefusparlesystme.Comme
la vue est exprime par une requte ou une expression SQL, il est possible dexploiter
toutefonctionSQLdisponibleafindeformulerunprdicatcomplexe.Parexemple,pour
bloquer toute transaction infrieure 5.00$ effectue avant la date du jour, il suffit de
formulerlavueainsi:
Ensuite,ilfautaccorderlesdroitsdeslectionetdinsertionPaul:
GRANTSELECT,INSERTonVentes_courantestoPaul.
SileDBAdsirelimiterlusagedecettevueaulundi,ilformuleraalorslavueainsi:
LajoutduntupleparPaulneseradoncautorisquesiloprationestfaiteunlundi.Il
faut souligner que ces vrifications sont faites en ligne et que la contrainte de vue est
gnralementgardedanslaZMP.
SuppressiondelavueenSQL92
Poursupprimerunevue,ilfautentrelepropritaire:
DROP VIEW <nom_vue> {RESTRICT | CASCADE};
Loption RESTRICTchoue si la vue est aussi utilise par une autre vue ou une autre
contrainte. Il y a alors une dpendance de vue qui bloque la suppression tant quelle
subsiste dans la base de donnes. Quant loption CASCADE, elle supprime la vue et
touteautrevueoucontraintelarfrenant.Leffetdecascadesepropagedanslachane
dedpendancesdelavue.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 158
Suppressiondesprivilgessurlavue.
Il est aussi possible de supprimer les privilges lis une vue sans pour autant
supprimerlavueellemme.
Patricia(Select)
VueVentes99
Figure8.16
Patricianepeutpastransmettresonprivilgedeslectiondautresusagerspuisquelle
napaslautorisationdelefaire(sansGRANTOPTION).Silonsupprimeleprivilgede
Patricia,aucunautreusagernesttouchparcetteaction:
REVOKE SELECT FROM Patricia;
Parcontre,Sylvainaleprivilgedepropagersespropresprivilgesdautresusagers.
La suppression de son privilge dinsertion est automatiquement propag aux usagers
dontlemmeprivilgedpenddeceluideSylvain:
REVOKE SELECT FROM Sylvain;
Lasuppressionduprivilgeprendeffetseulementlorsdelaprochaineouverturedela
base de donnes par lusager vis. Sil est en ligne au moment de la suppression du
privilge,ilneperdpasillicolaccsauxobjets!
8.15ModificationdelaBDtraversunevueSQL
Supposons les relations de base dfinies par les schmas de relation Employe et
Departement. La cl trangre, noDep, permet de relier les deux tables et donc
deffectuerdesjointures.Parexemple,ilestpossibledeconnatretouslesemploysdu
dpartementd2.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 159
Ce tuple est invisible et redondant dans Vue2 malgr son association une personne
diffrente. La Vue3 est simple et correspond une projection de la table Employe. Les
vuesVue2etVue3sontpluscomplexesetcorrespondentdesjointuresdetables.
Les deux relations suivantes ont les attributs suivants comme cl primaire: nas et
noDep.Lesvuessontdfiniespardesexpressionsalgbriquesquicorrespondentdes
tablesvirtuellescalculeschaquefoisquuneapplicationfaitrfrencelavue.Lavue
refltedoncltatdelaBDaumomentdesoncalculoudesamatrialisation.
Expressionalgbriquedesvues
La vue relationnelle est exprime par une expression algbrique qui est value
seulementaumomentdelexcution.Avecunlangagededonnesdeplushautniveau
commeleSQL,lavueseraformuleparuneclauseSQLstockedansledictionnairedes
mtadonnesquiseraaussivalueseulementlorsdelexcution.Ainsi,lextensionde
lavuerefltetoujoursltatactueldelinstancedelaBD,quiapeuttretmisejour
depuisladernirematrialisationdelavue.
Vue1:nas,salaire(employe)<projection,relationdebase
Vue2:nas,nom,site((nas,nom,noDep(employe)|x|departement)
Vue3:nom,site((nom,noDep(employe))|x|departement)
Examinonsenpremierlavuelaplussimple,soitlavueVue1.Ellecorrespondunsous
ensemble dune seule relation de base. Les vues Vue2 et Vue3 ont chacune un schma
composdattributsprovenantdeplusieursrelationsdebase.Supposonsquelesdroits
daccs pour la lecture et pour la mise jour soient accords aux propritaires de ces
vuespoureffectuerlesoprationscidessous.Rappelonsaussiquelinsertionsefaitau
moyendunseulordreDMLdinsertion.
Usager1
ParlentremisedelavueVue1,modifierlesalairedelemploydontlenasest21pour
que son salaire soit maintenant 20 K$. La mise jour peut tre effectue parce que le
SGBD peut identifier (procdure unique pour le trouver) dans une relation de base et
sans ambigut le tuple mettre jour. On dit alors que cette vue est modifiable ou
updatable.DanslapplicationlordreDMLestlesuivant:
Updatevue1setsalaire=20K$WHEREnas=21;(aveclavue)
LeSGBDpeuttransposercetteoprationdemisejourparlentremisedelavueenune
procdure interne sur les relations de base, laquelle peut effectuer sans ambigut la
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 160
modification demande. Cette procdure interne doit tre compose dordres DML de
mmenaturequeceluidelaprocdureexterne(i.e.leDMLutilissurlavue).
OrdreinterneexcutparleSGBD:
UpdateEmployesetsalaire=20K$WHEREnas=21;(avecunetabledebase)
Un seul tuple sera mis jour conformment lintention de lapplication, soit celui
identifiparlenas21danslarelationdebaseEmploye.Lamisejourtraverscettevue
seradoncpossible.
Usager3
ParlentremisedelavueVue3,fairelajoutdutuple:(28,denis,Hull).
InsertINTOVue3VALUES(28,denis,Hull);
Pourlapplication,unseultupledoittremisjouretlamodificationdelextensiondoit
pouvoirsereflterdanslesrelationsdebase.
LaprocdureinterneexcuteparlenoyauduSGBDseraitlasuivante:
InsertINTOEmployeVALUES(28,Denis,null,null);
InsertINTODepartementVALUES(null,Hull);
Cet ajout viole cependant une contrainte fondamentale dumodle relationnel, savoir
quelacldelatableDepartementnepeuttrenulle.Pourviterceproblme,lesystme
devra interdire cette mise jour. La Vue1 correspond une jointure des relations de
base, mais elle ninclut pas les cls primaires des deux relations intervenant dans la
jointure.Cestuneconditionsuffisante,maisnonncessairepourexclurecetypedemise
jourparlentremisedunevue.
Usager2
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 161
AveclaVue2,effectuerunemodificationpourreflterlefaitquelemployeaudreyde
Qubec travaille maintenant Montral. Selon la vue Vue2, il y na quune seule
personnenommeAudreyquidevraitfairelobjetdelamisejour,soitunseultuple:
UPDATEVue2setsite=MontralWHEREnom=Audreyandsite=Qubec;
UPDATEEmployesetnoDep=
(SELECTnoDepFROMDepartementWHEREsite=Montral)
WHEREnom=AudreyandnoDepin
(SELECTnoDepFROMDepartement
WHEREsite=Qubec);
La procdure interne est compose dun seul ordre DML du mme type constitu des
constantes de lexpression fournies par lapplication. Leffet net modifiera deux tuples
dans la table de base! Ainsi, lapplication anticipe une seule mise jour et deux sont
ralisesdanslestablesdebaseparleSGBD!Quenestilmaintenantsiletupledemise
jour spcifie que Audrey du dpartement d1 (Qubec) travaillera maintenant
Montral?Danscecasparticulier,larelationdebasepourratremisejourseulementsi
Vue2 est enrichie du numro de dpartement de la relation Departement. Il nest
cependantpaspossibledegnralisercecas.
TraitementdunerequteSQLrfrantunevuerelationnelle
UnerequteSQLavecunerfrenceunevuepeuttretraitesoitparsubstitution,soit
par matrialisation. La vue est dfinie par son expression SQL stocke dans le
dictionnairededonnessousformedunechanedecaractres.
8.16Matrialisationdunevue
Danscertainscas,lexcutiondunerequteavecunevueestimpossibleparsubstitution
etcela,pourdesraisonssyntaxiques,maiselleledevientaveclamatrialisation.Voicila
BDFPFcomposedestroisrelationssuivantes:
Fourn(noF*,nomF,cote,ville)
Piece(noP*,nomP,couleur,poids,ville)
FournPiece(noF*,noP*,qte
o noflenumrodufournisseur
noPlenumrodelapice
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 162
LavueSQL:
CREATEviewP_QTEas
SELECTSUM(FP.qte)asqteTot<alias
FROMFournPieceasFP
GROUPBYFP.noP;
LeschmadelavueP_QTEestlesuivant:P_QTE(qteTot).
SoitlarequtesurlavueP_QTE:
SELECTAVG(qteTot)asmqp
FROMP_QTE;
Larponseattendueaunschmacomposduseulattributaliasmqpquireprsenteune
moyenne numrique. Si le SGBD procde uniquement par substitution, la requte
obtenue sera refuse par plusieurs SGBD, en raison de limbrication des fonctions
dagrgation:
SELECT#p,AVG(SUM(FP.qte))asmqp<imbricationauniv.1
FROMFP
GROUPBYFP.noP;
Toutefois,lammerequteseraacceptesileSGBDutiliseunematrialisationdelavue.
Lecalculdelavuedonneunerelationintermdiairetemp1:
MatrialisationdelavueenOracle
LesversionsrcentesdysystmeOracleautorisentlamatrialisationdelavueaumoyen
dune commande DDL particulire. Ce mcanisme est similaire linstantan avec ou
sans mise jour. Pour crer une vue, il faut avoir les privilges CREATE
MAERIALIZEDVIEW,CREATEDIMENSIONetQUERYREWRITE.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 163
CreateMATERIALIZEDviewSalaresMoy
neverrefreshourefresh(misesjourexclues)
enablequeryrewriteautoriseloptimisation
asSelectnom
FromEmpl
Wheresalaire>30000andsalaire<60000;
A la premire rfrence cette vue, elle sera matrialise de sorte que lextension
correspondantesoitdisponiblelorsdestraitementssubsquents.Cettevueexisteaudel
du COMMIT de la transaction qui a lanc sa cration. Une vue matrialise est aussi
appeleSnapshot.
Droitdaccsauxtuplesdelavuerelationnelle
Pourtraiterlesdonnestraversunevue,ilfautquelapplicationaitdesdroitsdaccs
auxtablesetquelesmanipulationsneviolentpaslescontraintesdintgritdfiniessur
lestablesdebase:
a) En lecture, lopration est ralise si lusager a les droits de lecture sur toutes les
relationsdebasefournissantdesattributslavue.
b) En mise jour, lusager doit avoir les droits de lecture et de suppression sur les
relationsdebasefournissantlesattributslavue;lamisejourtanttraitecommeune
suiteatomiquedunesuppressionetdunajout.
c) En mise jour, les contraintes dintgrit actives quant la BD ne peuvent pas tre
violesdanslesrelationsdebaseaprsloprationdemisejour.
d) Si la vue est dfinie sur une seule relation de base et quelle inclut la cl de cette
premiresansautrefonction,alorsilestpossibledajouter,desupprimeretdemodifier
untupledelavuesanscrerdambigut.
Cette condition est difficile faire vrifier par le SGBD autrement quen lui faisant
validersystmatiquementlesvuesdansledictionnaire.Siunutilisateuraleprivilgede
crerdesvues,ilpeutlefairelibrementaveclesrelationsauxquellesilaaccs.LeDBA
devraitilautoriserlesvuesaupralableetinterdirelesmodificationssubsquentesnon
contrles? Si une telle approche tait adopte, seraitelle perue comme un obstacle
danslesoprationsquepeuteffectuerunutilisateursurlesdonnes.
Misejourtraversunevueincluantunefonction
Si la vue comprend une fonction de groupement, dagrgation, arithmtique ou de
chane,lamisejourestinterdite.Eneffet,toutemodificationdelinformationobtenue
par la fonction ne peut pas tre transpose de faon approprie dans les relations de
base.Ilestcependantpossibledinterrogervolontcettevue(readonlyview).
Lalectureparlentremisedunevueneposepasdeproblme,sicenestgnralement
celuidelinterprtationdestuplesaffichs,enparticulierencequiconcernelersultat
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 164
Sur le plan thorique, certaines vues peuvent tre utilises pour la mise jour, tandis
quedautressontproscrire15.Ilyadonccertainesvuesquisontindsirablesencequi
concerne la mise jour et que ladministrateur de la BD devrait reprer par une
validationdesvuesproposesetaubesoinenrichirdemanirece quelesoprations
demandes par les usagers puissent tre excutes correctement. Cest cependant une
solution au cas par cas qui nest pas acceptable dans un contexte dexploitation le
moindrementdynamique.
CrationdesvuesavecSQL(ordreDDLdeSQL)
La cration dune vue consiste dfinir lexpression SQL correspondante qui dans
certainscastientlieudepseudovariabledetable.
Exemples:
Vue1:Lesnas,nometsitedesemploysquitravaillentdansundpartement.
nas,nom,site(( nas,nom,noDep(Employe))|x|Departement):
CREATE [REPLACE] VIEW vue1 AS
SELECT nas, nom, site
FROM Employe [as] E, Dpartement [as] D
WHERE E.noDep = D.noDep;
Vue2:Lenometlesitedesemploysquitravaillentdansundpartement.
nom,site((nom,noDep(Employe))|x|Departement)
CREATE [REPLACE] view vue2 as
SELECT nom, site
FROM Employe[as] E, Departement [as] D
WHERE E.noDep = D.noDep;
Vue3:Lenasetlesalairedesemploys.
nas,salaire(Employe): <relationdebase
CREATE [REPLACE] view vue3 as
SELECT nas,salaire
FROM Employe;
Cesexpressionsdevuerelationnellesontstockesdansledictionnairededonnesdela
base. Voici une base compose de deux taables qui dcrit le lieu de travail des
personnesquisontenmnage.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 165
Menage(conjoint,conjointe)LieuTrav(nas,nom,ville,salaire)
ChaqueattributdeMnagepartagelemmedomainesmantique,soitlenasdechaque
personne.Ledomainedesautresattributsestsuggrparleurlibellrespectif.
Lesdomainessontdonclessuivants:
conjoint dnas
conjointe dnas
nas dnas
salaire dentier
nom STRING(varchar(40)) domainesyntaxique
Vue4:Lenometlesalairedesconjointesdontlesalaireestsuprieur25000$.
CREATE view vue4 (nom_conjointe, salaire) as
SELECT nom, salaire
FROM Menage [as] M, Lieu_travail [as] L
WHERE M.conjointe = L.nas and L.salaire > 25 000;
Vue5:Lenomdesconjointsquiontunsalairegalceluideleurconjointe.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 166
Comme il nest pas possible de dfinir des relations temporaires en SQL, les vues
servirontcettefin,carellespeuventtreinterrogescommesiellestaientdestables
de base. La vue cidessous permet de trouver linformation ayant trait aux conjoints:
conjointe,sonsalaireetlavilledesondomicile.
Demmepourlaconjointe:
CREATE view vue5.2 as
SELECT conjoint, conjointe, salaire, nom
FROM Menage [as] M, Lieu_travail [as] L
WHERE M. conjoint = L.nas;
ouplusdirectement:
SELECT conjoint[as] nas-conjoint
FROM vue5.1 [as] X, vue5.2 [as] Y
WHERE X.conjointe = Y.conjointe and X.conjoint = Y.conjoint
and X.salaire = Y.salaire;
Vue6:Lesconjointesetlelieudeleurtravailpourcellesquitravaillentdanslamme
villequeleurconjoint.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 167
SELECT conjointe
FROM vue6.1 [as] X, vue6.2 [as] Y
WHERE X.conjoint = Y.conjoint and
X.conjointe = Y.conjointe and X.ville = Y.ville;
ouplusdirectement:
SELECT conjointe [as] nas_conjointe
FROM vue6.1 [as] X, vue6.2 [as] Y
WHERE X.conjoint = Y.conjoint and
X.conjointe = Y.conjointe and X.ville = Y.ville;
Vue7:Lavilleetlamoyennedessalaires,lepluspetitetlasommedessalaires.
a)Lechangementdetypepourlesattributsspcifisdanslesrelationsdebase.
b)Lamodificationdesdroitsdaccsauxtablesdebase.
Avec SQL, une mise jour est possible par lentremise dune vue si, et seulement si,
touteslespropositionscidessoussontvalides:
a) Lexpression de la vue est une clause SELECT qui ne contient pas les mots cls
suivants:JOIN,UNION,INTERSECT,EXCEPT(sauf);
b)LaclauseSELECTnecontientpaslemotcldistinct.ChaqueattributduSELECTfait
unerfrencesimpleunecolonnedelatable(sansfonction);
c)IlyauneseuletabledanslaclauseFROM,doncpasdejointure;Latablerfrence
danslaclauseFROMestunetabledebaseouunevuedemisejouracceptable;
d)LexpressiondelavueninclutpasunWHEREavecunesousrequtequiserapporte
aussilammetable(autojointureinterdite);
e)LexpressiondelavuenapasdeGROUPBY;
f)LexpressiondelavuenapasdeHAVING.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 168
Il est donc possible de faire une mise jour trs limite dans une BD par lentremise
dunevuerelationnelle(incluantlasuppressionetlajout).
8.17Instantan
Le concept de linstantan ou snapshot est intressant parce quil permet de garder
facilementuneimagedelaBD.Cetobjetestunetablequireflteltatduneautretable
de base ou dune vue relationnelle un moment donn et, au besoin, les mises jour
subsquenteseffectuessurlatabledebase.Cemcanismeestutileparcequilpermet
de conserver localement une copie dune table distante qui est mise jour
priodiquement et automatiquement. Cest une notion apparente celle de la vue
matrialise.
CREATESNAPSHOT<schma><nomsnapshot>
REFRESH [FAST |COMPLETE | FORCE] START WITH <date> NEXT <date>
FORUPDATEAS<sousrequte>;
Lemodederafrachissementduninstantandterminecommentserafaitelacquisition
des mises jour effectues sur la table de base (locale ou distante), soustendue par la
dfinitiondelinstantan.
Lesmodespossiblessont:
FAST:lamisejourestincrmentielleeteffectuepartirdunjournaldetablespcial
cr et associ la table de base laquelle estreli linstantan. Le journal de table est
crparlacommandesuivante:
Exemple:CREATESNAPSHOTLOG<schma.><table>;
COMPLETE : la requte du snapshot est rexcute la date prvue par le
rafrachissement.
FORCE:unFASTsicelaestpossible,sinonunCOMPLETE(cas:absencedujournalde
table).
LemomentdelamisejourdelinstantanestcontrlparlaclauseSTARTWITH.Il
est aussi possible de lancer une procdure utilitaire pour dmarrer immdiatement le
rafrachissementdelatable.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 169
CREATESNAPSHOTOuvrier_Exp
PCTFREE10PCTUSED100
TABLESPACETS_utilisateur
REFRESHFASTONCOMMITASSELECT*FROMT1WHEREage>50;
LamisejourdunetabledebaserfreparuninstantanFASTestfaiteaumoment
spcifi dans la clause REFRESH soit chaque commit. Cette mise jour est ralise
partirdunjournalspcialassocilatabledelinstantan.
2 Misejour
1
3 Ajoutduntuple
Misejourdelinstantan
Figure8.21a
Avec les versions plus rcentes, par exemple Iracle 9i, la notion dinstantan est
remplaceparcellequivalentedevuematrialiseouvueconcrte.
Exemple:Lavuematrialiseseramisejourdans15jourscompterdeladatedesa
cration.
CREATEMATERIALIZEDVIEWOuvrier_Exp
REFRESHFASTNEXTSYSDATE+15AS
SELECT*FROMT1WHEREage>50;
8.18LangageprocduralPL/SQL
Lajout des dclencheurs et des procdures stocks dans une base de donnes
relationnelleafaitapparatrelancessitdavoirunSQLenrichidotdesstructuresde
contrlecommunesauxlangagesprocduraux.LapropositiondelasocitOraclepour
laspcificationdestriggersconsistedonneruncaractreprocduralSQL*Plusdans
le cadre du langage PL/SQL16. Ce langage implmente la procduralit permettant
ainsi une manipulation trs souple des tuples des tables de base. Ce langage peut tre
utilisdiversesfins:crituredesdclencheursdeDeveloper,crituredesprocdures,
desfonctionsetdespackagesinternesquisontexcutsautomatiquementousurappel
parlenoyauduSGBD.
PrincipalescaractristiquesduPL/SQL
LePL/SQLestunlangageprocduralquitendlapuissancedetraitementduSQL.Ilest
portable lintrieur de la gamme de produits dOracle. Ainsi, un concepteur peut
mettre au point une requte SQL complexe avec linterprteur interactif et ensuite
linsrer dans un dclencheur ou dans une application en L3G sans y apporter de
changementmajeur.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 170
LelangagePL/SQLaunestructuredeblocaveclesstructuresdecontrlehabituelles:
les affectations, les alternatives, les itrations et les appels aux procdures, fonctions et
packages. Toutes les clauses SQL*Plus peuvent tre insres dans un bloc PL/SQL.
Chaqueblocestexcutparlenoyaucommeunetransactionindivisible.Lesprocdures
SQLsontstockesdansleserveuretsontappelesparundclencheurouparunautre
bloc.EllespeuventaussitreexcutesenligneaveclesystmeSQL*Plus.
BlocPL/SQL
UnblocestnommsilaclauseBEGINesttiquete,sinonilestditblocanonyme.Les
clausesdulangagequisontadmissiblesdansunblocsontlessuivantes:
Lesvariables,lesconstantesetlescurseurssontdclarsdansunesectionspcialedu
blocidentifieparlemotclDECLARE.
Laffectationsefaitparvaleuretnonparrfrence(parpointeur).
LastructurederecherchealternativeestimplmenteparleIF......ENDIF.Chaque
lmentdelalternativepeuttreformdunblocPL/SQL.
Litrationestimplmenteparquelquesstructures:FOR,LOOPetWHILE.
Lesfonctionsarithmtiqueshabituellessontpermises.
Le branchement inconditionnel autoris par lusage dune tiquette place entre
guillemetsfranais:<<label>>.
[DECLARE]
Dclarations des variables, constantes, exceptions et curseurs
htes
BEGIN
ClausesSQLetPL/SQL(lembotementdesblocsestpossible)
[EXCEPTION]
Traitementdesexceptions
END;
Figure8.22
SectionDECLAREdublocPL/SQL
Cette section contient la dclaration des variables du langage hte et des constantes.
Voiciquelquestypesdisponibles:NUMBER,CHAR,DATE,BOOLEANetRECORD.Le
typepeuttrespcifiparunattributduschmadelaBD:attribut%TYPE(parexemple
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 171
erreur5EXCEPTION;/*dclar.labeldelexception*/
BEGIN
OPENRecherche;ouvertureducurseuretcalculdelaclause
WHILERecherche%FOUND
FETCHRechercheINTOnom,taux;
IFtaux>20THENRAISEerreur5;
ELSE
UPDATEEmplsettauxH=tauxH*1.05WHERE
CURRENTofRecherche;
ENDLOOP;
CLOSERecherche;
EXEPTION
WHENerreur5THEN...
END;
Figure8.23
SectiondetraitementdublocPL/SQL
Cette partie de la procdure contient les noncs de traitement selon la syntaxe de
PL/SQL.LesclausesPL/SQLcomprennenttouteclauseSQLetlesstructuresdecontrle
standards pour lalternative, la rptition et laffectation. Le traitement manipule des
donnes de la BD et en permet le stockage dans une table de base ou dans une table
temporaire existante ou cre par la procdure. Le langage na pas dordre daffichage
direct. Les donnes obtenues par une clause SELECT doivent tre places dans des
variablesPL/SQL.
Affichageauterminalpourdesfinsdemiseaupoint
Il est possible dutiliser une procdure dun package pour un affichage (lecture)
lmentaireauterminal/stationclient.CetteoprationestimplmenteparleSGBDen
crantunpipeentrelaprocdureetleSGBD.Lesdonnesplacesdanslepipepeuvent
tre lues et affiches au terminal standard de sortie par un autre appel au package
DBMS_OUTPUT.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 172
PourlaffichagecorrectilfautactiverleparamtreSERVEROUTPUTON.
SQL>SETSERVEROUTPUTONdanslecontextedumoduleSQL*Plus
Lesprocduressontlessuivantes:
DBMS_OUTPUT.PUT_LINE(exp|constante|attribut)
DBMS_OUTPUT.GET_LINE(var_PL/SQL)
Remarquesurlasyntaxedesvariables
ToutevariabledunblocPL/SQLquinestpasunattributspcifidansledictionnairede
la BD, et qui est une variable PL/SQL de rception de donnes dans le FETCH et le
SELECT INTO, doit ce titre, tre dclare dans le bloc PL/SQL considr comme le
langagehte.Cependant,ilnefautpasprfixerunetellevariableparlesdeuxpoints(:),
carleblocPL/SQLestexcutpar leserveuretlesvariablesPL/SLQsontdclareset
connuesaumomentdelexcutiondelaclauseSQL.
DECLARE
articleCHAR(3);
qteVentes.qteTot%TYPE;
bonus NUMBER:=0;initialisation
BEGIN
SELECTVentes.article,qteTotINTOarticle,qtecurseurimplicite
FROMVentesWherenom=Jacques;1seultupleattendu
bonus:=10;
INSERTINTOACHAT_JACQUESVALUES(article,qte,bonus);
EXCEPTION
WHENNO_DATA_FOUNDTHEN
RAISE_APPLICATION_ERROR(20400,pasdetupletrouv);
END;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 173
WHENtauxNulTHENINSERTINTO...;
END;
Ce bloc est transmis par la stationclient au serveur et lerreur 20200 sera apparie
lexception tauxNul et sera lobjet du traitement associ et dfini par lapplication en
remplacementdeceluiprvuparOraclepourcesexceptionsutilisateurs.
VariablehtedeslangagesL3G
Toute variable utilise dans une clause SQL qui nest pas un attribut ni un nom de
relationestunevariablehteetdoittredclaredanslaprocdureoulebloc.Dansle
casdeSQLFORMS,lavariableseraprfixepar:pouridentifierunchampdelaforme.
CestainsiquelinterprteSQLestinformquilsagitdunevariabledulangagehte,
en loccurrence le C. La structure itrative dune procdure PL/SQL se manifeste sous
plusieursformes:LOOP,FOR,WHILE,...etavecunesyntaxerelativementsimple:
Exemple
DECLARE
compteurNUMBER(3,0):=0;
BEGIN
LOOP
INSERTINTOTempVALUES(compteur,ok);
compteur:=compteur+1;
IFcompteur=100THEN
EXIT ouEXITWHENcompteur=100;
ENDIF;
ENDLOOP;
END;
Figure8.24
BoucleFOR
UneboucleFORpermetderpterlexcutiondunblocdnoncsunnombredtermin
defois.
FOR<indice>IN[REVERSE]<n1>..<n2>LOOP
<listednoncs>
ENDLOOP;
Lindiceestunevariablelocalequiprendchaquevaleuruneseulefois,soitdanslordre
croissant, soit dans lordre inverse. La valeur initiale est n1, la valeur finale incluse est
n2.Lindicenapasbesoindtredclar,pardfautilestdutypeNUMBER.Lindicene
peut pas prendre une nouvelle valeur dans la boucle par affectation, mais peut tre
utilisdanslesexpressionsdelaboucle.
Notezquilnyapasdevaleurdincrmentdanslaclause.Ellepourraittresimulepar
lafonctionMOD(nb,k)excutedanslecorpsdelitration.Parexemple,pourinsrer
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 174
un tuple dans la table Temp chaque 5 tuples des 50 fournis par lusager, il suffira
dutiliserladivisionparMODULO5.
DECLARE
nomCHAR(45);
...
FORkin5..50LOOP
nom:=&nom_i;nomfournirinteractivement
age:=&age_i;idem
matricule:=&matricule_i;idem
IFMOD(k,5)=0THEN
INSERTINTOTempVALUES(matricule,nom,age);
ELSENULL;
ENDIF;
ENDLOOP;
END;
Figure8.25
CeblocSQLanonymecomportedesparamtresprfixsparle&quiprsupposequil
estexcutdanslenvironnementdeSQL*Plus.
SectiondesexceptionsdublocPL/SQL
En PL/SQL, le traitement des erreurs (les exceptions) est gr par des exceptions
prdfinies ou par celles spcifies par une application (RAISE erreur5 ). la fin du
traitement de lerreur, le traitement se poursuit avec linstruction qui suit
immdiatement le bloc courant. Lexemple cidessus illustre le traitement dune erreur
nommeerreur5.
BEGIN
IFqte>99THENRAISEerreur5;
...
ENDIF;
IF...THEN
ENDIF;
EXCEPTION
WHENerreur5THEN
RAISE_APPLICATION_ERROR(21400,ERREUR);
...<reprisedutraitementavecleblocsituaprs
celuidelexceptionlibelleerreur5
...
END;
Figure8.26
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 175
ExempledunblocPL/SQL
Ceblocnutilisepasdecurseur.Ildoitdonctraiterunseultuple,sinonilyauraerreur
du type en activant lexception TOO_MANY_ROWS. Cette exception est lune parmi
plusieurs prdfinies. Pour traiter plusieurs tuples, il faudrait utiliser un curseur. Par
exemple, la recherche du tuple dcrivant la transaction de vente faite par le client
Tremblay permet de trouver son numro de client et de la placer dans une variable
num_empl du mme type que celui dclar dans le dictionnaire de BD pour lattribut
noEmpl.SiplusieurstuplessonttrouvsaveclecritreTremblay,ilyauneerreuret
celleciesttraiteparlesegmentEXCEPTIONquiinscriraunindicateurspcialdansla
tableTempetvalideralopration.
Exceptionsprdfinies
Parmi ces exceptions prdfiniesmentionnons : TOO_MANY_ROWS,
NO_DATA_FOUND,
INVALID_CURSOR, etc. Voici un exemple dune procdure PL/SQL duneapplication
dans laquelle il y a vrification du nombre de tuples retourns dans la rponse une
clauseSELECT.
DECLARE
salaire_empl number(5,2);
num_empl Empl.noEmpl%TYPE;typecopiduDD
erreur2 EXCEPTION;
BEGIN
SELECTnoEmpl,salaireINTOnum_empl,salaire_empl
FROMEmplWHEREnom=Tremblay;
IFsalaire_empl>100000THENRAISEerreur2;
INSERTINTOTempVALUES(num_empl,numerodetremblay);
DELETEFROMEmplWHEREnom=tremblay;
...
EXCEPTION
WHENerreur2THENINSERTINTOMSG_PILEVALUES(aucunTremblayriche);
WHENTOO_MANY_ROWSORNO_DATA_FOUND
THENINSERTINTOMSG_PILEVALUES(aucunortropderiches);
WHENOTHERSTHENNULL;
END;
Figure8.27
LexceptionTOO_MANY_ROWSestprdfiniedanslelangagePL/SQLetnadoncpas
tredclaredansleblocPL/SQL.
DautreserreursprdfiniessontaussiutilesaveclePL/SQL:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 176
CURSOR_ALREADY_OPEN INVALIDE_CURSOR PROGRAM_ERROR
TIME_OUT_ON_RESOURCE LOGIN_DENIED NOT_LOGGED_IN
Ces blocs PL/SQL sont utiliss dans le contexte de SQL*Plus. Il peut tre aussi
implmentcommedclencheurdeBDetdeFORMS.Auquelcas,lesclausesCOMMIT
et ROLLBACK sont inadmissibles, de mme que dans les procdures stockes dans le
dictionnaireduSGBD.
8.19Basededonnesractive
La base de donnes ractive est une fonctionnalit de systme implmente dans les
nouvellesversionsdeSGBD(DB2V2,Oracle,INFORMIX).
Application: Basededonnes:
Trigger
InsertintoX TableX
Delete X Trigger
where
UpdateX..set Trigger
Figure8.28
LeprcurseurenlamatirefutleSGBDSYBASE.Avecunetellebase,unvnement(E)
particulierseproduitlorsquunecondition(C)estvrifie.Ilendcouleimmdiatement
une suite dactions (A) qui sont implmentesavec le DML du systme ou un langage
procduralcommelePL/SQL.
LesrglesECAsontformulesavecunlangageprocduraldontlepouvoirdexpression
peuttreplusoumoinscomplexeselonlesSGBD.Parexemple,aveclesystmeOracle,
les vnements sont prdfinis et les conditions et les actions sont spcifies par le
langageprocduralPL/SQLutilispourlcrituredestriggers.AvecDB2,lelangageest
leC.
Lesvnementsdclencheursdfinisaupralable
Dansunebasededonnes,uneactiondinsertion,desuppressionoudemodificationest
unvnementquisepasseauniveaudelatableoudutuple.Demme,lasuppression
dunesuitedetuplesquivrifientunprdicatdeslectionestunvnementquialieu
auniveaudutupleouauniveaudelatable,selonlechoixeffectu.Lorsquelvnement
est pris en considration au niveau du tuple, une action peut tre dclenche
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 177
immdiatementaprsouavantchaquesuppressiondutuple.Parcontre,silvnement
est dclar au niveau de la table, une action ne sera dclenche qu la toute fin des
suppressions par lordre DELETE. Lorsquun vnement est dtect par le SGBD, une
autre condition peut tre formule pour contraindre davantage le dclenchement de
laction(WHEN).
Dfinitiondudclencheur(trigger)
Letriggercorrespondunelogiquedetraitementplusoumoinscomplexeimplmente
dans Oracle par une procdure PL/SQL qui est excute automatiquement lorsquun
vnement(E)commeuneinsertion,unemisejourouunesuppressionseproduitdans
unetabledelaBD.Unetelleprocdure(A)estappeleuntriggerdeBDparcequelleest
lie la BD et lance lorsque survient un vnement, et cela, indpendamment de
lapplication.LaprocdurelaplussimpleestcomposeduneclauseSQL,uneautreplus
complexecomprendraunouplusieursblocsPL/SQL.
Propritsdutrigger
UntriggerestdfiniuneseulefoisetestaccessiblepartouslesvnementsdelaBD;il
estrangauniveauduserveuretestnormalementactifpourtouslesutilisateursdela
BD.Surleplanconceptuel,ilcorrespondunefactorisationdeprocduresnormalement
lancesparchaqueapplicationpourassurerlacohrencedelaBD.Enramenantcellesci
laBD,onaugmentelaproductivitdesconcepteursetonaunemeilleuregarantiede
cohrence.
Unvnementquiactiveuntriggerestassociuneapplicationquiutiliseunerelation
delaBD,soitdirectement,soitparlentremisedunevuerelationnelle.Lacrationdun
triggerexigequelutilisateuraitleprivilgedecrerdestriggersetquilsoitpropritaire
des tables auxquelles il se rfre. Autrement, il doit avoir le privilge ALTER ANY
TABLE.
Unemmetablenepeutavoirquunseultypedetrigger,cestdirequilestimpossible
dedfinirdeuxtriggersAFTERINSERTpourunemmetable.Toutefois,ilpeutyavoir
plusieurs triggers du type diffrent par table, cestdire autant quil y a de
combinaisonsdetempsetdvnements.
(BEFOREINSERT),(BEFOREUPDATE),(BEFOREDELETE),
(AFTERINSERT),(AFTERUPDATE)et(AFTERDELETE).
Triggeretcontraintedintgrit
Un trigger est diffrent dune contrainte dintgrit dfinie dans un schma parce que
cettedernireestdaborduneassertiontoujoursvraieetsatisfaitedepuislinstantdesa
dfinition dans le schma. Une contrainte peut tre dsactive, mais en redevenant
activeellevalideratouteslesdonnes.Unecontraintedintgritestpardfauttoujours
active, sauf si elle est dsactive par la clause DISABLE. Lorsquune contrainte
redevient active, il faut que toutes les donnes dune relation satisfassent la contrainte
ractive.Elleest,paressence,rtrospective.Letriggerestcrltatactif,maisilpeut
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 178
tre dsactiv ou activ par la suite selon les besoins. Cest avec la commande ALTER
TRIGGER{Enable|Disable}quelestatutdutriggerestmodifi.Lorsquilestractiv,il
ne sapplique que sur les donnes qui seront ajoutes ou modifies partir de ce
moment.Letriggernesappliquedoncpasrtrospectivement.
UtilitdestriggersdeBD
LeurusageestmultipledanslagestionetlacohrenceduneBD.Ilsserventnotamment
calculer les attributs drivs, bloquer des transactions invalides, renforcer la
scurit, propager les mises jour dans une BD distribue, conserver un audit des
accs aux relations pour les statistiques, implmenter la rplication (ou duplication )
synchronedestableslocalesetcontrlerleseffetsdeladnormalisationdelaBD.
Crationduntriggerdebasededonnes
La cration dun trigger de BD se fait gnralement avec lditeur de SQL*PLUS. Ici, il
sagit du trigger T5 qui est lanc lorsquil y a une mise jour de lattribut ville dans la
table Usine et que linsertion est postrieure au 25 novembre 1994. Toute mise jour
dunautreattributdanslatableUsinenedclencherapasletrigger.
CREATETRIGGERD5AFTERINSERTOFvilleONUsine
WHEN(:new.dateEmbauche>To_Date(25111994,DDMMYYYY))
DECLARE
...
BEGIN
...(noncsSQLoublocPL/SQL)
EXCEPTION
...
END;
.<lepointterminelditiondubloccomposavecloutilSQL*Plus.Lancementparla
commandeSQPLPlus:Run.Sinon,ilfautterminerleblocparunebarreobliquedroite,
soit/.
Poursupprimeruntriggerdudictionnaire,ilsuffitdefairelacommandesuivante:
DROPTRIGGERT5;
Pourralisercetteopration,ilfaudraquelutilisateursoitleDBAouencorequilaitles
droitsdesuppressiondestriggers.
StructureduntriggerECA
Unestructuredetriggerestcomposedetroisparties:
Unvnementdclencheur(E):uneactionexternesurunetableousuruntuplequi
dclencheletrigger;parexemple,lajoutoulasuppressiondunoudeplusieurstuples.
Une condition de dclenchement (C) : cest une expression boolenne qui doit tre
valueTRUEpourqueletriggersedclenche,sinonsondclenchementestinhib;
Une action du trigger (A) : cest une procdure PL/SQL (cestdire un bloc PL/SQL
anonymeoupas,quinecontientpasuncommit,rollbackousavepoint).
CREATEORREPLACETRIGGERnom_triggerAFTERINSERTORUPDATEOF
attributONtableWHEN(conditiondedclenchement)
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 179
DECLARE
...
BEGIN
(actionsaveclesdonnes)
EXCEPTION
...
END;
/
Figure8.29
LetriggerdetablenesedclencheraquaprslafindunordreSQLdajoutoudemise
jourdunoudeplusieurstuples.LetriggerdetableestcaractrisparlabsencedeFOR
EACH ROW. Avant de lancer les actions du trigger, il y aura une vrification
supplmentaireduneconditiondedclenchementdontlaformulationreposesurunou
plusieursattributsduoudestuplesmisjour.
SuccsouchecduntriggerdeBD
Lorsquuntriggerestlancsurleserveuretquiseterminesanstraitementdexception,
ilestalorsexcutavecsuccsetlvnementquiladclenchsepoursuitcorrectement.
Silsagissaitduneinsertion,celaveutdirequelleestcomplte.Danslecascontraire,
uneexceptionestactiveetventuellementtraite(autrementqueparuneactionNULL)
et laction lorigine du dclenchement du trigger est automatiquement dfaite
(quivalent au ROLLBACK) par le SGBD. Le ROLLBACK est fait par la procdure
RAISE_APPLICATION_ERROR() du package DMS_STANDARD. noter quil ne peut
pasyavoirunROLLBACKexplicitedansleblocduntrigger.
TypedutriggerdeBD(portedutrigger)
DeuxtypesdetriggerspeuventtredfinisencequiconcernelaBD:
Trigger dnonc (DML statement trigger) : cest un trigger lanc une seule fois lors de
lexcution de lnoncDML qui touche une ou plusieurs tables. Cetype de trigger est
utile lorsque la nature de laction excuter ne dpend pas dune valeur dattribut du
tupleajoutouquiestdjprsent.Parexemple,lorsquilsagitdecalculerunenouvelle
moyennesurunattributdelatableTdanslaquelleilyadesajoutseffectusparunseul
INSERT,ilsuffitdecreruntriggerdnoncAFTERINSERTpourquelvnementde
findinsertiondclenchelecalculdelanouvellemoyenne.
Trigger de tuple (row trigger) : il sagit dun trigger excut autant de fois quil y a de
tuples insrer, modifier ou supprimer dans une table par un DML (FOR EACH
ROW).Danscecas,lanaturedelactiondutriggerdpenddelavaleurdunattributde
chaquetupleinsr,modifiousupprim.Unteltriggerpeututiliserlesvariables:new
et:old pour rfrer la nouvelle ou lancienne valeur. Un trigger peut tre activ au
temps BEFORE ou AFTER loccurrence de lvnement associ au DML. Si un trigger
AFTER choue et que lexception nest pas traite, alors il y a un rollback automatique
pourannulertouteslesactionsfaitessurlatableousurletupleparlordreDML.Voici
deuxexemplesdecrationduntrigger:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 180
CREATETRIGGERTR2AFTERINSERTONUsinesFOREACHROW
BEGIN...
... blocPL/SQL
EXCEPTION
...
END;
CREATETRIGGERTR1BEFOREINSERTORDELETEONUsines
BEGIN
...blocPL/SQL
END;
Figure8.30
Usagesdestriggersvnementiels
DanslecasduntriggerdutypeBEFORE,lactiondecetriggerestexcute,soitavant
lexcutionduneactionsurunetable,soit(avantlaction)surchaquetupledunetable.Il
estutilepourcalculerune(oudes)valeurpartirdestuplesexistants.Lavaleurcalcule
seraparlasuiteajoutedanslinsertioncomplterdanslatable.Cetypedetriggersera
aussiutilispourvrifiersilactionduDMLsurlatabledoittreamorceoucomplte
defaonviterdefaireunrollbackaprsquuneactionauratexcute.
Exemple : Une transaction est inscrite dans la table Contrats si le numro du certificat
dautorisationcorrespondaumontantducontrat.Ledclenchementseferapourchaque
ajoutoumodificationduntupledanslatableContrats:
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 181
WhenconfirmationTHENNULL;actioncomplte
WhenNO_DATA_FOUNDTHENNULL;exceptionprdfinie
WhenOTHERSTHENRaise_Application_Error(20600,erreurnontraite);
END;
ModledexcutiondestriggersduneBD
Comme une BD a plusieurs relations et que chacune peut avoir plusieurs triggers, le
SGBDdoitavoirunprotocoledexcutiondesdiverstriggersquipeuventtreassocis
aummevnementetquantlammetable.Voicilemodledetraitementdestriggers
parOracle:
1DbutexcutiondutriggerBEFOREdetable(1ertupletraiter);
2Pourchaquetupletraitparlordrecidessus
2.1excution,silestprsent,dutriggerBEFOREdetuple;
2.2 verrouillage de chaque tuple et vrification des contraintes dintgrit (verrou
maintenujusqulafindelatransaction);
2.3excution,siprsent,dutriggerdetupleAFTER;
3Excutiondetoutecontraintedintgritdiffre;
4ExcutiondutriggerAFTERdetable;
Siunedestapeschoue,leROLLBACKestimplicite(doncautomatique)lorsquilsagit
dun trigger de BD et une exception est communique lenvironnement du client.
LexcutionduntriggerBEFOREpeutentranercelledunautretriggerAFTERquisera
dclenchlorsdelarfrenceparletriggeroriginalBEFORE.Lederniertriggerlancest
celui de table AFTER et suit la vrification des contraintes dintgrit dfinies par le
CHECK.
Activationduntrigger
Par dfaut et juste aprs sa spcification par le DBA, un trigger est actif. Il peut
cependanttredsactivparlasuiteaveclacommandeALTERTRIGGERDISABLE:
ALTERTRIGGERVERIFMODELDISABLE;
ALTERTRIGGERVERIFMODELENABLE;
VariablesdecorrlationNEWetOLD
Avec un trigger de tuples, le dernier tuple touch par un nonc DML est dsign par
deuxvariablesdetupleappelesrespectivement:NEWet:OLD.Cesvariablessontdites
decorrlationparcequellespermettentdesereporterautuplecourantdanssonancien
tatoudanssonnouveltat.Lanouvellevaleur(new)quiaffecteunattributduntuple
(soitnew[.attribut]etlancienne(soitold[.attribut])sontrfrencesrespectivementpar
:new.quantite_vendueet:old.quantite_vendue.
InsertINTOTransporteur(mat,nom,vol)VALUES(f8,ailesdunord,25);
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 182
f8,ailesdunord,25
TableTransporteur:
:new f8, ailes du nord,
25
Figure8.32
Les deux points (:) prfixe une variable de corrlation, ils sont une directive au
compilateurdePL/SQLindiquantquelavariabletuple:newnestpasdclaredansle
blocPL/SQLetquilnefautpaschercherlatraduirepuisquellecorrespondunedes
deux variables de tuple gres par le systme. Toutefois, tout usage de lune de ces
variables de corrlation lintrieur dun bloc PL/SQL exige le prfixage par les deux
points(:).
CREATEORREPLACETRIGGERvalid_qteAFTERUPDATEOFqte_VON
INVENTAIREFOREACHROW
DECLAREERREUR1exception;
BEGIN
IF:NEW.qte_v>:OLD.qte_vTHENRAISEERREUR1;
ENDIF;
EXCEPTION
WHENERREUR1THENRAISE_APPLICATION_ERROR
(20001,erreur:nouvellequantitplusgrandequelaprcdente);
END;
CetriggerestexcutautantdefoisquilyadetuplesmisjourdanslatableInventaire
par lnonc de mise jour associ. Si le trigger choue , cestdire si une exception
nest pas traite correctement ou si le bloc lance un appel la procdure stocke
RAISE_APPLICATION_ERROR(),latransactionestlobjetdunrollbackautomatiqueet
lecontrleestpasslaprocdureappeleet,finalement,lenvironnementappelant,
notammentSQL*PLUSouSQLFORMSouuneapplicationC.
LaprocdurestockeRAISE_APPLICATION_ERROR()adeuxarguments:unnombre
ngatifentre20000et20999etunechanedecaractresdontlalongueurestinfrieure
512 octets. Le rle de cette procdure est de passer lenvironnement appelant (ex.
Developer2000etL3G)unnumroderreuretunmessagedemanirelesafficherpour
lutilisateur. Ainsi, si une application SQLFORMS effectue une mise jour incorrecte,
laction lie la BD sera dfaite par le trigger valid_qte et le numro derreur et le
messageserontinterceptsettraitscorrectementlafaondeSQLFORMS.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 183
Validationdunattributdetupleeninsertion
Pourvaliderlefaitquelavaleurdunattributdoitavoirunevaleurprexistantedansla
BD, il suffira de dfinir un trigger BEFORE FOR EACH ROW. Par exemple, le tuple
insrerdoitutiliserunpatronymeabsentdanslaBD,sinonletuplenestpasaccept.
CreatetableEmploye(
nasintegerprimarykey,
nomvarchar2(40)notnull,
classechar(1)notnull);
CREATEtableProjet(
noPintegerprimarykeynotnull,
sitevarchar2(40)notnull,
budgetnumber(7,2)notnull,
nasinteger,
constraintfk_ProjetEmployeForeignkey(nas)ReferencesEmploye(nas));
SQL>SELECT*FROMEmploye;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 184
1 Gagn A
2 Michaud A
3 Landry A
Ilyaunecontraintedemisejourdfiniesurlatableprojetquilimitelasommetotale
des budgets des projets en cours au mme site 90 000.00$. La seule dfinition dun
trigger BEFORE Update sur la table Projet gnre une erreur de table en mutation en
raison de la porte du trigger qui doit vrifier que les projets de Qubec et pour cela
utiliserlavariabledetuples:NEW.
CreateorReplacetriggerProjetQcLimBEFOREUpdateonProjetforeachrow
Declare
totalnumber(8,2);
Begin
SelectSum(budget)INTOtotalFROMProjet
Wheresite=Qubec;
iftotal+:NEW.budget>90000.00THEN
Raise_Application_Error(20600,BugettotaldpasspourQubec);
endif;
end;
Dclencheurcr.
SQL>UPDATEProjetsetbudget=20000.00WHEREno_p=100;
ERREURlaligne1:
ORA04091: table AGAMACHE.PROJET en mutation,dclencheur/fonction ne peut la
voir
ORA06512:AGAMACHE.PROJETQcLIM,ligne4
ORA04088:erreurlorsdexcutiondudclencheurAGAMACHE.PROJETQCLIM
SELECT*FROMprojet;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 185
Aucunemisejoureffectue.Pourcorrigercettesituationetpouvoireffectuerlamise
jour,ilsuffitdutiliserunevariableglobaledfiniedansunpackagequiseraparlasuite
rangauniveauduserveur.
/*crationdelavariableglobaleviaunpackage*/
CreatepackageVar_globaleas
v_sitevarchar2(40);
end;
/*initialisationdelavariableglobale*/
CreateorReplacetriggerinitSiteBEFOREUPDATEonProjetforeachrow
BEGIN
var_globale.v_site:=:NEW.site;
Exception
WhenNO_DATA_FOUNDTHEN
Raise_Application_Error(20500,pasdeprojetQc);
end;
/*vrificationdudpassementdelalimitepourunmmesite*/
CreateORReplacetriggercontrole_budgetAFTERUPDATEonProjet
Declare
v_totalnumber(8,2);
BEGIN
Selectsum(budget)INTOv_total
FromProjet
Wheresite=var_globale.v_site;
ifv_total>90000.00THEN
Raise_Application_Error(20300,pasdeMAJ);
endif;
end;
Misejourdubudgetduprojetno_p=100
UpdateProjetsetbudget=60000.00WHEREno_p=100;
Misejourrefuseparletrigger:
Latransactionestannuleautomatiquementetlesmodificationseffectuessontdfaites
parlegestionnairedetransaction.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 186
8.21TriggerINSTEADOF
Siladfinitiondunevuecomporteunejointure,ellenepeutpastremisejourparles
ordresInsert,UpdateetDelete.Ilestpossibledecontournercettedifficultaumoyendu
trigger Instead Of qui vient la rescousse de la vue et fournir une procdure de
remplacementcapabledefaireletravailautrementimpossible.Pourcefaire,lenouveau
triggerdoitfairedirectementetprcismentsurlestablesdebaselesmultiplesactions
soustenduesparlordredoriginesurlavue.
Par exemple linsertion dun tuple au moyen dune vue dfinie par une jointure est
renduepossibleparlenoyaueninterceptantlamisejoursurlavueeteneffectuantles
insertionsappropriessurlesdeuxtablesrfresparlavue.
CreatetableProjet(
noPnumber(4)primarykey,
pDescvarchar2(40));
CreatetableEmpl(
matnumber(4)primarykey,
nomvarchar2(40),
salairenumber(7,2),
noPnumber(4),
constraintfk_Projetforeignkey(no_p)referencesProjet(noP));
Lavuedfinieaveclajointureestlasuivante:
CreateViewv_E_Pas
SelectE.mat,E.nom,P.no_p,P.p_desc
FromProjetP,EmplE
WhereP.noP=E.noP;
Voiciuneinsertioneffectuetraverslavuev_E_P:
Insert INTO v_E_P VALUES (50,Legendre, 625, colliger des stats); (dml de
lapplication)
lexcution,uneerreurserasignalepourindiquerlimpossibilitdefairedirectement
cetteinsertionvialavuerelationnelle.Parcontre,unetellemisejourpeuttrefaitepar
letriggerInsteadOfassocilavuerelationnellev_E_P.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 187
Begin
SELECTcount(*)INTOCabsencedutupleajouter?
FROMEmpl
WhereEmpl.mat=:NEW.mat;
ifc=0THEN
InsertINTOEmpl(mat,nom)VALUES(:NEW.mat,:NEW.nom);
endif;
Selectcount(*)INTOcFROMProjet;
ifc=0THEN
InsertINTOProjet(noP,pDesc)VALUES(:NEW.no_p,:NEW.pDesc);
endif;
end;
SQL>InsertINTOv_E_PVALUES(50,Legendre,625,colligerdesstats);
1rowcreated.1tupleparlavue,mais2tuplesparletrigger.
SQL>SELECT*FROMempl;
MATNOMSALAIRENO_P
50Legendre
SQL>SELECT*FROMprojet;
NOP PDESC
625colligerdesstats
Enrsum,letriggerInsteadOfpermetdecontournerladifficultsouleveparlavue
relationnelle dfinie avec une jointure et cela, en fournissant au noyau du SGBD les
rglesprcisespourrpercuterloprationsurlestablesdebase.
8.22Gnrateurdenombressquentiels
Le dclencheur est souvent utilis pour gnrer un nombre squentiel qui est souvent
utileauxapplications.Cegnrateurmonotoneavecmmoirepermet,parexemple,de
numrotersquentiellementdespices,descommandesetdestransactions.Lenombre
estgnrpartirdunevaleurinitialeetsavaleurcrotchaquemissionjusquune
limitesuprieure.LemcanismeutilisparOraclepourgnrerunnombresquentielse
comportecommeunefonction,avecunemmoirecreavecunnomparticulierfourni
parlapplicationquiactivelegnrateur.Ellepeuttrevuecommeunepseudotable
untuple,dotedepseudocolonnes,notammentlaNEXTVAL.Lapseudotablenepeut
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 188
CREATESEQUENCEnbseqINCREMENTBY1startWITH1MAXVALUE999;
Le gnrateur est un objet de la base qui peut tre partag pour autant que le
propritaireaccordelesdroitsdaccsauxautresutilisateurs.
GRANTSELECTonnbseqtoutilisateur5;
Legnrateurpeuttresupprimparlacommande:
DROPSEQUENCEnbseq;
Exploitationconcurrentedummegnrateurpardeuxapplications
La pseudocolonne CURRVAL fournit toujours la dernire valeur gnre et obtenue
suiteladernirerequteeffectueparcetteapplicationindpendammentdesautres.
Dictionnaire ApplicationA:
Nbseq 99 1
42 Selectnbseq.NEXTVAL
Intonb; 43
3
Selectnbseq.CURVAL
Intonb;
43
Dernire valeur
4
gnre 2
Selectnbseq.NEXTVAL
ApplicationB: Intonb;
45
Select 44
nbseq.NEXTVAL
Into val;
Figure8.33
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 189
Privilgepourlacrationdungnrateur
LacrationdunesquenceestpossiblesilutilisateuraleprivilgeCREATEsequence.La
squence correspond une table dont la dfinition est range dans le dictionnaire et
dontlesdonnessontchargesdanslespacedetableSYSTEM.
Pour obtenir une valeur de la squence et laffecter une variable maph (matricule du
patienthospitalis),ilsuffitdexcuterdansuntriggerlnoncSQLcidessousquifait
rfrenceunautresquenceurnomm,parexemple,nbseq.Pourgnrerunnombreet
lerangerdansunevariableoudansunattributdutuplecourant,onutiliseralaclause
SQLsuivante:
SELECTnbseq.NEXTVALINTO:new.maphFROMDual;
Linsertion de la valeur est faite dans le tuple courant (:new), quelle que soit la table
cible par linsertion, et crase toute autre valeur pralablement affecte lattribut
maph. Il est aussi possible dobtenir la valeur courante du gnrateur par lattribut
CURRVAL.
SELECTnbseq2.CURRVALINTO:new.maphFROMDual;
Stockagedestriggersdansledictionnaire
LestriggersdeBDspcifisparladministrateurdelaBDsontrangsdansunetabledu
dictionnaire(tableUSER_TRIGGERS)dontleschmaestdonncidessous.Untrigger
peuttresupprimparsonpropritaireouparleDBAquialeprivilgeDELETEANY
TRIGGER.
SchmadelatableUSER_TRIGGERSdudictionnaire
TRIGGER_NAME NOTNULL VARCHAR2(30)
TRIGGERTYPE VARCHAR2(16)
TRIGGERING_EVENT VARCHAR2(26)
TABLE_OWNER NOTNULL VARCHAR2(30)
TABLE_NAME NOTNULL VARCHAR2(30)
REFERENCING_NAMES VARCHAR2(87)
WHEN_CLAUSE VARCHAR2(2000)
STATUS VARCHAR2(8)
DESCRIPTION VARCHAR2(2000)
TRIGGER_BODY LONG
Figure8.34
Ainsi,pourconnatrelecorpsdutriggertr34,sonpropritairepeutinterrogerunetable
dudictionnairededonneslaquelleilaaccs.
SELECTTRIGGER_BODY
FROMUSER_TRIGGERS
WHEREtrigger_name=tr34;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 190
PrdicatsspciauxpourlestriggersdeBD
Lorsquun trigger est dclench, il est possible de connatre la nature de lordre DML
associdemmequelattributvisparlaction.
Cesprdicatsspciauxsimplifientlaprogrammationdestriggersenpermettantdefaire
un test sur la nature de lopration en cours. Soit le trigger Trig_ajout qui lance une
insertionsuiteunajoutfaitdanslatableInscription.
CREATE OR REPLACE TRIGGER TRIG_AJOUT AFTER INSERT OR UPDATE
OFStatutONInscriptionFOREACHROW
BEGIN
/* traitement dune nouvelle inscription dans la table du mme nom lorsquil
sagitduneinsertion*/
IFINSERTINGTHEN
UPDATETABLE_INSCSETnbInsc=nbInsc+1
WHERETableIns.code=:new.code;
ENDIF;
END;
noter que le trigger est associ plusieurs ordres DML runis dans une condition
logiquedisjonctive:INSERTORUPDATE.
Privilgespourlacrationduntrigger
Unutilisateurpeutcreruntriggerdanssonschmasilaleprivilgesystmeappropri
: CREATE TRIGGER. De plus, il pourrait crer un trigger dans un autre schma
appartenantunautrecompte,silavaitleprivilgesystmeCREATEANYTRIGGER.
ModificationdeladfinitionduntriggerdeBD
Laspcificationducorpsduntriggernepeutpastremodifie;elledoittreremplace
ou supprime et finalement cre nouveau. Si lon supprime un trigger par la
commandeDROPTRIGGERnom_trigger,ilyaaussisuppressiondetouslesgrantsou
droits accords ce trigger. Par la suite, aprs la cration du trigger modifi, il faudra
accordernouveaulesprivilgesautrigger.Pourviterdeperdrelesgrantsdutrigger
remplacer,ilfaututiliserloptionREPLACEduCREATEouencoreutiliserCREATEOR
REPLACE.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 191
DECLARE
...
BEGIN
...
EXCEPTION
...
END;
.<lepointpourquitterlditeurdePL/SQLouun/pour
quitteretexcuterletrigger
Certains paramtres dun trigger peuvent tre changs aprs la cration. Ainsi,
lactivationouladsactivationduntriggerparticulieroudetouslestriggersdunetable
estpossibleparlacommandeALTER:
ALTERTRIGGERTR35ENABLE;
ALTERTABLEUSINESDISABLEALLTRIGGERS;
Voici un trigger plus complexe qui vrifie la cl trangre dune relation ATELIER
chaque fois quil y a ajout ou modification dun tuple dans la table ATELIER. La
vrification de la cl est faite pour valider une contrainte dintgrit spcifie dans le
schma de la relation. Lusage dun curseur dans ce trigger doit se faire avec un
paramtreparcequelexcutionduSELECTnegarantitpasleretourdunseultuplede
la BD. Normalement, si le prdicat nutilise pas une cl primaire, il y aura plusieurs
tuples dans la rponse. Dans un tel cas, les tuples de la rponse sont logs dans un
espace associ un curseur Oracle cr dans lespace mmoire du serveur. Les tuples
sontramenssuccessivementlastationclientparunordreFETCH.Encefaisant,une
ou des variables locales au bloc PL/SQL sont utilises pour rfrer aux valeurs des
attributs.
Create or REPLACE trigger valid_clef_etrang AFTER INSERT or UPDATE on
ATELIERFOREACHROWWHEN(new.noUsineisnotNULL)
/*conditionsupplmentairededclenchementdutrigger*/
/*avantlinsertionoulamodificationduntupleconcernantunatelier,ilyaune
validationdesacltrangre,soitsonnoUsinedanslatableparentUSINES.*/
DECLARE
v_noAtelinteger;
atelier_invalideexception;
atelier_valideexception;
erreur_piegeeexception;
PRAGMAEXCEPTION_INIT(erreur_piegee,4091);
/*erreurinterneOracletraiteparlapplication
vialexceptionerreur_piegee)dnestleparamtreducurseur*/
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 192
CURSORcurs_temp(dnNUMBER)IS
SELECTnoAtelierFROMUSINES
WHEREnoAtelier=dnFORUPDATE;
BEGIN
OPENcurs_temp(:new.no_atelier);
/*dutuplequiadclenchletrigger*/
FETCHcurs_tempINTOv_noAtel;
IFcurs_temp%NOTFOUNDTHENRAISEatelier_invalide;
ELSERAISEatelier_valide;
ENDIF;
EXCEPTION
WHENatelier_invalide
THENRAISE_application_error(
20010,noatelierinexistant);
CLOSEcurs_temp;
WHENatelier_valideTHENCLOSEcurs_temp;
WHENerreur_piegeeTHENNULL;/*erreuretrienfaire*/
WHENOTHERSTHENMessage(autreerreur);
END;
Figure8.35
TriggerpourlastationclientOracle(Developer/2000)
EnsusdestriggersdfinisauniveaudelaBD,ilestfortutileaussidepouvoirspcifier
certains triggers au niveau du logiciel client. Dans un tel cas, le trigger sexcute
immdiatementdslorsquesurvientlvnementdclencheurchezleclient,etnonen
diffr comme cest le cas pour certains triggers de la BD qui ne se dclenchent quau
moment du COMMIT de la transaction en cours. Pour certaines applications client
serveur,lestriggersdeBDpeuventfairedoubleemploi,siuntriggeridentiqueadjt
excutdanslastation.Lassurancequeletriggerduclientseratoujoursexcutavecla
mmespcificationnerelvepasnormalementdelacomptenceduDBA.
Signatureettriggerclient
Il serait possible de mettre contribution une condition de dclenchement pralable
(clauseWHEN)pourviterdexcuteruntriggerdeBD,siunevariabledtatreprsente
lagarantie(relativecependant)queletriggercorrespondantatexcutparlastation
client.Uneautrefaonseraitdecalculerunesignature(parexemple,celledetypeDES
ou RSA) pour chaque trigger dune application et de les stocker au niveau du serveur.
Chaquefoisquuneapplicationdemandeuneactiondinsertionoudemodificationdans
laBD,elletransmetaussilasignaturequeleclientcalculepartirdelaversionactuelle
dutriggerdelastation.Leserveurpeutdonclacompareraveccellequieststockeet,
sil y a une diffrence, le trigger de la BD sera excut. Ainsi, toute validation faite au
niveau de la station par un trigger identique celui du serveur ne sera pas refaite
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 193
inutilement. Bien entendu, tous les triggers ne peuvent pas tre implments de cette
faon, car certains sont propres la BD et devront ncessairement tre excuts
uniquementparleserveur.
Voici un autre exemple dun trigger de validation plus simple qui nutilise pas un
curseur,maispluttlavariabledecorrlationnew.attributpourserfrerlanouvelle
valeurdelattributCOULEURdontletypeestVARCHAR2:
CREATETRIGGERTRIGCOULAFTERINSERTONTPLANFOREACHROW
DECLARE
couleur_valideexception;
BEGIN
IF:new.COULEUR=rougeTHENRAISEcouleur_valide;
ELSIF:new.COULEUR=blancTHENRAISEcouleur_valide;
ELSERAISE_APPLICATION_ERROR(20401,couleurinvalide);
ENDIF;
EXCEPTION
WHENcouleur_valideTHENNULL;
WHENOTHERSTHENMessage(autreerreur);
END;
Figure8.36
8.23Synonyme
Les diffrents objets grs par le SGBD sont identifis par des noms qui peuvent tre
plus ou moins complexes. Par exemple, une table pour les transactions de vente de la
premire campagne de publicit faite par lagence Martin au cours du deuxime
trimestre 96 est nomme Ventes_pub_Martin.trim2_1996. Il est possible dassocier ce
nom un synonyme plus court et peut tre plus significatif pour les utilisateurs comme
parexempleMartin2_96.Avecladfinitiondecesynonymerangdansledictionnaire,
ildevientpossiblederfrerlatablesourceparlunoulautredesnoms.
CREATESYNONYMMartin2_96FORVentes_pub_Martin.trim2_1996;
Cesynonymeestrendudisponibleautomatiquementtoututilisateurquientreenligne
aveclenumrodecomptedelapersonnequilacr.LeDBAalautorisationdecrerde
telssynonymesquisontprivspardfaut,i.e.queleurporteestlimiteunschma.
Aucontraire,unsynonymeestcrpublicpourquilsoitaccessibletouslesschmas.
UnsynonymePUBLICestcrparlacommandeCREATEPUBLICSYNONYM.
CREATE[PUBLIC]SYNONYMpromotion97FORlaval_trim3_1997;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 194
ToutobjetdelaBDpeuttrerenommparunsynonymeafindenfaciliterlarfrence,
notamment la table, la vue, le lien de BD distante, lindex et la procdure. Les
synonymesqualifisdePUBLICsontaccessiblestouteslesapplications.
8.24Droitsdaccsetcompteutilisateur
La scurit dune base de donnes concerne est assure en premier par un contrle
rigoureuxdesaccsauxdiffrentsobjetsdunebasededonnes.Unebase,rappelonsle,
comprenddesobjetsquesontlestables,lesespacesdedonnes,lesvues,lestriggers,le
schma, les synonymes, les liens entre les bases, les rles, les comptesutilisateurs, les
squences, les procdures et les packages. Le DBA est celui qui possde tous les
privilges ds la cration de la base. Cest sa guise que certains privilges sont
propagsauxutilisateursselonleursbesoinsetquedautres,commeceluidecrerdes
comptes lui demeurent exclusifs. Il y a des privilges de systme et des privilges
dobjet.
Crationduncompteutilisateur
Le premier niveau de scurit est celui de la cration du compte pour entrer en ligne
avec linstance du SGBD. Cette communication doit tre authentifie par un mot de
passefourniparlutilisateuretvrifiparleSGBDoulesystmedexploitationhte.La
crationdescomptesestfaiteparleDBAsoitaveclutilitaireSQLDBA,soitdirectement
aveclacommandeCREATE.
Parexemple:
CREATEUSERjbouchardIDENTIFIEDBYqc1998fre;
Pardfaut,cestleserveurquivrifielavaliditdumotdepasseenconsultantunetable
dudictionnairerserveauxmotsdepasse.Dautrepart,lavrificationpeuttreprise
en charge par le systme dexploitation hte qui assure quun numro de compte pour
utiliser le SGBD est aussi protg par le mme mot de passe que celui qui protge le
comptedusystmedexploitation:
CREATEUSEROPS$jbouchardIDENTIFIEDEXTERNALLY;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 195
Lascuritpeutaussitreaugmentepourprotgerlescommunicationsentrelesclients
etleserveur.Ilestpossibledespcifierauserveurderecevoiretdedchiffrerlesmots
depassedechaqueclient.
Suppressionduncompte
Le DBA ou un compte qui possde le privilge de supprimer un compte peut enlever
laccslaBDuncomptetoutenconservantounonlesdiffrentsobjetsquececompte
acrslorsdessessionsdetravailantrieures.
Exemples:
Cas1:SupprimerunutilisateurduSGBDinscritdansledictionnaire
DROPUSERjbouchard;
Cas2:Supprimeruncomptequi adjcrdesobjetscommeunschma,destables,
destriggers,...Lasuppressiondunutilisateurentraneaussicelledessesobjetscrs.
DROPUSERjbouchardCASCADE;
Decettefaon,touslesobjetsquiappartiennentauschmadecetutilisateursontaussi
supprimsdelabasededonnes.
Unprivilgedesystmeestledroitdecrer,desupprimeroudemodifierunobjetqui
estassocilusagedesressourcesdusystmencessairespourlebonfonctionnement
duSGBD.Parmicesnombreuxprivilgesdesystme,ilyanotammentlessuivants:
Crationdetoutclusterquelconque(ANY)CrationdunliendeBD
Modificationdetoutindex Affectationdetoutprivilge
Suppressiondetouteprocdure Crationdetoutrle
Crationdetoutprofil,fonction,... Crationdunutilisateur
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 196
Crationetexploitationdesquences Crationdunespacededonnes
Crationdetoutsynonyme Crationdunindex
Crationdunesession Crationdetables
Les privilges du type objet concernent les oprations qui sont autorises quant aux
objets du schma. Ilssont aussitrs nombreux. En gnral,ces privilges sont associs
aux oprations dinsertion, dajout, de suppression et de modification dun objet du
schma. Par exemple, pour que lutilisateur util5 puisse crer une table Usines, il doit
avoir le privilge de crer son schma et dy crer cette table. De plus, si le mme
utilisateurveutinsrerdestuples,ildevraavoirleprivilgedinsertionetnaturellement
celuidesuppression.
Lepropritairedunobjetaautomatiquementtouslesdroitssurcetobjet.Ilpeutdonc
ajouter, supprimer des tuples et finalement supprimer la table. Pour que lutilisateur
util8aitaussilesdroitsdinsrerdestuplesdanslatablecreparutil5,ilnapasbesoin
davoirleprivilgeINSERTANYTABLE,maisseulementceluidinsertiondanslatable
Usines,quelepropritairepeutluiaccorderparlacommandeGRANT.
Ressourcesdusystmepourunutilisateur:notiondePROFILE
Lorsquun utilisateur a les privilges ncessaires pour exploiter une BD, il peut le faire
sanslimitationdesressourcesutilises.Parexemple,lutilisateurpeutresterenligneun
tempsillimitoutrelimituntempsborn.Ilpourracrerautantdetuplesquilveut
sanscontraintedespaceoutrelimitunespacesurdisqueprdfini.Cescontraintes
sontspcifiesdansunprofilassociunutilisateurlorsdelacrationdesoncompte.
CREATEPROFILEusager_profil5LIMIT
CONNECT_TIME50
IDLE_TIME 10;
CREATEUSERjbouchardIDENTIFIEDBYqc97frePROFILEusager_profil5;
Silutilisateurestdjcr,ilestpossibledajouterleprofilaveclacommandeALTER.
ALTERUSERjbouchardPROFILEusager_profil5;
Ilyaunprofilpardfautquiestceluiduserveuretquiestassocitoututilisateurpar
dfaut.CeprofilnestpascontraignantpuisquilspcifielavaleurUNLIMITEDpourles
ressourcesquinontpastredfiniesdansunprofildutilisateur.
ALTERPROFILEusager_profil5;
Propagationdesprivilgesauxutilisateurs
Si le seul crateur de tables dans le schma est le DBA, il est alors le seul pouvoir
accorderdesprivilgesauxautresutilisateurspourleurpermettredelire,daugmenter,
desupprimeretdemodifierlextensiondunetable.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 197
GRANTSELECT(no_us,ville)ONUsinesTOutil6,util7;
GRANTDELETEONUsinesTOutil7;
Danslexemplequiprcde,lesutilisateursutil6etutil7peuventdornavantaccderla
tableUsinesetyfairedesslectionsavecnimportequelattributdelatablepourobtenir
les tuples. Toutefois, ces utilisateurs ne peuvent pas transmettre leur privilge un
autre,saufsileprivilgequilsontreuestassortidelaclauseWITHGRANTOPTION.
Lorsquilsagitdunprivilgedesystme,laclauseWITHADMINOPTIONaccordela
mmeautorisationdetransmettre:
GRANTSELECTONUsinesTOutil6,util7WITHGRANTOPTION;
Ilestaussipossibledelimiterlesattributsvisiblespouruneactionlieunetable.Par
exemple,supposonsquelutilisateurutil9alesdroitsdelecturedunetableUsines,mais
quesondroitdemisejourestlimitceluidunattribut,soitlacapacit.Danscecas,
legrantspcifielattributquipeuttreciblparlamisejour:
GRANTSELECT,UPDATE(capacite)ONUsinesTOutil9;
Lemmersultatestobtenuendfinissantunevue,Vue_capacite:
CREATEVIEWVue_capaciteASSELECTcapaciteFROMUsines;
Afindepermettre,laslectionetlamisejourdelatableUsinesparlentremisedela
vue,ilfautaccorderlesprivilgesSELECTetUPDATElavue.
GRANTSELECT,UPDATEONVue_capaciteWITHCHECKOPTION;
LoptionCHECKpermetdelimiterlesmisesjourauxtuplesquisontvisiblestravers
lavue,cestdireauxusinesdelavilledeQubec.Deplus,lutilisateurnepourrapas
ajouter un tuple qui ne serait pas visible par la suite par lentremise de la mme vue,
comme lajout dune usine localise Montral. Sans la clause CHECK OPTION, cet
ajoutseraitpossible.
Rvocationdesprivilges
toutmoment,leDBAoulepropritaireducomptequiaaccordleprivilgepeutle
supprimerparlacommandeREVOKE.Supposonsquelutilisateurutil5aaccordutil9
le privilge systme de modifier nimporte quel index. Il peut le lui retirer par la
commandesuivante:
REVOKECREATEANYINDEXFROMutil9;
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 198
noterquelasuppressiondunprivilgenesepropagepasauxautresutilisateursqui
lauraientacquisdelutilisateurutil9.
8.25Rle
La notion de rle est propre au systme Oracle; elle est cependant une notion fort
intressante pour le DBA. Cela permet de simplifier la gestion des privilges en
regroupantceuxcidansunrlequiestaccordauxutilisateurs.Lintrtdecettenotion
est quelle permet de modifier les privilges dun groupe dutilisateurs en modifiant
simplement le rle. Chaque rle a un nom et un contenu qui sont dfinis sparment.
Parexemple,onaura:
CREATEROLEchefUsineNOTIDENTIFIED;aucunmotdepassepouractiverlerle
Dans lexemple qui prcde le rle est cr avec le nom chefUsine et ce rle nest pas
protgparunmotdepasse.Aucontraire,danslexemplecidessouslechefUsineaune
protectionparunmotdepasse.Parlasuite,lerleestenrichiaveclesprivilgesdontles
utilisateursontbesoin:
GRANTCREATESESSIONTOchefUsineIDENTIFIEDBY34y586j;
GRANTSELECT,INSERT,UPDATEONUsinesTOchefUsine;
Lerlechef_usineestaussiaccordauxutilisateursparlacommandeGRANT:
GRANTchefUsineTOutil2,util3,util9,util15;
Un mme utilisateur peut avoir plusieurs rles. En effet, lassociation dun rle un
utilisateur ne lactive pas toujours immdiatement. Cest par la commande SET ROLE
quunrleestactivpourunutilisateur:
SETROLEchefUsine;
TouslesrlessontactivsparlaclauseALL.
SETROLEALL;
Rlepardfaut
Le rle par dfaut est dfini la cration dun compte dutilisateur. Par exemple, on
aura:
CREATEUSERutil9DEFAULTROLEchefUsine;
Silonprocdeainsi,chaquefoisquelutilisateurutil9dmarreunesessiondetravail,le
rlechefUsinedevientautomatiquementactif.
Informationsurlesrles
LinformationsurlesrlesdfinisdansuneBDeststockedansdeuxtablesqueleDBA
peutinterrogeravecunerequteSQL.LatableDBA_ROLEScontientlenomdetousles
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 199
rles dfinis dans la BD. La vue DBA_ROLE_PRIVS permet de connatre les rles
associsauxdiffrentsutilisateurs:
SELECTroleFROMDBA_ROLES;
lecturedelatabledudictionnairesurlesrles
SELECTgrantee,granted_roleFROMDBA_ROLE_PRIVS;
Exercicesduchapitre8
1DvelopperuntriggerdinsertiondetypeBEFOREpourvrifierquetoutajoutdansla
relation Empl est refus si le nombre demploys dont le taux horaire est suprieur
14.00 $ ne dpasse pas celui des employs dont le taux horaire est infrieur ou gal
14.00$(voirlinstancederfrencedeBD3).
2VoiciunepartiedelaBDdunCEGEP,quiestcomposededeuxrelationsdontlune
auneclcompose:
Eleve(mat*,nomE,adresCampus,moyE)
Inscription(mat*,cours*,note)
LesrequtescidessoussontconsidrestypiquesdutraitementfaitparleSGBD:
SELECTE.mat,E.nomE,I.cours,I.note
FROMEleve[as]E,Inscription[as]I
WHEREE.mat=I.matandI.note>2.5;
SELECTcours,note SELECTmat,note
FROMInscription FROMEleveE,InscriptionI
WHERE WHEREE.mat=I.matand
mat=9203498; mat=92000000and
cours=ift14678;
2.1 Crer le schma des relations lve et Inscription en spcifiant les cls primaire et
trangre.
2.2Surquelsattributsfautilcrer unindexpouracclrerlecalculdelarponseaux
requtescidessus?Commentervotrerponse.
2.3Formulerlescommandesncessairespourcrerlesindexappropris.
3Creretaccorderlutilisateurducompte25lesprivilgesdelectureetdemisejour
surlesrelationsEleveetInscriptionet,pourlecompte31,lesaccsenlectureseulement
surlarelationEleve.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 200
4Crerlescomptesbd345etbd124enleurassociantrespectivementlesmotsdepasse
bv3m67etu82jvg7.Pourfairecetexercicevousdevezavoirleprivilgedecrationde
comptes.
5DsactiverlacontrainterfrentiellequiseraitdfinieetactivedanslaBDCEGEP.
8AumoyenduneprocdurePL/SQL,supprimerlesventesfaitessergeetquisont
inscritesdanslarelationVentes(BD1).
9FormuleruncurseurPL/SQLquidonnelematriculedestransporteursquinontpas
destocksdepicesderechange(BD2).
*UtiliserlabasededonnesBD3pourrpondreauxquestionssuivantes.
10 Ajouter au moyen dune procdure PL/SQL, 20 000 tuples dans une relation
EmplListe dont le schma est identique celui de Empl. Les donnes ajoutes doivent
tre conformes au type utilis pour les attributs. Chaque tuple doit avoir une cl
diffrente et un nom fictif (pas ncessairement significatif) qui peut tre form par la
concatnationdunumrodelemployetdunnomrptitifquelconque.Lesemploys
peuvent partager le mme taux horaire. Le numro de lemploy est gnr au moyen
dun compteur initialis au dpart 10 et augment progressivement lintrieur de
litrationPL/SQL.
13Supprimerles20000tuplesajoutsdanslarelationEmplListe.
14Dvelopperunpetitschmadelabaserelationnelleavecdesdonneshirarchiques
significatives.Parexemple,unerelationquireprsenteraitlenasdesabonnssuccessifs
qui ont eu un mme indicatif tlphonique : Abonne (indicatif, abonne_precedent,
abonne_courant, date_abonne_courant). Formuler une requte hirarchique pour
afficher,depuisunedateprcise,lesabonnssuccessifsdunindicatifparticulier.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 201
Empl(noEmpl*,nom,tauxH)
Postes(noPoste*,description)
Assignations(noPoste*,noEmpl*,debut,quart)
N.B.LattributdebutestdetypeDate.
16Augmenterletauxhorairedetouslesemploysde10%.
17Listerlenomdesmcaniciensparordrealphabtiquedescendant.
18Afficherlamoyennedutauxhorairepourlesemploysquitravaillentlanuit.
19Modifierladescriptiondupostej12pourceluidechef.
20AjouterunecolonnelatableEmploye,soitlattributdiplmedutypechar(20).
21ListerlecontenudelatableEmployeetensuiteattribuerlediplmedec(diplme
dtudes collgiales) tous les employs. Afficher son nouveau schma de
relation(table).
22 Crer une vue Personnel_V1 avec la table des employs. Elle est compose du
numroetdunomdesemploysdontlenoemplestsuprieurlasrieP400.
23ListerlesemploysdelasrieP400enordrealphabtiquedescendantenutilisantla
vuerelationnellePersonnel_V1.
24Ajouterunenouvelleemploye,MegyRyan,P600,lalistedesemploysetlisterla
tabledesemploys.
25Afficherpourchaquematricule,lenumrodeposteetladatedudbut.
26 Crer une vue V1992 pour afficher les attributs nom et noPoste des employs
embauchsdepuisle1fvrier1992.
27FormulerlesordresDMLpourinsrerlemployBeaumont,embauchdepuisle12
janvier 1988 et qui travaille le soir. Il titularise le poste j75 et, linstar des autres
employs,sontauxhoraireestceluiprvuparlaconventioncollective,soit15.00$.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 202
28 Expliquer pourquoi il est possible dinsrer, par lentremise de la vue V1992, les
informations concernant lemploy Beaumont ? Estil possible de relire le tuple insr
parlentremisedelammevue?
29ModifierlavueV1992pourinterdirelinsertiondetoutemployembauchaprsle1
fvrier.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 203
INDEX
clusteringindex,134
A COALESCE(),77
Activationduntrigger,181 COLUMN,106
ADD_MONTHS(d,n),68 COMMIT,192
ALL,52,79 comptesutilisateurs,194
ALTERPROFILE,196 concatnation,64
ALTERTABLE,85 Condition,35
ALTERTABLE,104 conversiondestypes,71
ALTERTRIGGER,191 conversionsautomatiques,47
ANY,52 create[unique]index,137
AVG(),80 CREATECLUSTER,151
CREATEFORCEVIEW,155
B CREATEINDEX,134
CREATEINDEXBITMAP,136
B*arbre,19
CreateMATERIALIZED,163
B*arbre,125
CREATEORREPLACEview,154
B*arbre,135
CREATEPROFILE,196
Barbre,133
CREATEROLE,198
Barbre,16
CREATESEQUENCE,188
basededonnesractive,176
CREATESESSION,195
BD1,21
CREATESYNONYM,193
BD2,22
CREATETABLE,26,103,104
BD3,23
CREATETABLESPACE,20
BEGIN,170
CREATETRIGGER,178
blocanonyme,170
createuniqueindex,139
blocPL/SQL,171
CREATEUSER,194
boucleFOR,173
CrationdesvuesavecSQL,164
C Crationdunetableetletypagedes
attributs,24
CASCADE,30,157
CAST,46 D
CHANGE,106
datawharehouse,135
CHECK,197
Datepardfaut,70
CHECKOPTION,157
DB2V2,176
cltrangre,146
DECLARE,170
cltrangre,28
DECODE(),76
clstrangres,143
dfinitionduntriggerdeBD,190
cluster,148
DELETEFROM,100
ClusteravecHashingexplicite,152
Densitdelindex,133
Clusterindex,152
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 204
DESCRIBE,102 GROUPBY,83
dictionnairededonnes,102 Groupementetvuerelationnelle,83
Diffrence,99
DirectivesdeSQL,106 H
DISABLE,146 hashing,132
DISTINCT,79 HAVINGcount,83
Divisionrelationnelle,87
DROPTABLE,105 I
DUAL,63
index,138
Index,130
E
Indexclstransformes,134
checduntrigger,179 Indexbitmap,135
EDIT,107 indexcompos,137
diteurdeligne.,106 indexconcatn,141
EXCEPTION,170 Indexinvers,135
exceptions,174 Indexation,125,143,154,168,169,176,
Exercices,111,199 187,193,194,198,199
Exercicesrsolus,108 INFORMIX,176
Expressiondetable,51 INSERT,32,99
Expressiondetablepartage(voirDB2), INSERTINTO,100
56 InsteadOf,186
Expressionincluantunappelde INSTR(ch1,ch2,n,[i]),64
fonction,44 Intersection,98
Expressionincluantunestructure
CASE,45 J
expressionsrgulires,37
Jointuredroite,96
Jointureexternegauche,95
F
Jointurenaturelle,85
Fonctiondutilisateur,74 Jointurethta,86
fonctionsscalaires,61
FonctionsSQL,61 L
FonctionsSQLdagrgation,79
LAST_DAY(d),68
FormulationduGROUPBYavecune
LENGTH(ch1),65
fonction,82
LIST,107
Fouillehirarchique,57
LTRIM(ch1[,setcar]),64
Fragmentationdesgrandstupleset
chanage,14 M
G Matrialisationdunevue,161
max(),80
Gnrateur,187
Migrationdestuples,14
GET,107
min(),80
GRANTOPTION,197
Misejour,101
GRANTSELECT,197
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 205
Misejour,99 refresh,163
misejouretvue,158 Regroupementinconditionneldes
Misejourtraversunevue,163 tuples,81
Modledexcution,32 REPLACE,83
modledexcutiontrigger;,181 REPLACE(ch1,si,par),65
MONTHS_BETWEEN(d1,d2),68 REPLACE().,64
Requtecorrle,54
N RequteSQL,31
NEW,181 RESTRICT,157
NO_DATA_FOUND,175 REVOKESELECT,158
NULLIF(),79 Rle,198
NVL(),76 Rlepardfaut,198
ROWID,17
O RTRIM(ch1[,setcar]),64
RUN,107
optimiseur,139
Optimiseuretindex,142
S
Oracle,176
ORDERBY,46 SAVE,107
SchmadelaBD,24
P SELECTDISTINCT,39
Slection,35
Pageinsrable,13
SETPAGESIZE,106
PCTFREE,12,26,144
SETBUFFER,106
PCTUSED,12,26
SETPAUSE,106
Performance,145
signatureSoundex,66
Pertinencedelindexation,147
SING(n),77
PL/SQL,169
snapshot,168
Placementdesdonnes,15
Soundex,66
Placementparhashing(hashclustering),
SOUNDEX(ch1),64
150
SPOOL,106
placementregroupdestuples,133
SPOOLOFF,106
PrdicatISNUL,41
SQL,5
Prdicatsspciaux,190
SQL*Plus,6
PRIMARYKEY,143
SQLPLUS,7
privilgesystme,190
starschema,135
profil,196
START,107
PROFIL,196
Stockagedestriggers,189
programmePL/SQL,170
Structuregnraledepage,11
R SUBSTR(ch1,m,n),64
Suppression,100
RAISE_APPLICATION_ERROR(),182 Suppressiondunindex,140
Rcursivit,60 Suppressiondelavue,157
Rcursivitdesfonctions,76 Suppressiondutemps,72
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 206
SYBASE,176 U
syntaxedesvariables,172
Union,98
SYSDATE,68,73
UPDATE,101
utilisationdesindex,140
T
tableenmutation,184 V
TO_CHAR(),62
valeursdupliques,130
TO_CHAR(d,masque[,nlsp])),71
Variabledetable,155
TO_DATE(ch1,masque[,nlsp])),71
variablehte,173
TO_NUMBER(ch1,masque[,nlsp]),71
Variablesdecorrlation,181
TOO_MANY_ROWS,175
vueetdroitsdaccs;Ainsi,unusager
transaction,21,101
Paulquinestpaslepropritairedela
TRANSLATE(ch1,s,c),64
vuepeutcependantlutiliserpour
Tri,46
avoiraccsauxventesenregistres
trigger,177
aprsle1janvier1995.Ildoit
Triggerdetuple,179
auparavantobtenirdupropritaire
Triggerdnonc,179
delatableledroitdeslectionquece
TriggerInsteadOf,186
dernierformuleraainsi:,156
TRUNC(),25,62,73
vuematrialise,169
TRUNCATETABLE,100
vuerelationnelle,154
TRUNCATETABLE,100
TypesinternesdOracle,25 W
withgrantoption,99
WITHGRANTOPTION,197
Rfrences
1 COREY, M., ABBEY, M., DECHICHIO, D. J., Tuning Oracle Version 7.x, Oracle Press,
ISBN0078811813,1995.
2 RODGERS, U., ORACLE, A Database Developers Guide, Yourdon Press Computing
Series,ISBN0134889258,1991,250p.
3 MIRANDA, Serge, Lart des bases de donnes; comprendre et valuer SQL, Eyrolles,
vol.,1990.
4DATE,C.J.,AGuidetotheSQLStandard,AddisonWesley,1988,ISBN0201057778.
5LUSARDI,F.,TheDatabaseExpertGuidetoSQL,McGrawHill,1988,ISBN0070390029
6 ORACLE CORP., SQL*Plus Users Guide and Reference, version 3.1, Cooperative
DevelopmentEnvironment,ISBN5142311192,1992.
7 KOCH, George, ORACLE, the Complete Reference, version 5 and 6, Osborne McGraw
Hill,1991,ISBN0078816351.
8LONEY,K.,ORACLEDataHandbook,OsborneOraclePress,1994,ISBN0078811821.
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca
Chapitre8Indexationetvuerelationnelle 207
9ODELL,MargaretK.,RobertC.Russell,U.S.Patents1261167,1918.
10 RUSSELL,R.,U.S.Patents1435663,1922.
BAIRD, Gus, rfrence cite par Joe CELKO dans son livre SQL avanc publi par
11
Thomson,1997
12 PHILIPS,Laurence,Metaphone,ComputerLanguage,1990.
13 ORACLE, CORP., Oracle7, SQL Language Reference Manual, Cooperative Server
Technology,1992,ISBN778701292..
14 CORRIGAN, Peter, GURRY, M., ORACLE Performance Tuning, OReilly Associates,
1994,ISBN1565920481.
15 DATE, C. J., An Introduction to Database Systems, 6ed. edition, The Systems
ProgrammingSeries,AddisonWesley,1995,ISBN020154329X.
16MAREE,C.,LEDANT,G.,SQL2;Initiationetprogrammation,ArmandColin,2edition,
ISBN2200214111,1994.
17GAMACHE, A. Introduction au langage PL/SQL, Dpartement dinformatique,
UniversitLaval,1997,63p.(DisponibleaussisurleWEB).
Andr Gamache, Dpartement dinformatique et de gnie logiciel, Facult des sciences et de gnie,
UniversitLaval,Qubec,Qc,Canada,G1K7P4.Courriel:andre.gamache@ift.ulaval.ca