You are on page 1of 207

Architectures, modles et langages de

donnes







Ingnierie des
bases de donnes




Hypercube c,d


OLAP









Fascicule 3


VolumeI
Langage SQL, indexation et vue relationnelle

Andr Gamache 2005

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

Architectures, Modles et Langages de Donnes

Volume 1
Fascicule 1
1- Introduction 1
2- Architecture fonctionnelle du SGBD 20
3- Modle conceptuel des donnes 79
- Index
Fascicule 2

4- Modle relationnel : thorie et contraintes dintgrit 1


5- Algbre relationnelle 57
6- Transposition du MCD au MRD 137
- Index

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.

Le module SQL*Plus est donc lintermdiaire incontournable lorsquun dveloppeur


veutexcuteruneclauseSQLenmodeinteractif.Letextedeladernireclauseestplac
dans un tampon prdfini et nomm par un nom interne suffix par SQL. Cet espace
peutcontenirseulementuneclauseSQL,excluantlesdirectivesayanttraitauformatage,
lenvironnement et laffichage de la rponse par le module SQL*Plus. Pour
contourner cette restriction, il est possible de dfinir un autre tampon courant par la
directiveSETBUFFERdontladureestcelledelasessiondetravail.

DirectivesSQL*Plus
BD


SQL*Plus
SGBD

Tampon
client
serveur SQL*Plus

Figure7.1
UtilitaireSQLPlusetscriptdexcution
LapplicationutilitaireSQLPlusestincontournablepourlamiseaupointetlexcution
enlignedesclausesSQL.CetteutilitaireSQL*Pluscomporteplusieursdirectives:

SET BUFFER tampon1 -- un autre tampon courant est cr


SAVE C:\tampon1.sql --sauvegarde du tampon dans un fichier sur C
SET BUFFER SQL -- retour au tampon par dfaut de SQL*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 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*/

Le fichier est excut par START envirobd3.sql ou en le nommant init.sql ou


login.sql, auquel cas il sera excut automatiquement avec le lancement du module
SQL*Plus.AvantdaborderltudedulangageSQL,ilestutiledesurvolerlesdiffrentes
structures utilises par la base de donnes afin de donner un sens physique aux
paramtresdesordresSQLDDL.Cesurvolesteffectuenfaisantrfrenceausystme
Oracle dont limplmentation du modle relationnel et du langage SQL est reconnue
commetantdetrsbonniveau.

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:

a) Stockage de la dfinition de la base de donnes : schma, index, trigger, packages,


fonctions, procdures, synonymes (alias) etc. Il est entirement accessible
ladministrateur des donnes (DBA) et partiellement aux utilisateurs qui peuvent
consulterlestables(etlesautresobjets)dontilssontpropritaires.

b) Passerelle incontournable entre le noyau du SGBD et linterprteur du SQL pour


effectuer lanalyse et le traitement des requtes SQL. Le dictionnaire est essentiel
lappariement (binding) dynamique avec les applications L3G, notamment en ce qui
concernelacompatibilitentreletypeinternedunedonneetletypeexternedisponible
danslelangagedeprogrammationhte.

c) Documentation des divers objets de la base de donnes : tables, index , attributs,


dclencheurs,packages.

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

relation (table), les dclencheurs (trigger), la fonction, la procdure interne, lespace de


donnes, lindex, la vue, le trigger et le package. Tous ces objets sont rangs dans les
tables du dictionnaire du SGBD, sauf lextension de la relation qui est stocke dans un
espace de table (tablespace). Laccs chacun des objets est contrl par des droits qui
sontaccordset,aubesoin,rvoqusparleDBA.

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.

Le premier compte DBA cr lors de linstallation du SGBD est nomm SYSTEM.


Lespace de table SYSTEM est aussi cr linstallation et il appartient au compte de
mme nom. Les divers objets crs y sont placs par dfaut, y compris ceux des
utilisateurs,saufsilutilisateurpropritairedelobjetrequiertdelefaireautrement.Une
meilleureperformanceestatteintesilesobjetsdindexetdetablesdesutilisateurssont
placsdansautantdeTS(tablespace)distinctscrsparleDBA.Cestleprincipedebase
de larchitecture optimale appele OFA (Optimal Flexible Architecture) et suggre pour
Oracle1.

1..1 1..1 1..*
BD 1..1 EspaceDeTab FichierPhysique
1..*

1..*
1..1 1..1

1..* 1..*
1..*
1..* Table
Page
Comptes
1..1
1..1 1..*

1..1 1..* 1..1

Schmas Segment Extent
1..1 1..* 1..* 1..1

Figure7.3

Structuregnraledepage
Une page a une taille fixe au lancement de linstance et cela, par lentremise du
paramtredesystmeBLOCK_SIZE.Sataillepeutvarierjusqu16Ko.Chaquepagea
une zone de gestion de son espace qui est appele rpertoire des tuples ou de lignes.
Lespacedunepageestassortiedunecontraintequiestlasuivante:

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

Enttedepage INITRANS: espace pour la gestion


desaccslapage
Zone dlargissement des MAXTRANS: nombre maximum de
tuples transactionsenaccssimultan.


PCTFREE: % de lespace de page

rserv llargissement des tuples
Zonedetuples lorsdelamisejour.



Rpertoiredestuples
PCTUSED:%delapagerservaux
donnes et en dessous duquel la

Figure7.4

Lentte de la page contient des donnes pour la gestion transactionnelle, notamment


les adresses logiques (rid) des tuples verrouills avec le numro de la transaction
propritaire du verrou. Lors dune relecture de la page, le systme vrifie si une
transactioninscritedanslentte(quiadoncluuntuple)estencoreactiveet,danslecas
affirmatif,considrequeletupleesttoujoursverrouill.Sinon,leverrouestprimetle
tupleestconsidrdisponiblepourlesautrestransactions.Ladresselogiqueduntuple
nommridourowid(rowidentifier)estsouventformedelafaonsuivante:
rid ::= noFichier:noPage:noEntreedansRepertoire
PageOracle
Chaque page ou bloc Oracle est compos de blocs physiques doctets contigus et est
lespace utilis pour ranger les tuples dune mme table. La structure de la page
comprendaumoinstroisparties:unentte,unezoneprimairepourrangerlestuples
(PCTUSED)etunezonededbordement(PCTFREE)pourrangerlestuplesdontlataille
aaugmentsuiteunemisejour.Pardfaut,lesystmeOraclefixelazoneprimaire
40%delatailledelapageetlazonededbordement10%.Danslescasoilyapeu
demisesjouretbeaucoupdajouts,lesvaleurspardfaut(10/40)pourlesparamtres
PCTFREE et PCTUSED ne sont pas toujours adaptes aux besoins dun tel
environnementdexploitation.Ilfautlesajusterparexemple5/80lorsquilyapeude
misesjour.

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

minimiser les lectures et les critures sur le disque en indiquant au serveur le


pourcentage de lespace occup dune page, qui doit tre atteint avant que la page soit
dsignenouveau commeunepageinsrable.Eneffet,lesinsertionssepoursuivent
dansunepagetantetaussilongtempsquelepourcentageduPCTFREEestrespect.
ce moment, la page est marque non insrable et supprime de la liste des pages
disponibles(freelist).Desinsertionsdetuplesserontfaitesnouveaudanscettepage,
lorsque les suppressions ramneront le pourcentage doccupation de lespace sous la
barreduparamtrePCTUSED.

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

12 :89 Place initiale du tuple


derid=12:34

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.

Avec larbre dordre 3 de la Figure 7.7 ( 3 pointeurs et 2 valeurs de cl), la cl 9 est


ajoute pour fournir larbre suivantreprsent la figure 7.8. Le rquilibrage est
gnralementimmdiat,oulgrementdiffr,cestdirequilestfaitpratiquement
chaqueajoutoumodificationdansleBarbre.Eninsertion,letupleeststockdansune
page et sa cl insre dans la cellule approprie de lindex avec les divisions et les
migrationsdestuplesquimposentlesrglesdquilibre.Laprincipalecaractristiquede
cetarbreestquelesnudsinternescontiennentdespointeursauxtuplesetquelescls
nesontpasredondantesdanslesfeuilles.
Procdurealgorithmiquedinsertion
La cl dun tuple est insre en trouvant la cellule o elle devrait tre normalement
place.Silyalieu,ladivisiondelacelluleestfaiteetlaclladroitedelamdianeest
dplace au le niveau suprieur en utilisant la procdure dinsertion. Lopration est
rcursive.
Procduredesuppression
Lasuppressionduntupledansunecelluleconservecettedernireintactesilenombre
depointeursrsiduelestsuprieurp/2,opestlordredelarbre.

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.

CREATE TABLESPACE ESPACE_USER3 --commande pour le DBA


DATAFILE '/usr/users/fichier1.dbf' SIZE 25M
DEFAULT STORAGE INITIAL 50K NEXT 30K PCTINCREASE 0
MINEXTNENTS 1 MAXEXTENTS 100 ONLINE;

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.

Ventes: nom* article* qte* (tableenfant)


Serge a1 3
Ted a2 5
Andre a1 2
Serge a2 4
Erik a1 2
Serge a3 4
Valrie a7 3
Lucie a7 2
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7

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

Inventaire.article. Une transaction de vente est inscrite en notant le nom de lacheteur,


larticleetlaquantit.LacldelatableVentesestrenduevolontairementcomplexepar
labsence dun numro de transaction. Dans ce schma, elle est forme de tous les
attributs.

Inventaire: article* prixVente cout (tableparent)


a5 17 20
a1 10 5
a2 20 0
a7 15 15
a3 25 null
a16 46 34 +nouvelarticle
Figure7.9

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.

Transporteur: mat* nom volPass villeSS permis


f1 Flyer 200 Londres 235
f2 Inter 100 Paris 160
f3 Airqc 300 Qubec null
f4 Boac 200 Londres 190
f5 Delta 300 Boston 120

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

Pieces: noP* description km(K) poids villeP proprio


p1 aileron 8500 12 Londres f3
p2 moteur 9900 50 Paris f5
p3 porte 6000 17 Rome f1
p4 radar 8000 14 Londres null
p5 train 5000 78 Paris f2
p6 tlmtre 9000 36 Londres f2
Figure7.10

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.

Postes: noPoste* description


j12 grant
j34 lectricien
j98 null
j21 mcano1
j55 contrleur
j75 mcano2

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

Empl: noEmpl* nom prenom tauxH


P346 Audy Rudy 13.00
P456 Gagnon Andr 17.00
P345 Audy Michel 12.50
P651 Tremblay Robert 12.50
P762 Dussault Marc 13.25
P337 Brube null 12.50
P450 Dion Fabrice 13.25
P535 Joncas Sylvie 14.50
P800 Vanjulier Julie 19.50

Assignations: noPoste* noEmpl* debut quart


j12 P456 21jan1992 soir
j34 P651 22mar1991 jour
j21 P762 23dec1990 nuit
j34 P345 24sep1994 jour
j75 P346 12oct1997 null
j55 P456 25jan1994 jour
j34 P337 21jan1992 nuit
j75 P450 27jan1994 null
j34 P800 10nov1995 soir
*Indiqueunattributprimaire(i.e.unattributinclusdansunecl)
Figure7.11

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.

CREATE TABLE Inventaire (


article VARCHAR2(10) CONSTRAINT cp_inventaire PRIMARY
KEY,
prixVente NUMBER(5,2) NOT NULL,
cout NUMBER(5,2) null)
PCTFREE 20 PCTUSED 75
[TABLESPACE TS_donnees1]; --table stocke dans
TS_donnees1

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.

CREATE TABLE Transporteur(


mat CHAR(3) NOT NULL,
nom VARCHAR2(15) NOT NULL,
volPass NUMBER(3),
villeSS VARCHAR2(15),
permis CHAR(3) NULL,
CONSTRAINT pk_transporteur PRIMARY KEY (mat))
[TABLESPACE TS_donnees_user]; ****
-- [] signifie non ncessaire selon le cas. Les
donnes sont ranges dans le tablespace
TS_donnees_user

CREATE TABLE Pieces (

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

noP CHAR(2) NOT NULL PRIMARY KEY,


description VARCHAR2(15) NOT NULL,
km NUMBER(4)NOT NULL,
poids NUMBER(2)NOT NULL,
VILLEP VARCHAR2(15) NOT NULL,
proprio CHAR(3) NULL,
CONSTRAINT fk_transporteur_pieces FOREIGN KEY
(proprio)
REFERENCES Transporteurs(mat))
[TABLESPACE TS_donnees_user];

CREATE TABLE Empl(


NOEmpl CHAR(4) NOT NULL PRIMARY KEY, -- si cl simple
nom VARCHAR2(35) NOT NULL,
prenom VARCHAR2(25) NULL,
TAUXH NUMBER(5,2) NOT NULL check(tauxH > 10.00))
TABLESPACE TS_donnees_user;

CREATE TABLE Postes(


NOPoste CHAR(3) NOT NULL PRIMARY KEY,
description VARCHAR2(45) null)
[TABLESPACE TS_donnees_user];

CREATE TABLE Assignations (


NOPoste CHAR(3) NOT NULL,
NOEmpl CHAR(4)NOT NULL,
debut DATE NOT NULL,
quart VARCHAR2(6) NULL,
CONSTRAINT cp_Assignations PRIMARY KEY (noPoste,
noEmpl),
CONSTRAINT fk_Assignations_empl FOREIGN KEY(NOEMPL)
REFERENCES EMPL (noEmpl),
CONSTRAINT fk_Assignations_postes FOREIGN KEY
(noPoste) REFERENCES Postes (noPoste)) TABLESPACE
TS_donnees_user;

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.

CREATE TABLE Employe (


nom varchar2(50) NOT NULL,
noEquipe number(4) NULL,
. . . )
Constraint U_NoBinome UNIQUE(nom, noEquipe)
);

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.

CoursHoraire(noCours*, section*, professeur)


ChoixCours(matricule*, noCours*, section)

Create table ChoixCours(

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

matricule char(3) NOT NULL,


noCours char(6),
section number(1),
constraint cp_choix_cours primary key (matricule,
noCours),
CONSTRAINT fk_choix_cours_cours_horaire
FOREIGN KEY(noCours, section)
REFERENCES CoursHoraire(noCours, section);

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.

NO ACTION : Si une modification (DELETE ou UPDATE) viole la contrainte


rfrentielle,lamodificationestrefuseoudfaite(actionpardfaut);

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:

(5) SELECT slectiondesattributs(alias)deprojection.


(1) FROM pour nommer la ou les relations en jeu dans le calcul de la rponse. Ces
relationssontdesvues,desrelationsdebaseouuneexpressiondetable.
(2) [WHERE] prdicat (formul au besoin avec une sousrequte) de slection ou de
jointure.
(3) [GROUP BY ] pourgrouperlestuplesselondesattributs.
(4) [Having] pour filtrer les groupes retenir sur la base dun prdicat sur le
groupe.
(6) [ORDER BY] pourtrierlestuplesdelarponsesurlesattributs(incluantlesalias)
prsentsdanslarponsecalcule.

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

dexcution dune requte soustend celui de lexcution de lexpression algbrique


correspondante.Ledbutestmarquparltape(1),pourseterminerparltape(6),soit
le tri du rsultat. Les oprations pour la mise jour de lextension dune relation sont
implmentessousformedordresDMLdontlasyntaxeestrelativementsimple:

INSERTINTO<relation>VALUES(...);
UPDATE<relation>SET<attribut>=valeurWHERE<prdicatdeslection>;
DELETE<relation>WHERE<prdicatdeslection>;

Les commandes de mise jour (UPDATE et DELETE) soustendent au pralable une


rechercheavecleprdicatformuldansleWHERE,suiviedelamodificationdestuples
trouvs. Les clauses DDL et DCL sont couramment ajouts aux clauses du DML pour
formerunlangagededonnescompletausensdelanormeISO.
Modledexcutiondunerequte
Lexcutionlogiquedelarequtedbuteparlecalculdessousrequtesquisontdfinies
parlaclauseFROMet/ouWHERE,etcelapourobtenirunetableouunscalaire.Dansle
cas dune sousrequte corrle, i.e. qui contient un prdicat faisant rfrence un
attribut de la requte parent, elle devra tre recalcule pour chaque tuple slectionn
danslatableparent,soitcelleformuleparlaclauseFROM.

Lexcution de lexpression de table annonce dans le FROM est effectue en filtrant


immdiatementchaquetupledelatableparleprdicat.Encefaisant,onvitelecalcul
inutiledaumoinsunetableintermdiairequipeutdevenirtrsvolumineuse.Cecalcul
peutfairerfrenceplusieurstablesdebasesileFromsoustendunejointure.

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)

START WITH condition

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

(3) UNION SELECT


(4)

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:

SELECT ville FROM Employe


WHERE nom in ('Jacques', 'Laurence', 'Marie-Claude')
--numration
Lensemblenumrestcalculuneseulefoisparlasousrequte.
SELECT ville FROM Employe
WHERE nom IN (SELECT nom FROM Etudiant WHERE age >
25);
-- prdicat dinclusion avec calcul par sous-requte)
Slection(ourestrictiondelextension)
Les slections cidessous utilisent la base de donnes BD1. A chaque fois quun mme
attributapparatdansplusdunerelation,ilfautleprfixerparlenomdelarelationet
cela, pour viter toute ambigut pour linterprteur. Pour quelques clauses SQL,
lexpression algbrique correspondante sera formule pour illustrer le passage de
lalgbreaulangageSQL.
7.8ExpressionsalgbriquesetrequtesSQL
TouterequteSQLcorresponduneexpressionalgbriqueetviceversa.

Listerlesarticlesvendusjusqucejour.
Lexpressionalgbriquecorrespondanteestuneprojectiondunetabledebase.

article (Ventes)

EnSQL,cetteprojectionsetraduitparlalistedesattributsdelaprojectionplacedansla
clauseSELECT.
SELECT article
FROM Ventes;
Laprojectionsupprimelesdoubletsdelarponse,tandisquelacluseSQLSELECTci
dessusnelefaitpasmoinsdyajouterlemotclDISTINCT.

SELECT DISTINCT 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 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';

/*(prsume un type varchar2 pour article)*/

Ventes: nom* article* qte*


Serge a1 3
Ted a2 5
Andr a1 2
Serge a2 4
Jocelyn a1 2
Serge a3 4
Valrie a7 3
Lucie a7 2
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7
Figure7.15

d)Listerlenomdesacheteursdelarticlea2avecunequantitsuprieureougale3.
Lexpressionalgbriquepourcalculercetterponsecomprenduneslectionexcuteen
premier,suivieduneprojectionpourneconserverquelesattributsdemands.
nom(Ventes.article =a2and qte >= 3(Ventes))

CetteexpressionestconvertieenSQLtrsfacilement:leprdicatdeslectionapparat
dansleWHEREetlalistedesattributsdeprojectionestajouteauSELECT.

SELECT DISTINCT Ventes.nom


FROM Ventes WHERE article = 'a2' and qte >= 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
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 '\' ;

N.B. Le caractre \ prcde un caractre spcial (soit le _) pour indiquer au systme


quildoittrelucommeunlittral.Finalement,danslaversion10getlessuivantesles
expressionsrguliressontinclusesettraiteslorsdelarechercheparOracle.

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

h) Lister les articles en inventaire et dont le prix de vente est entre 10 et 20 $


inclusivement:
SELECT article
FROM Inventaire
WHEREprixVenteBetween10and20;Bornesincluses

noter que la ngation du prdicat se formule simplement par le NOT BETWEEN et
permet de tester lexclusion de la valeur de lattribut de chaque valeur de lintervalle.
Pourqueleprdicatsoitvraiilfautquelaborneinfrieuresoitpluspetitequelaborne
suprieure.

Voicidautresformulationscorrectes,maisqui seronttransformesparloptimiseurdu
SGBD:
avecleprdicatOR:
prixVente = 10 or prixVente = 11 Or ...prixVente = 20

Aprstransformation: prixVente BETWEEN 10 And 20

aveclangation:
NOT (prixVente = 10 or prixVente = 11 or ...prixVente
= 20)

Aprstransformation: prixVente NOT BETWEEN 10 and 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

(nom = 'Serge' or nom = 'Valrie' or nom = 'Ted')

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.

SELECT DISTINCT nom


FROM Ventes;

Quelestlersultatdelaclausecidessous?
SELECT DISTINCT nom, article
FROM Ventes;

Les doublets sur les attributs nom et article (en tant que tuple de la rponse) sont
supprims.

k) Lister en ordre alphabtique croissant de nom, les transactions de vente concernant


lesarticlesachetsenquantitplusgrandequetrois.

SELECT article, nom, qte


FROM Ventes WHERE qte > 3
ORDER BY nom ASC;

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

SELECT 'F' SELECT 'F'


FROM DUAL FROM DUAL
WHERE 'Y' = NULL; WHERE NULL = NULL;
-- aucun rsultat ! -- aucun rsultat !

SELECT 'F' SELECT 'F'


FROM DUAL FROM DUAL
WHERE NULL IN WHERE'a' IN ('b', null);
('A','B',NULL); -- aucun rsultat
-- aucun rsultat !
Figure7.16

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;

La norme SQL92 introduit aussi de nouveaux prdicats du genre IS TRUE, IS


UNKNOWN et IS FALSE. Ils permettent de tester la valeur de vrit dune condition
pourchaquetupledunetable.
SELECT *
FROM Usine
WHERE (production >200 And ville = 'Qubec') IS
UNKNOWN;

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:

Atelier (noAtelier*, chef, site, debit, volume, classe,


noUsine,specialite, dateOuverture)
Specialite (specialite*, classe, description)
Usine (noUsine*, libelle, adresse, ville, codePostal, production)
Ouvrier (nas*, nom, age, dateEmb, noAtelier)

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

SELECT volume * 1.5


FROM Atelier
WHERE debit <= 500 * .6;
Lexpressionarithmtiqueestvalueunefoisaudbutdutraitementdelarequte.

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

SELECT volume * 1.5


FROM Atelier
Where debit > volume * .2 ;

Une expression complexe est construite en combinant plusieurs expressions au moyen


desoprateurssuivants:
Oprateursarithmtiques:+,,*,/;Exemplevaluepourchaquetupletest:(tarif*
heures*52)/(1.8*bonus)
- Oprateurdeconcatnation: ||
Exemple : nom || '--' || adresse /* insertion de deux tirets

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.

LENGTH(adresse || ville) SUBSTR(code_postal, 1,3)


Trunc(salaire * 1.2, 0) Round(salaire,0)--arrondi
Trunc(date_in, 'YYYY' )

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

SELECT DateE + 3 DAYS /* ajout des jours une date


*/

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');

La fonction TRUNC() permet de tronquer la date conformment au masque et enlve


touteslesautrespartiesinclusesdansladate.

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.

6 Expression incluant une variable denvironnement ou une fonction particulire sans


argument.
Voiciquelquesfonctionssansargument:CURRENTDATE;CURRENTSERVERUSER,
USERimplmentesdanscertainsSGBD:
SELECT A.volume * 1.5
FROM Atelier A, Ouvrier O
WHERE A.noAtelier = O.noAtelier and O.dateEmb = CURRENT
DATE;

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

SELECT U.production, cast(A.debit as integer) * 3


FROM Usine U, Atelier A
WHERE Cast(ville as varchar2(25))='Qubec'And U.noUsine =
A.noUsine;

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.

SELECT O.nom, A.noAtelier


FROM Atelier A, Ouvrier O
WHERE A.dateOuverture = CAST(O.dateEmb as Date);

SELECT CAST(nom as varchar(50) [as] nomFamille


FROM Ouvrier
WHERE age < 30;

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

OuvrierUsine: nas* usine OuvrierChantier: nas* chantier


234 u1 873 C500
456 u2

Larponserechercheestunetablede3colonnes,puisquelesattributsusineetchantier
nesontparentirementcompatibles.

nas* usine chantier


234 u1 null
456 u2 null
873 null C500
Figure7.16g

Poureffectuerunetelleunionetobtenirlalistedemande,ilfautavoirunecompatibilit
desschmas.IlyauradoncaugmentationduschmadeOuvrierUsineeninsrantune
colonnedindicateursdenullstypscommeunechanevarchar(4).Ilenserademme
avecOuvrierChantier.Larequtesuivantedevientdonccalculable:

SELECT nas, usine, CAST(NULL as varchar(4))


FROM OuvrierUsine
UNION
SELECT nas, CAST( NULL as varchar(2)), chantier
FROM OuvrierChantier;

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.

SELECT nas, CAST(usine as varchar(4)) [as] lieu_de_travail


FROM OuvrierUsine
UNION
SELECT nas, chantier as varchar(4) [as] lieu_travail
FROM Ouvrier_Chantier;

rponse: nas lieu_travail


234 u1
456 u2
873 500<chantier

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.

Voici quelques exemples de requtes comprenant une sousrequte mais sans


corrlation.
a)Listerlenomdespersonnesquiontachetdesarticlesquinesontpluseninventaire.
Pourcalculercetterponse,ilyadabordprslectiondesarticlesencoreeninventaire
(dontlecotnestpasnul),formuleparunesousrequte.Laffichageestfaitavecjuste
les attributs de la relation du bloc 1. Les articles vendus sont slectionns que sils ne
sontpasinclusparmiceuxencoreeninventaire.

SELECT nom
FROM Ventes
WHERE article NOT IN <-- prdicat dinclusion
(SELECT article
FROM Inventaire
WHERE cout is NOT NULL);

Le calcul de la sousrequte (de niveau 2) est entirement effectu (matrialis) avant


celuidelarequteprincipale.Eneffet,lasousrequtenerenfermeaucunattributglobal
etsoncalculfournitunetabledontlecontenuestconstantpourcetterequte.Cersultat

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.

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
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7
Figure7.17

Voici un autre exemple de la formulation de la jointure en SQL92. Le mot cl JOIN


permetdexprimerexplicitementlanotiondejointure:

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.

SELECT ArtProfit.marge, Count(ArtProfit.article)


FROM (SELECT article, round((prixVente - cout),0) AS marge
FROM Inventaire WHERE prix_vente > cout) as ArtProfit
GROUP BY ArtProfit.marge;
ALLetANYetunensembledevaleurs
LemotclALLsignifiepourchaquevaleuroupourchacunedesvaleursetANY,avec
lesensdeSOME,signifiepouraumoinsunevaleurslectionneparlasousrequte.Si
la sousrequte identifie au moins un tuple, elle est value TRUE, sinon elle est
valueFALSE.Cetoprateurindiquecommentlesvaleursretournesparunesous
requtesontprisesenconsidrationparleWHEREdelarequte.

Exemples:
a)Listerlesarticlesdjvendusenquantitinfrieureougalecellesdesventesfaites
pourlarticlea2:

SELECT distinct article


FROM Ventes
WHERE qte < all(SELECT qte FROM Ventes WHERE article = 'a2');

nom* article* qte* tableT: qte


Serge a1 3 5
Ted a2 5 4
Andr a1 2
Serge a2 4
Jocelyn a1 2 rponse: article
Serge a3 4 a1
Valrie a7 3 a7
Lucie a7 2 a5
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7
Figure7.18

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.

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

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

SELECT nom, tauxH


FROM Empl [as] E
WHERE NOT EXISTS (SELECT *FROM Assignations [as]
WHERE E.noEmpl = A.noEmpl);
Un alias de relation peut tre utilis pour remplacer le nom dune table de base de
donnesdansuneclauseWHERE.Danscecas,laliasprfixeunattributglobal.

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:

Rtemp (noEmpl, nom, tauxH, noPoste, noPoste, titre)

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.

Atelier (noAtelier*, chef, site, debit, volume, classe, noUsine,


noSpecialite)
Specialite (noSpecialite*, classe, description)
Usine (noUsine*, libelle, adresse, ville, codePostal, production)
Ouvrier (nas*, nom , age, dateEmb, noAtelier)

CREATE VIEW Ancien (noAtelier, age_moy_at) AS


SELECT noAtelier, AVG(age) [as] age_moy_at
FROM Ouvrier
GROUP BY 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 57

Larequtesuivantepermetdafficherlenumrodesateliersolgemoyendesouvriers
estsuprieurlgemoyendesouvrierspeuimportelatelier.

SELECT noAtelier
FROM Ancien -- rfrence la vue relationnelle
WHERE age_moy_at >(SELECT AVG(age_moy_at) FROM Ancien);

Le calcul de la rponse soustend la cration dune vue correspondant une table


temporaire.Lorsdesaformation,ilyaaccsaucataloguedusystmeetcalculdelavue
(matrialisation)pourchaquerfrencecellecidansuneclauseSQL.
Dans lexemple cidessus, il y a deux rfrences la vue relationnelle Ancien, qui
entranent normalement deux matrialisations de la vue. De plus, entre les deux
matrialisations, une mise jour peut tre faite sur la base de donnes par une autre
application changeant lextension de Ancien. Pour viter ce double calcul et
lincohrence de lecture, le systme DB2V2 exploite la notion dexpression de table
partage.Ilsagitdelafactorisationdelavuedansuneclausequidbuteaveclemotcl
WITHplacentoutdbutdelarequte:

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.

parent: nas* pren nase* prene


50 Paul 55 Lise
55 Lise 65 Jacques
65 Jacques 75 Patricia
65 Jacques 95 Sylvie
95 Sylvie 185 Andr
55 Lise 100 Luce
100 Luce 200 Rene
Figure7.20

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

Les structures arborescentes peuvent reprsenter diffrentes situations comme la


gnalogie des personnes, linclusion des parties dans un tout, la composition dun
quipement form avec des composants mcaniques ou la hirarchie des postes dans
uneorganisation.Voiciunexempledunetablereprsentantlahirarchieparentale.

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

200,Rene 75,Patricia 95,Sylvie

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

le prdicat CONNECT BY et ne sont retenus dans la rponse que sils vrifient le


WHERE. Lopration recommence pour trouver les enfants de ces tuples, et ainsi de
suite. La condition darrt est vrifie lorsquil ny a plus de tuples parentaux dans
setD*,cestdirequaucuntupledesetD*aunenfant.
Algorithmedecalculdunerequtehirarchique
Danscetalgorithme,ilyadeuxmtafonctions:
f_enf(t)etf_start(p)ainsiquunevariabledetuplet.
f_enf(t): fournit les tuples enfants (par le CONNECT BY) du tuple
t.
f_start(p): fournit les tuples de D qui vrifient le prdicat p
dans R;

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;

LEVEL NAS NASEENF(aliasdeNASEE)


1 55 65
1 55 100
2 65 75
2 65 95
2 100 200
3 95 185

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?

Produit: noProd* composante* qte


p1 p22 2
p1 p23 3
p20 p26 6
p20 p34 4
p2 p33 3
p23 p20 2
Figure7.23a

Une requte dexploration pseudo rcursive est toute dsigne pour effectuer cette
recherche.

SELECT LEVEL, noProd, composante


FROM Produit
Start with noProd = p1
Order by Level;
Larponseestconstituedespices:{p1,p22,p23,p20,p26,p34}.
7.14RcursivitavecleSGBDDB2V2
Une expression de table en DB2V2 a une autre proprit trs importante, soit la
rcursivit dont elle peut tre lobjet dans sontraitement.En effet, une telle expression
peuttredfinieenserfrantellemme.Parexemple,sidanslarelationOuvrieron
ajoutelattributnasChef,ildevientpossiblededemanderquelssontlesouvriersquisont
sous la supervision directe ou indirecte du chef Patronet dont le nas est n1. En effet
Patronet peut superviser directement lemploy Guy qui supervise lemploye
Patricia qui son tour supervise lemploy Julien. La rponse la premire question
estdonclensemblesuivant{Guy,Patricia,Julien}

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:

WITH Supervises (nas) AS <-- ensemble de dpart


(SELECT nas -- requte initiale
FROM Ouvrier O
WHERE O.nasChef = 'Patronet')
UNION ALL
(SELECT O.nas <-- requte rcursive
FROM Supervises [as] S, Ouvrier [as] O
WHERE O.nas = S.nas);

SELECT nas <-- requte finale


FROM Supervises;

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.

Fonction numrique Description


ABS(n) Valeurabsoluedunombren
CEIL(n) Plafonddunevaleurrellen
MOD(m,n) Lemodulo:lerestedem/n
GREATEST(v,w) Laplusgrandedesdeuxvaleursvetw
LEAST(v,w) Lapluspetitedesdeuxvaleursvetw

Fonction numrique Description


POWER(m,n) Exponentiation:mn
ROUND(m,n) Arrondidunombremavecnchiffresaprslepoint.
SQRT(m) Racinecarredem
TRUNC(m,n)** Troncature du nombre m n chiffres dcimaux; ** si m
estunedate,alorspourn=0,suppressiondelapartiedu
temps:hh:mm:ss
Figure7.24

**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;

Rp: 24112000 le temps est absent de la rponse, car il a t supprim par la


fonctionTrunc().

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

SELECT article, SQRT(prixVente - cout) [as] marge


FROM Inventaire
WHERE cout > 10.00;

Remarque: La marge bnficiaire est gale la diffrence entre le prix de vente et le


cot de larticle. Cette diffrence est calcule pour chaque tuple slectionn par le
prdicatdelaclauseWHERE.
b)Afficherlenomdesarticleseninventairedontlecarrdubnficeestcomprisentre
5$et15$.
SELECT article
FROM Inventaire
WHERE POWER((prixVente - cout), 2) between 5 and 15;

c)Afficherlemontanttotaldelaventede23articlesauprixde45$lunit.Pourobtenir
larponse,ilfauteffectuerunesimplemultiplicationenutilisantlatableDUAL:

SELECT 23 * 45.00 -- simple multiplication avec


affichage
FROM DUAL;--table fictive ayant le type table par SQL

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

Lappel de la fonction et lvaluation de lexpression sont faits pour chaque tuple de la


tableInventaire.

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

SELECT article, Greatest (prixVente,cout)


FROM Inventaire ;
FonctionsSQLpourleschanes
Unseuloprateurdechaneestdfinidanslelangage,soitceluidelaconcatnation(||).
Cest un oprateur binaire dont les oprandes peuvent tre une expression simple ou
complexe,dontlvaluationfournitunechane,i.e.uneconstantedechane.Cependant,
plusieursfonctionsdechanesontimplmentesdanstousleslangagesdedonnes.

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

LENGTH(ch1) Longueur de la chane ch1. Le caractre NULL noccupant


aucunespacepourlafonctionLENGTH.
REPLACE(ch1,si,par) Retourne ch1 dans laquelle toute occurrence de si est
remplaceparcelledepar(N.B.parpeuttreunnull).
TO_NUMBER(ch1[,fmt[,nls]]) Transforme la chane ch1 reprsentant un nombre dont le
formatpeuttredonnparfmt.
Figure7.25

Lgende:
ch1,ch2,par:pourchanedecaractres; npourunentier;
setvar=jeudecaractres(constantedechane) pos:positiondanslachane
fmt=formatdelachane nls:paramtredelanguenationale

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;

d) Afficher en minuscules le nom des employs dont la premire lettre est un T et


complterparlagaucheavecdestiretsdemanireafficherautotalunechanede30
caractres.

LafonctionRTRIM()permetdesupprimerparladroitelescaractresjusquaupremier
absentdelalistefourniecommedeuximeargument.

SELECT LPAD(nom,30,' ')),


FROM Empl
WHERE SUBSTR (nom, 1,1 ) = 'T';

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

e) Afficher le numro et le nom des employs dont le nom a une prononciation


similaireDurandetdontlalongueurestinfrieure25caractres.
SELECT noEmpl, nom
FROM Empl
WHERE SOUNDEX(nom) = SOUNDEX('durand') and LENGTH (nom) < = 25;
proposducodeSoundex
LalgorithmegraphicophontiqueSoundexatproposilyaquelquesdcenniespar
MargaretK.etRobertC.Odell(1918) 9 danslebutdefaciliterlarecherchedesauteurs
dans les catalogues de bibliothques lorsque lorthographe du nom de famille tait
imprcise. Il consiste gnrer une signature Soundex pour un nom et ses graphies
similaires. Lobjectif tait de pouvoir rechercher un nom dont lorthographe imprcise
fournissaitunephontiquesimilairelagraphiecorrectedunom.Laprononciationde
Smith et Smithes ou de Durant et Durand est similaire, mais la graphie est diffrente.
Sonefficacitestvariableetdpenddelanatureetdelemplacementdesmodifications
ou des omissions qui peuvent tre au dbut ou la fin du nom. Plus le nom est long,
pluslasignatureregroupecorrectementlesnomserronsdontlesdiffrencessesituent
la fin de la chane. Il est efficace pour la langue anglaise, notamment les versions
avances du Soundex, et un peu moins pour le franais poour lequel des algorithmes
modifis ont t proposs rcemment. Il peut tre utilis avec certaines langues non
romanises la condition de redfinir les familles phontiques. Plusieurs versions
amlioresetadaptesonttproposesparRussell10,etplusrcemmentparBairdde
GeorgiaTech11etparPhilips12.

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.

Exemple: Langue Code_S Code_C


anglais Rogerson R262
Rogerson R262
Rogers R262 <
Roger R260 <
Rodger R326 <
franais Durant D653
Durand D653 <
Duran D650 <
Figure7.25a

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 (debut, 'DD-MON-YYYY')


FROM Empl
WHERE quart = 'soir' ;

Pour afficher le mois en franais lorsquil a t enregistr en anglais, il faut utiliser le


masquedelafonctionTo_Char().

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.

Il est aussi possible dinclure le temps rel en spcifiant le paramtre


NLS_DATE_FORMAT comme tant DDMMYYYY HH:MI:SS. Ainsi, linscription
dune date par la fonction SYSDATE inclut aussi le temps courant. Ce paramtre peut
tre temporairement chang pour la dure dune session avec la commande ALTER
SESSION. Il est possible de connatre la valeur courante de ce paramtre dfini dans
linstanceenconsultantlatableGV$NLS_PARAMETERS.

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS' ;


INSERT INTO Ouvrier ('200056345','Vzina,'Claude','M',
'33.8',SYSDATE,'u12', 'ps75'); -- temps est insr avec SYSDATE
--25-DEC-1999 23:54:49 ( l'interne) ;

SELECT TO_CHAR(dateP,'DD/MM/YYYY HH:MI:SS')


FROM Tplan_Mois;

rponse --> 22/02/1998 23:11:56 --le temps est affich

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:

INSERT INTO TABLE1 Tplan_Mois


('machine2376',To_Date('24-01-1998','DD-MM-YYYY'));
Il est cependant toujours possible dinsrer le temps courant en utilisant le gabarit
appropri.

INSERT INTO TABLE1 Tplan_Mois


('machine2376',To_Date('24-01-1998','DD-MM-YYYY HH:MI:SS'));

Il est aussi possible de changer temporairement ce format par dfaut en utilisant le


paramtreNLS_DATE_FORMAT.
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

SELECT TO_CHAR(datep, 'dd-mm-YYYY hh:mi:ss')


FROM Tplan_Mois;

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.

lments Exemplesdemasque Exempledesortie


YYYY YYYYMM 199412
MM MM 12(moisdedcembre)
DD YYYY/MM/DD 1994/12/22
MON MONDDYYYY DEC221994
MONTH MONTH**DD FEVRIER**24
Figure7.28

O les caractres , . / et \ sont des caractres littraux du masque reproduits


intgralementdanslersultatdelafonction.
Exemple:
TO_DATE(dateIn,MM//YYYY)Lafonctionretourne:11//1998
Transformationdunedateexterneenformatinterne
Unedateenformatexterneeststockedanslabasededonnesavecunformatinterne
trs particulier. Il faut donc convertir le format lors de lcriture et de la lecture dun
attribut du type date. La fonction To_Date() transforme une date de format externe en
unedatecodeenformatinterne:
To_Date(chane, masque [,nlsp])

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*/

TRUNC(dateP) /*retourne seulement la partie date de lattribut datep. Le temps est


supprimdeladate*/
Transformationdunedateduformatinterneversunechanedecaractres
Cettetransformationconsistepasserduformatinternedeladateenunformatexterne
utilisparuneapplication.

TO_CHAR (attribut, masque [, nlsp])


o
attribut:attributdutypeDATEdansunerelation
masque:formatdedatepourlachanedsortie
nlsp: spcification de la langue nationale (american, french, english,....) pour
lexpressiondumois.

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:

SELECT nom, noPoste, ROWIDTOCHAR(ROWID)


FROM Empl E, Assignations A
WHERE E.noPoste= A.noPoste and

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.

CREATE FUNCTION Profit (prixVente IN real, cout IN real)


return real
is diff real;
BEGIN
diff := prixVente - cout;
return (diff);
END Profit;
.

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 OBJECT_NAME, OBJECT_TYPE


FROM USER_OBJECTS;

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.

CREATE FUNCTION LONGC(nom IN varchar2) return number


IS
nom_fam Ouvrier.nom%type; /* type de nom_fam quivalent
celui dfini dans le dictionnaire pour nom */
lon number :=0;
BEGIN
nom_fam := REPLACE(TRANSLATE(nom,'aeiouy','2'),'2', null);
lon := LENGTH(nom_fam);
return(lon);
END;

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;

La dfinition de nouvelles fonctions permet au dveloppeur de rutiliser le code dj


testetdacclrerledveloppementdesapplications.
7.17FonctionsSQLdiverses
FonctionNVL()
LafonctionNVL()permetdesimulerlalternativeetdetraiterlavaleurnulle.
NVL(expr1,expr2)

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.

SELECT noEmpl, NVL(quart,'quart_libre')


FROM Assignations;

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)

SELECT matricule,CONCAT(decode(sexe,F,Mme,M ,Mr


,?),nom)
FROM Employe
WHERE (salaire /12) > 3450.00);
FonctionSIGN()
LafonctionSign(n)valuelenombren.Sinestpositif,elleretourne+1;sinest0,elle
renvoie0;silavaleurestngative,lafonctionretournelavaleur1:
Voici une requte plus complexe qui utilise la fonction SING(n) pour augmenter de
moitilesalairedesemploysdemoinsde45ansdontlesalaireactuelestsuprieur15
000$etpourdoublerlesalairedeceuxquigagnentmoinsde15000$.

SELECT noDep, Sum(Decode(Sign(salaire-15000),+1, salaire*1.5,-1,


salaire *2, salaire))
FROM Employe
WHERE age < 45;
COALESCE()
Cette fonction a un nombre variable de paramtres typs; elle retourne la valeur du
premier paramtre parmi ceux de la liste dont la valeur est non nulle. Par contre, elle
retournelavaleurNULLsitouslesparamtressontnulsaprsleurvaluation.

Soit A, B, C dont les valeurs sont respectivement 5, 3, 4. Lexcution de la fonction


COALESCE(A,B,C)retourne5avecuntypecorrespondantceluiduparamtretyp
ouceluiobtenuaprsconversion.AinsisiAesttypFloat(2,2),BesttypFloat(5,2)et
Cesttypentier,lersultatdelafonctionsera5,etlavaleurtypeFloat(5,2).

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

smallint> integer> decimal> double


char varchar> longvarchar> cblob
graphic> vargrahic> longvargraphic> dbclob
blob> blob cibleidem
date> date cibleidem
time> time cibleidem
timestamp> timestamp cibleidem

ExempleavecDB2V2
SoitleschmadelarelationUsineProdcomprenantlesattributstypscidessous:

UsineProd(no_us char(2), production integer, cMateriau decimal(6,1), coutTot decimal


(4,2))

UsineProd: noUs production cMateriau coutTot


u2 25 234.2 456.78
u1 null 1764.8 null
u3 null null 876.41
u5 1 1 1

N.B. la valeur 1 pour lattribut production signifie que lon ignore sil y a eu une
productionlusine,tandisqueleNULLsignifiequelaproductionaeulieu,maiselle
estnulle,i.e.napastgarde.

SELECT noUsine, COALESCE(production, c_materiau, cout_tot) pmc


FROM Usine_Prod
WHERE no_us IN ( 'u1', 'u2', 'u3', 'u4', 'u5', 'u6');

Larponseestlasuivante:

nomUs pmc typedursultat


u2 25.0> letypeestdcimal6.1
u1 1764.8> letypeestdcimal6.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
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;

Remarque: Largument du GROUP BY doit inclure obligatoirement tous les attributs


prsentsdansleSELECT,saufceuxtraitsparunefonctiondanslaclausede1erniveau.
Cettefonctiondegroupementestexcuteaprslaslectionetlaprojection.Leschma
de la rponse est form des attributs de la fonction de groupement plus ceux des
fonctionsdagrgation.Lesarticlesvendusencoreeninventairesontregroupsparnom
dacheteuretlasommeestcalculepourchaquegroupe.

b) Lister les transactions de Ventes (tous les attributs) concernant les achats darticles
effectusavecunequantitgalelaquantitmaximumdjvenduepourcetarticle.

SELECT article, qte, nom


FROM Ventes
WHERE (article, qte) IN -- notez l'usage des
parenthses
(SELECT article, max(qte)
FROM Ventes
GROUP BY article);

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

La sousrequte est calcule en premier; lextension de Ventes fait lobjet dune


projection et le rsultat est tri pour former des groupes virtuels au sein de la seule
relation intermdiaire constitue des tuples forms avec les articles et les quantits
maximales pour chacun. Le prdicat dinclusion du premier WHERE utilise un tuple
commeargument.

nom* article* qte* article* max(qte)
Serge a1 3 a5 3
Ted a2 5 a2 5
Andr a1 2 a7 5
Serge a2 4 a3 6
Jocelyn a1 2 a1 7
Serge a3 4
Valrie a7 3
Lucie a7 2 rponse article qte nom
Serge a5 3 a1 7 Serge
Serge a7 5 a2 5 Ted
Christine a3 6 a3 6 Christine
Serge a1 7 a5 3 Serge
Figure7.30
Larponsesoustendlechoixdetuplesenfonctionduneconditionquiestvalueau
regardducontenuduneautretable.Cestenquelquessorteuneexpressiondejointure.

FormulationduGROUPBYavecunefonction
Le GROUP BY peut contenir un ou plusieurs attributs ou des fonctions. Lorsquil
contient une fonction, celleci doit tre en tout point identique la mme fonction qui
apparatdansleSELECT.
SELECT sum(QTE), TO_CHAR(dateDebut,'YYYY-month')as mois_an
FROM Production
WHERE TO_CHAR(dateDebut,'YYYY') = '1998'
GROUP BY TO_CHAR(dateDebut,'YYYY-month')
ORDER BY To_Date(TO_CHAR(dateDebut,'YYYY-month'),'YY-MM');

Une petite diffrence syntaxique rend lexpression du groupement inacceptable pour
lanalyseursyntaxique!

SELECT sum(QTE), TO_CHAR(dateDebut,'YYYY-MONTH')as mois_an
FROM Production
WHERE TO_CHAR(dateDebut,'YYYY') = '1998'
GROUP BY TO_CHAR(dateDebut,'YYYY-month')
ORDER BY To_Date(TO_CHAR(dateDebut,'YYYY-month'),'YY-MM');

La diffrence syntaxique apporte par le gabarit month crit en minuscules invalide
lexpression du GROUP BY ! Notez aussi que, si le groupement doit utiliser une vue

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.

CREATE OR REPLACE view V2 [as] SELECT Trunc(dateP), sum(QTE)


FROM Production;
Groupementavecunevuerelationnelle
Legroupementutilisantunevuedoitdfinirunlibellsimpleouunaliaspourchaque
colonnedelavue.Lerenommagedelacolonnedunevuetransformeparunefonction
estobligatoire.

Create or Replace view V2 [as]


SELECT Trunc(DATEP) [as] dateProduction, Sum(QTE) [as]
total_production
FROM Production
Group By Trunc(DATEP);

LesaliaspeuventtrelobjetdunerfrencedansuneclauseSQL:

SELECT dateProduction, total_production


FROM V2
WHERE Trunc(dateP), = Trunc(SYSDATE);
7.19.2Regroupementavecfiltrageconditionneldesgroupes
Lestuplesslectionnsdansunepremiretapeformentunetabletemporaireauseinde
laquelle les tuples sont partitionns par le GROUP BY. Une partition nest conserve
danslarponsequesilaconditiondefiltrageexprimeparleHavingestvrifie.

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

SELECT NOM, Count(nom) [as] Total


FROM VENTES
WHERE article in (SELECT article FROM INVENTAIRE
WHERE COUT is NOT NULL)
GROUP BY nom
Having Count(*) > 2;
ORDER BY Total;
Letrifinaldestuplesdelarponseesteffectuaprsladernireprojectiondesortequ
cemomentlaliasTotalestdfinietpeuttreutilisparletri.

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

noEmpl nom ville


995 Paul Qubec
995 Paul null

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;

La formulation demeure la mme, quil y ait un ou plusieurs attributs dans la jointure


naturelle.

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.

Postes (noPoste*, villePoste*, description)


Assignations(noPoste*, villePoste*, noEmpl*, debut, quart)

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

En algbre relationnelle la rponse serait obtenue simplement par la division


algbrique.
Ventes1**(article, nom) Inventaire1** (article)

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

WHERE I.prixVente < 35.00 and cout is NOT NULL)


GROUP BY nom
Having Count(DISTINCT V.article) =
(SELECT Count(DISTINCT article)
FROM Inventaire
WHERE prixVente < 35.0);

Inventaire: article* prixVente cout Count(DISTINCTarticle)
a5 12 8 4
(diviseur) a1 10 5
a2 20 15
a7 15 15 Nombredarticlesvendusmoinsde35$
a3 25 null
a16 45 34


Ventes: nom* article* qte*
Serge a1 3
Ted a2 5
Andr a1 2
HavingCount(*)=4
Serge a2 4
Jocelyn a1 2
Serge a3 4
Valrie a7 3
Lucie a7 2
Serge
Serge a5 3
Serge a7 5
Christine a3 6
Serge a1 7
Figure7.30a

N.B.Legroupementestfaitaveclattributdelarponseetlasousrequteestformule
aveclattributdudiviseur.Notezaussique lattributdudiviseuretceluidudividende
ntantpaslacl,ilfautsupprimerlesvaleursendoubleparlemotclDISTINCT.
LeHAVING Count() permetdegarderquelestuplesdesclientsquiontachettousles
articlesencoreeninventaireetdontleprixdeventeestinfrieur35$.

Si loprateur de division tait directement implment dans le langage ou disponible
comme une fonction en librairie, la formulation de la requte deviendrait relativement
simpleendpitdesacomplexitinhrente.
SELECT nom
FROM Ventes
WHERE FOR_ALL article in
(SELECT article FROM Inventaire
WHERE prixVente < 35.00 and 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 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.

Etudiant: nas* age noCours* frais Classe: noCours* prof


n20 23 ift5 50 ift5 Audy
n30 21 ift8 40 mat10 Gagnon
n40 19 art5 60 art5 Gagnon
n20 23 mat10 55 soc20 Laurence
n20 23 soc20 65 ift8 Bouquier
n20 23 art5 40 soc22 Dumas
n20 23 soc22 50
n25 22 art5 35
n50 20 mat10 45
n50 20 ift5 55
Figure7.30b

a Les cours dont il est question dans le dividende sont ceux choisis par les tudiants.
Cetterelationintermdiairepeuttrefournieparlexpressionalgbriquesuivante:
nas, noCours (Etudiant)

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.

3 Filtrer les partitions par un Having Count([distinct] <attribdiviseur>) qui utilise


lattributdudiviseur.LeDISTINCTestessentielsilattributdudiviseurnestpasaussila
cl.

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

( age > 22 and SUBSTR(noCours, 1,3)='ift' ( nas, noCours (Etudiant))

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

SELECT n5 /*vide car 'n5' pas acquis tous les articles */


FROM Ventes V
WHERE NOT EXISTS (
SELECT *
FROM Inventaire I
WHERE NOT EXISTS (
SELECT *
FROM Ventes X
WHERE X.article = 'a2' and X.nom = 'n5'));

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:

SELECT DISTINCT nom


FROM Ventes V
WHERE NOT EXISTS (
SELECT *
FROM Inventaire I
WHERE NOT EXISTS (
SELECT *
FROM Ventes X
WHERE X.article = I.article AND X.nom = V.nom)
) ;

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.

Exemple: SELECT nom


FROMVentes
WHERE FOR ALL Inventaire.article;

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.

SELECT V.article, I.prixVente


FROM Ventes V, Inventaire I
Where V.article = I.article(+) ;

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

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 a16 45 34
Valrie a7 3
Lucie a7 2 rponse: article prixVente
Serge a5 3 a1 10
Serge a7 5 a2 20
Christine a3 6 a7 15
Serge a1 7 a5 12
a3 null
Figure7.31a

Lajointureesteffectueselonlestermesdelaconditiondejointure,ensuitelestuplesde
larelationVentesnyparticipantpassontajoutslextensiondelarponse.Lersultat
fournit le nom et le prixVente des articles vendus, incluant ceux qui ne sont plus en
inventaire. Le (+) identifie la table qui fournit les valeurs nulles aux tuples ajouts,
lesquelssontconcatnsaveclestuplesdelatabledegauchequineparticipentpasla
jointure. Il y aura autant de (+) quil y a dattributs mis en relation par la condition de
jointure.Cependant,lagrammaireSQLimposeunecontraintequilimitelaparticipationdune
mmetableuneseulejointureexternedansunerequte.Silarequteexigeunedoublejointure
externe,ilfaudrasoitrenommerlatablersultatdelapremirejointureexterneparunalias,soit
restructurerlarequte.

EnSQL92,lasyntaxedelajointureexternegaucheestplussimpleetplusexplicite.

SELECT V.article, I.prixVente
FROM Ventes V LEFT OUTER JOIN Inventaire I
ON V.article = I.article ;

LaclauseONindiquelesattributsdejointurequipeuventavoirunlibelldiffrent.

7.23Jointuredroite(rightouterjoin)
Danscecas,ilyaajoutlajointure,lestuplesdelarelationdedroiteneparticipentpas
celleci.

Exemple:Listerlenometlecotdesarticleseninventairedjvendusetyajouterceux
quinesontpluseninventaire,quilsaienttvendusoupas.

SELECT article, cout
FROM Inventaire I, Ventes V
WHERE I.article = V.article(+) and 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 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)

La requte consiste lister le nas des employs et le nom du dpartement o ils


travaillent,enincluantaussilesemploysdontlenasestinconnuetquitravaillentdans
certainsdpartementsdontlenomestaussiinconnu.

(SELECT nas, nom


FROM Departement D, Employe E
WHERE D.noDep = E.noDep(+))
UNION
(SELECT nas, nom
FROM Departement D, Employe E
WHERE D.noDep(+)= E.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

WHERE qte >5)


INTERSECT
(SELECT article
FROM Inventaire
WHERE cout is NOT NULL);
7.25Diffrence
Cet oprateur calcule tous les tuples dun premier ensemble qui ne sont pas dans un
deuxime ensemble. Par exemple, pour trouver les articles en inventaire encore
invendus,ilsuffitdexcuterlaclausecidessous.
(SELECT article
FROM Inventaire
WHERE cout is NOT NULL)
MINUS
(SELECT article
FROM Ventes);

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.

GRANT SELECT,DELETE, UPDATE ON Empl TO util3 [With Grant Option]


Danscetexemple,loption[WITHGRANTOPTION]permetutilisateur3depropager
dautreslesdroitsreusdupremierutilisateur.Sicetteoptionneluiestpasaccorde,il
nepourrapaspropagerlesdroitsdautresutilisateurs,mmesilestpropritairedes
tables.
Ajoutdetuplesdansunerelation
Pourajouterdestuplesdansuneextension,onutiliselacommandeINSERTdansundes
formatspossibles:
Insertiondunseultupledevaleurs:
Format1:

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

INSERT INTO <nom-relation> (attrib1, attrib4, attrib5)


VALUES (liste de valeurs);

Lordre des valeurs doit tre celui des attributs du schma. Il est aussi possible de
fournirlalistedesattributsdanslordrecorrespondantceluidesvaleursfournies.Les
attributsabsentsduschmacorrespondentalorsdesindicateursdenullsdansletuple
cr.

Insertion dun ensemble de tuples obtenus par une sousrequte et en provenance


duneautretable:
Format2:
INSERT INTO <nom-relation> (liste-attributs-du-schma)
SELECT <liste des attributs>
FROM <relation1> [WHERE <prdicat>];

LestuplesproviennentdestablesexistantesdelaBASEDEDONNES.Cetteinsertion
peuttreeffectueparunblocdePL/SQL.Siunetableestcrepourrangerlesventes
importantesdfiniescommeayantunequantitsuprieure10,ellepourratrecharge
parleformat2duDMLINSERT:

INSERT INTO Ventes_avant2000 (article, nom, qte)


SELECT article, nom, qte
FROM Ventes WHERE qte > 10;

7.27Suppressiondetuplesdansunerelation
Poureffectuercetteopration,ilfautdabordrechercherleoulestuplessupprimer.Si
laconditionestspcifieavecunecl,unseultupleserasupprim;autrement,tousles
tuplesvrifiantleprdicatdeslectionserontsupprims.Lasuppressionestautorise
parlepropritairedelatableouparlutilisateurquialeprivilgeRESOURCE
DELETE FROM <relation> [WHERE <prdicat>];

o le prdicat est une formule logique comportant au besoin une combinaison de


conditionsdontlvaluationfournitunevaleurboolenne.

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.

TRUNCATE TABLE Empl {REUSE STORAGE | DROP STORAGE } ;

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;

TRUNCATE TABLE Ventes REUSE STORAGE;


supprimelecontenudelatablesansfairedejournalisation

c)Supprimerlestransactionsdeventeconcernantlesarticlessansmargebnficiaire,ou
ceux qui sont en rupture de stock (null pour cout). Chaque tuple supprim est inscrit
danslejournal.

DELETE FROM Ventes


WHERE article NOT IN
SELECT article
FROM Inventaire
WHERE (prixVente - cout) < 0 or cout is
null);

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.

UPDATE Ventes SET qte = 9


WHERE nom = Valrie and article = 'a7' and qte = 3;

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

UPDATE Ventes SET qte = (SELECT qte


FROM Ventes_Janvier)
WHERE nom =Valrieand article =a7);

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.

CREATE TABLE <nom-table>( attribut-i spec-


colonne,...) ;
speccolonne:=
,

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

rponse: Name Null? Type


nas NOTNULL number(3,0)
pren varchar2(25)
nase NOTNULL number(3,0)
prene varchar2(25)

La rponse exige aussi de paramtrer correctement lenvironnement SQL*Plus pour


limiterlalargeurdescolonnesetremplacerlavaleurpardfautfournitparlalongueur
dutype.
COLUMN nas FORMAT 999;
COLUMN NASEENF FORMAT A20; /*col.20 car. pour
afficher NASEENF*/

Exemple: DES[CRIBE] Client

VoicilestypesdelatableClientfournisparlacommandeDESCRIBE:
DESCRIBE Client

Client: Attribut Type


nom NOTNULL varchar230
adresse varchar220
ville varchar220
tel char13

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.

CREATE TABLE Empl(


matricule integer CHECK (matricule < 99999),
nom char varying (40) check (LENGTH (nom > 3),
salaire real NOT NULL,
tauxOfficiel real NOT NULL,
noDep integer check( noDep >= 10 and noDep <= 30),
CONSTRAINT cp_empl primary key (matricule),
CONSTRAINT fk_empl_depart FOREIGN KEY (noDep) REFERENCES
Depart(noDep) MATCH FULL (SELECT noDep FROM Depart))
CONSTRAINT tauxHoraire check(salaire/35 > tauxOfficiel));

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:

CREATE TABLE Empl(


matricule number(5) NOT NULL check (matricule < 99999),
nom varchar2(40) check (LENGTH (nom > 3),
salaire number(8,2) NOT NULL,
tauxOfficiel number(4,2) NOT NULL,
noDep number(3)NOT NULL check (between 10 and 30),
CONSTRAINT cp_empl primary key (matricule),
CONSTRAINT fk_emplDepart FOREIGN KEY (noDep) REFERENCES
Depart(noDep),
CONSTRAINT tauxHoraire check(salaire/35 > tauxOfficiel));

Selon le SGBD, le systme peut crer automatiquement un index unique (SYSTEM


Index)pourlaclprimaireoulanceruneprocdureinternepourvalidertoutajoutdans
Emplafindevrifierquecetemployestabsentdelatable.Demme,leSGBDvrifiesi
ledpartementauquelestassocilenouvelemployexistedjdanslabasededonnes
enexploitantlindexsystmecrpourlaclprimairedelatableDepart.Lindexinterne
dusystmesurlaclprincipalepeuttretemporairementdsactivparleDBA.Lorsque
lindex deviendra actif, le SGBD vrifiera lunicit des tuples prsents dans la table de
manirevrifierlacontraintedecl.EnSQLdeOracle,ilestpossibledecontrlerle
placement de la table en prcisant le tablespace. De plus, le DBA a la possibilit de
contrler le rangement des tuples en accordant les droits daccs appropris aux
diffrentsschmas.

CREATE TABLE Inventaire(


article varchar2(10) CONSTRAINT cp_inventaire PRIMARY KEY
CHECK(article = UPPER(article)),
prixVente NUMBER(5,2),
cout NUMBER(5,2));

CREATE TABLE Ventes(


nom VARCHAR2(35) NOT NULL CHECK (nom = UPPER(nom)),
article VARCHAR2(10) NOT NULL,
qte NUMBER(2) CHECK (qte < 99),
CONSTRAINT cp_ventes PRIMARY KEY (nom, article, qte),
CONSTRAINT fk_ventes_inventaire FOREIGN KEY(article)
REFERENCES Inventaire (article)tablespace donnees_bd1);

Les contraintes dune table peuvent tre modifies par un ALTER TABLE MODIFY ou
unecombinaisondeALTERTABLEDROPetALTERTABLEADD.

ALTER TABLE Ventes MODIFY article number CHECK (article


<100);

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:

ALTER TABLE Ventes DROP fk_ventes_inventaire;


ALTER TABLE Ventes ADD fk_ventes_inventaire FOREIGN KEY
(article)
REFERENCES Inventaire(article));

La contrainte rfrentielle est supprime et peut tre recre par la suite par la
commandeALTERTABLEADD.Aumomentdelacration,lacontraintedoittrevraie
pourtouslestuplesdelatable.Lavalidationestrtrospective.

La suppression dune table requiert le privilge RESOURCE si lutilisateur nest pas le


propritairedelatable.

DROP TABLE <relation> [CASCADE CONSTRAINTS];

SupprimerlatableClientetdummecoupsonschmaetsonextension:

DROP TABLE Client [CASCADE CONSTRAINTS];

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:

ALTER TABLE Ventes ADD (taxe number(5,2));

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

ALTER TABLE Ventes MODIFY (article Char (3));

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'

SET PAUSE ON -- activation de la pause dans le droulement

Pour arrter le droulement de laffichage des donnes et solliciter lutilisateur dans le


butdamorcerlasuitedelaffichage:
SET PAUSE OFF -- dsactivation de la pause

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

Le caractre . est le dlimiteur de chane et permet de trouver la chane pour la


remplacer par une nouvelle. Ce dlimiteur peut tre quelconque et son choix exige
seulementquilnapparaissepasdanslachanequifaitlobjetdelarecherche.

Exemple:Remplacementdelachanefunctionparfonction

change .function.fonction. ou encore


change ;function;fonction; -- si le . est prsent dans la chane
recherch, il faut utiliser un autre caractre, par exemple le ;.
- LIST pour lister le contenu du buffer SQL.

2 pourpositionnerlaligne2commelignecourantedelditeur.

- RUN pour lancer l'excution de la clause SQL place dans le


tampon SQL.

- START A:\creation.sql -- pour lancer un fichier de commandes.

- SAVE A:\fichier.sql

PoursauvegarderdansunfichierlaclauseSQLdansletampon.
GET A:\fichier.sql

Pour rappeler le contenu du fichier et le placer dans le tampon de lditeur. Il peut


ensuitetreexcut.
EDIT nom_fichier

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.

Joueur: nom* prenom age nationalite societe


Tremblay Patricia 22 fr CGI
Gagnon Jacques 23 ca Bell
Marois Sherly 20 us Bell
Beaumont Michel 24 fr Bell
Dery Paul 19 ca
Fournier Nadine 22 ca DMR

Match: dateM* lieu* score nomG nomP


12jan1998 Qc 127 Beaumont Gagnon
5sept1995 Mtl 35 Marois Fournier
23mai1996 Qc 123 Fournier Gagnon
3jan1998 Qc 86 Tremblay Dery
22oct1999 Qc 25 Beaumont Gagnon
18nov1999 Paris 74 Tremblay Gagnon

Commanditaire: societe* montant duree


Bombardier 4000 2
CGI 2000 5
LGS 3000 2
DMR 6000 3
Bell 5000 2
CaissePopulaire 5000 5

1.1 Formuler la clause SQL pour afficher les noms des joueurs nayant perdu aucun
matchjouQc.Vousnesavezpaspriorisiunjoueurajououpasunmatch,maisil
doitenavoirjouunpourtredanslarponseescompte.

Rponse:Ilyaplusieursformulationspossiblespourobtenirunebonnerponsedans
lhypothsedetablescohrentes.
1re:LesjoueursdematchquiontjouunmatchQubecsansperdreleurmatch.

(SELECT [distinct] nomG


FROM Match
WHERE lieu = 'Qc')
MINUS
(SELECT [distinct] nomP
FROM Match

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

WHERE lieu = 'Qc');

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');

3me SELECT nom


FROM Joueur J, Match M
WHERE J.nom = M.nomG or J.nom = M.nomP and M.lieu
=Qc
and not exists ( SELECT * FROM Match M
WHERE J.nom = M.nomP and lieu =
'Qc');
4me
SELECT nomG
FROM Match
WHERE lieu = 'Qc' and nomG 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;

N.B. Si les cls primaire et trangre taient composes de plusieurs attributs, la


conditiondejointureseraitunprdicatconjonctifdeplusieursgalitsetavecautantde
signes(+)pourformulerlajointureexterne.

nom montant societe


Gagnon 5000 Bell
Marois 5000 Bell
Beaumont 5000 Bell
4000 Bombardier
Tremblay 2000 CGI
5000 CaissePop
Fournier 6000 DMR
3000 LGS

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

3 Formuler la clause SQL pour lister le nom du perdant et du gagnant du premier


match,i.e.leplusancienmatchinscritdanslabasededonnes.

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.

SELECT ville, sexe, Count(nas) [as] nb-de-Personnes


FROM Ouvrier O, Usine U
WHERE ville = 'Quebec' -- une seule ville retenue
GROUP BY ville, sexe; -- pour qubec ==> 2 sexes

Combiendelignesetdecolonnesserontprsentesdanslarponse?

Rponse:
LeGROUPBYestcalculsurlattributsexedelatabletemporairenecontenantqueles
ouvriersdelaseulevilleQubec.LesvaleurspossiblespourlattributsexesontMetF.
Donclarponsecomportera2ligneset3colonnes.

rponse: ville sexe nbdePersonnes


Qubec F 67000
M 66560

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

Le calcul de la rponse aux questions cidessous est effectu en faisant rfrence


lextensiondelabasedeBD3.FormuleruneclauseSQL(conformmentlaversionSQL
qui est disponible) et donner lexpression algbrique quivalente et cela, pour chaque
question. Lorsque dans lnonc on fait rfrence au seul nom de la relation (table), il
sagit alors de fournir tous les attributs de cette relation, soit en les numrant, soit en
utilisantlastrisque.

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.

Cours: noCours* inscriptions Salle: noSalle* capacite


c6 40 s10 30
c5 50 s4 45
c4 55 s6 50
c3 65 s14 55
c2 70 s12 65
c1 80 s2 70
s8 85

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

rponse: noCours* noSalle inscriptions capacite


c6 s4 40 45
c5 s6 50 50
c4 s14 55 55
c3 s12 65 65
c2 s2 70 70
c1 s8 80 85

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

le schma dans la mesure o le SGBD utilis pour lexploitation le permet. Le modle


ALUNORDestungrapheacyclique.
Smantiquedequelquesattributs:
dNaiss Datedenaissancedelouvriercomprenantlejour,lemoisetlanne.
embauche: Datedupremiercontratdetravailexprimeaveclejour,lemoisetlanne.
classeMetier: Classesdecomptencepourunmtieridentifiesparunentierde15.
capacStock: Nombredepicespouvanttreconserveslusinedansuneenceintedontla
surfacereprsenteobligatoirement10%decelledelusine.
lot: Unitdeproductiondunesortedepicescorrespondantunecommande.
delai: Nombreprvudejourspourlafindelaproductiondunlotdepices.
volL: Quantitminimaledunmatriauenvracpouvanttrelivruneusine.
noMetier: Identifiantpourunmtierexercparplusieursouvriers.
cat: Qualitdumatriauenvracfournioulivrparunfournisseur.
qte Quantitdepicesproduitesdansunlotdeproduction
VolC: Volumedematriauenvraccommandparuneusine.
surfaceUsine: Surfacetotaledelusinedont10%estconsacrelentreposage.
nas: Numro assurance sociale sous forme dune chane compose uniquement de
chiffres

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.

VracMat(noMat*, noFourn*, volL, cat)


Usine(noUsine*, ville, capacStock, surfaceUsine)
Metier(noMetier*, classeMetier, taux)
Production(noPiece*, lot*, qte, dateDebut, delai, noUsine,
noClient)
Ouvrier (nas*, nom, prenom, sexe, dNaiss, embauche, noUsine,
noMetier)
Commande(noUsine*, noMat*, noFourn*, volC)
Client (noClient*, ville, credit)

N.B.Lastrisque (*) indique un attribut primaire, i.e. un attribut qui compose la cl


primaire.PourunemeilleurelisibilitduMRD,letraitdunionestutilisdanslelibell
dun attribut la place du soulign qui demeure cependant le caractre despacement
admissible par le langage SQLDDL. Par exemple, lattribut classeMetier sera spcifi
dans le schma avec le libell classeMetier. Les autres caractres de ponctuation sont
exclus du libell du schma. Les caractres $ et # sont admissibles, mais toute fin
pratiqueinutiliss.

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.

cat:{A,B,C,D} capacStock:]10...9999] volL]0...1000] sexe:{F,M}


classeMetier:{1...5} taux:]10.00...32.75] lot:[b10....b99] credit:[1000....10000]
noMetier : [j1... surfaceUsine:]100...50 nas : chane de 9 noUsine:[u10...u99]
j99] 00] car.

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.

Production: noPiece* lot* qte dateDebut delai noUsine noClient


p1000 b70 1200 17dec1998 20 u12 c35
p2000 b80 900 23nov1998 15 u24 null
p1500 b75 1150 5nov1998 null u12 c50
p1000 b35 700 28nov1998 12 u18 c25
p2300 b42 2375 10dec1998 7 u14 c35
p1000 b74 130 18nov1995 5 u10 c45

Metier: noMetier* classeMetier taux


j27 1 32.75
j41 2 28.53
j75 5 27.68
j19 4 18.40
j40 3 22.90
j44 3 19.29

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

Client: noClient* ville credit


c35 Qubec 7500.00
c45 Paris 3000.00
c25 NewYork 2000.00
c50 Toronto 10000.00

Ouvrier:
nas* nom prenom sexe dNaiss embauche noUsine noMetier
196573432 BOIVIN Louise F 1011965 20oct1995 u12 j27
198029823 DION Paul M 1751980 17nov1998 u12 j41
199549525 BOUCHARD Flix M null 8jan1995 u14 j75
197479013 GENEST Christian M 421974 27jan1994 u12 j27
196871002 GAUTHIER Fabrice M 2541968 19sep1995 u14 j19
197287815 DUSSAULT Luce F 11101972 12mar1995 u18 j40
195545260 TREMBLAY Jacques M 9111955 1mar1991 u22 j19
196236649 SOUCY Sybelle F 2121962 23jan1998 u32 j41
195265972 DRECJACKSEN Jack M 851952 10jan1995 u10 j75
195023961 SMITH Marie F 27111950 26jan1996 null j44


Commande: noUsine* noMat* noFourn* volC
u12 m27 f510 15
u14 m27 f320 25
u22 m75 f420 30
u32 m41 f650 80
u18 m41 f100 40
u14 m75 f520 45
u10 m27 f320 60
u18 m27 f100 90
u18 m75 f100 50


Usine: noUsine* ville capacStock surfaceUsine
u10 Chicoutimi 1000 300
u12 Qubec 2000 1700
u14 Montral 3000 1250
u18 Boston 1000 1550
u20 Rimouski 1275 1100
u22 Toulouse 1400 500
u24 Paris 3000 450
u26 Zurich 2300 1200
u28 Atlanta 2000 1700
u30 Toronto 1250 420
u32 Vancouver 970 600

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

VracMat: noMat* noFourn* volL cat


m35 f270 20 B
m75 f520 15 A
m35 f300 15 C
m27 f100 25 A
m27 f510 25 C
m75 f100 30 B
m41 f650 40 A
m75 f420 50 A
m41 f100 20 D
m27 f320 15 B

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.

La rubrique de chaque section de questions est indicative. Normalement, la rponse


unequestiondecettesectionfaitappelauxoprateursmentionnsdanslarubriquede
cette section et, au besoin, aux autres des sections prcdentes. Toutefois, il ny a pas
quuneseulefaondeformulerlarponseunequestion.Danstouslescas,privilgier
laclauseSQLlaclauselaplussimplepourrpondrelaquestion.Ilseraitutiledelire
ou relire immdiatement la section sur les commandes de lditeur de SQL*Plus de
manire formater correctement le reportage de vos rponses et cela, ds le dbut de
votretravail.

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.

Questions formuler en SQL


Attention : Les questions ne sont pas ncessairement en ordre croissant de difficult.
Elles ont t mises dans un ordre quasi alatoire de manire ce que, sil y a lieu, la
rpartition des questions dans une quipe fournisse des ensembles de complexit
similaire.
ACrationetchargementdelabasededonnes
partirduMCD,commenterlestranspositionsncessairespourobtenirleMRDdonn
dans lnonc du projet. Ensuite, spcifier le schma dans lequel sont formules les
contraintesdintgritdedomaineetsyntaxiquesformulesexplicitementdemmeque
cellesinhrentesaumodlerelationnelALUNORDquipeuventtreimplmentessans
avoirrecoursuntrigger.
N.B.Attentionautypedechanedecaractres:unattributdontlavaleurapparattre
delongueurvariabledanslesinstancesdetabledoittrespcifiVARCHAR2(),sinonle
typeCHAR()peuttreutilis.Linstancedestablesprsentedanslexercicedoitaussi
servirdindicationpouridentifierlesattributspouvantavoirunevaleurnulle.Effectuer
lacrationdelabasededonnespourensuite lachargeraveclestuplesfournisparle
fichier Aludata.txt. La cration des tables parents doit prcder celle des tables
enfants. Pour la suppression des tables, cest lordre inverse quil faut respecter.
Pourquoidoitilentreainsi?
Validitduschma.

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

1517 1820 2325 35

tupletuple tuple tuple tuple tuple tuple

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

valeurs est nouveau effectue avec insertiondplacement de la valeur centrale du


nudsaturversunautredeniveausuprieursuivant.

5Lorsquonsupprime unevaleur, elleestenpremiersupprimedanslafeuille.Il en


est de mme si elle apparat aussi dans un nud interne de lindex. Dans ce cas, la
valeurgauchedanslafeuilleremplacelavaleursupprimequiapparatdanslenud
interne.Silasuppressiondunevaleurdansunefeuilleamneleniveaudoccupationen
dessous dun seuil minimal, les valeurs sont redistribues entre la feuille dorigine et
celle immdiatement sa gauche au mme niveau. Sinon, les deux cellules sont
fusionnesetladisparitiondunefeuilleestpropageauniveausuprieur.
CrationetajoutdansunB*arbre
La cration dun B*arbre dordre 3 soustend celle dun entte sans aucun nud ni
feuille.Lajoutdelavaleur20dclenchelacrationdunpremiernuddansleB*arbre,
cestdirequecettestructureaaumaximum2clset3pointeursparnudinterne.Le
facteurdesaturationestde2.

Ajoutde20:lacellulecontientalorsunpointeursurletupleidentifiparlavaleur20.

20

null
tuple

Ajoutde40:idem
2040

tuple tuple

Ajoutde25:cetajoutdanslacelluleprovoquelasaturationetdoncladivisionendeux
feuilles,suiviedelacrationdunnud.

25

2025 40

tuple tuple tuple

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

tupletuple tuple tuple tuple


null

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.

JeanEtienne Lazure du Portail,


23 , 34 , 34 ,
rid16
42 , 19 ,

(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

tupletuple tuple tuple tuple

1717 17 Cellule de dbordement pour

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

Dans ce dernier cas, la recherche dune valeur particulire exigera un balayage


squentiel de la page. Cela suppose aussi que les tuples soient ordonns sur lattribut
indexetquevaleursidentiquessoientrangesdanslammepage(clustered).

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:

ROWID(rid) soudeur fraiseur sableur tourneur <indexsurspecialite


00055:000:0023 0 1 0 0 <listedesspecialits
00234:020:8922 1 0 0 0
19000:328:6200 0 0 0 1
21088:120:1002 0 0 1 0
Figure8.7Indexbitmapsurlattributspecialite
Ce type dindex acclre sensiblement les requtes avec comptage, opration souvent
utilise dans une requte de type OLAP (On Line Analysis Processing). Ainsi, pour
connatre le nombre de soudeurs, cela nexige pas un accs aux tuples de la table
Ouvrier. Seul laccs lindex bitmap de lattribut specialite suffit pour calculer la
rponse. Le B*arbre sera rduit sa plus simple expression, et dans le cas de cet
exemple,uneseulepagededonnes.

CREATEINDEXBITMAPONOuvrier(spec)
TABLESPACEspec_espaceSTORAGE(INITIAL2MPCTINCREASE10);

Un autre index bitmap peut tre aussi cr sur lattribut salaire. Ce deuxime index
permettradecalculerrapidementlarponseunequestiondugenresuivant:
Quelssontlesemployssoudeursquigagnent30000.00$?

ROWID 20000 30000 40000 <bitmapsursalaire


00055:000:0023 1 0 0
00234:020:8922 0 1 0
19000:328:6200 0 0 0
21088:120:1002 0 0 1

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.

ROWID soudeur 30000 rponse


00055:000:0023 0 0 0
00234:020:8922 1 1 <1
19000:328:6200 0 0 0
21088:120:1002 0 0 0
Calculdunerponseunerequteconjonctive
Figure8.8

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.

a) Lindex est cr automatiquement lorsquune cl primaire est spcifie dans un


schma. Il est alors du type systme en ce sens quil ne peut pas tre supprim par le
DBA autrement que par redfinition du schma. Lindex de la cl primaire peut
cependant tre dsactiv temporairement par le DBA au moyen de la clause ALTER
TABLE.Lindexpeuttresupprimavantunemisejourimportanteettrerefaitparla
suiteenuneseuleopration(facilitelechargementenlot).

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

Ainsi, le calcul de la rponse prcdente est acclr, car lindex simple


idx_noEmpl_Assignationsestdisponibleetloptimiseurentireraprofitdanslecalculde
lajointure.
Optimiseuretindexcompos
Les index sont utiliss par loptimiseur, notamment si certaines informations sont
prsentes dans le prdicat (WHERE) des requtes. Nous allons faire un bref survol de
quelqueschoixdoptimisationquecedernierpeutfaireencoursdetraitement:
a)TouslesattributsdunindexcomposdoiventtreprsentsdanslaclauseWHERE,
peuimporteleurordredanslaclause,pourqueloptimiseurentireprofit.

b) Si le premier attribut de lindex compos idx_noPoste_noEmpl_Assignations est


prsent dans le WHERE, lindex compos est utilis. Sil est absent, lindex compos
devientinutile.

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.

La cl trangre spcifie dans un schma de relation ne gnre pas automatiquement


un index sur celleci. La contrainte rfrentielle spcifie dans le schma identifie
simplement les attributs qui sont impliqus dans une contrainte rfrentielle et rien de
plus
.
segment1
Page Page de segment2

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

Lindex sur la cl trangre doit tre cr explicitement par la commande CREATE


INDEX. Les pages des tuples dune mme table forment un segment, tandis que celles
dunindexsurlammetableformentunautresegmentdistinctquantsastructure.La
lecturedunepagedindexpermetdelireunepagededonnesdetuplesgrceauxrids
fournisparleBarbre.

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

peut ralentir la concurrence de laccs aux donnes, notamment lorsque la localit de


rfrenceauxdonnesestrelativementgrandelorsdelexploitationdelabase.

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;

Lors de la cration de lindex idx_proprio_pieces, le segment est cr avec deux


extensionsde10Koctets.Aubesoin,une3eextensionestcrede10Ko,etparlasuite
lesextensionssontcresavecuneaugmentationde20%.
QuelquesfacteursdeperformanceavecleSGBDOracle
Le calcul des rponses est acclr avec les index et les groupements des donnes
(clusters) et soustend une gestion performante de la mmoire physique14. Le noyau
dOracle aura accs plus rapidement aux tuples avec un mcanisme dindexation. De
plus, un accs plus direct aux tuples favorisera la rduction de lactivit de I/O sur le
canal du disque. En revanche, les index ralentissent la mise jour parce que toute
modificationdelavaleurdunattributdansunerelationdebasedoittre,silattributest
index, rpercute dans lindex. La sparation des pages dindex et des pages de
donnes dans leurs tablespaces respectifs favorisera la performance en minimisant les
changesdepages,sousrserveduneZMPsuffisammentgrandepourcontenirlafois
les pages de donnes et celles des index. La prsence de plusieurs disques avec 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
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

T2: Delete u1 pour assurer la consistance de


?? lecture Dclenchement
noUsine du trigger

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.

postes: noPoste* description


j12 grant
j34 peintre
j98 null
j21 mcano1
j55 contrleur
j75 mecano2

empl: noEmpl* nom prenom tauxH(x100)


P346 Audy rudy 1300
P456 Gagnon andr 1715
P345 Audy michel 1250
P651 Tremblay robert 1250
P762 Dussault marc 1325
P337 Brube null 1250
P450 Dion fabrice 1325
P535 Joncas sylvie 1450

assignations: noPoste* noEmpl* debut quart


j12 P456 21jan1992 soir
j34 P651 22mar1991 jour
j21 P762 23dec1990 nuit
j34 P345 24sep1994 jour
j75 P346 12oct1997 null
j55 P456 25jan1994 jour
j34 P337 21jan1992 nuit
j75 P450 27jan1994 null

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.

CREATE TABLE Empl (


noEmpl char(4) not null, nom varchar2(30))
prenom varchar2(30), tauxH number(4),
CLUSTER TAUX_CLUST(taux);

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

C20 C35 C38

Rpertoireducluster 1 2 3 4 5 Chanage des pages pour les entres de


noCompte mmevaleur

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;

CREATE TABLE Ouvrier(


...
noUsine number )
CLUSTER Lieu_travail(noUsine);

CREATE INDEX cluster_idx ON CLUSTER Lieu_travail; [Oracle]

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.

CREATE FORCE VIEW Ventes_Tres_Importantes (nom, article) as


SELECT nom, article
FROM Ventes V
WHERE qteTot> 10;

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:

CREATE view VentesCourantes as


SELECT * FROM Ventes
WHERE date = SYSDATE and prix > 5.00 WITH CHECK OPTION;

Ensuite,ilfautaccorderlesdroitsdeslectionetdinsertionPaul:
GRANTSELECT,INSERTonVentes_courantestoPaul.

SileDBAdsirelimiterlusagedecettevueaulundi,ilformuleraalorslavueainsi:

CREATE view VentesCourantes as


SELECT * FROM Ventes
WHERE date = LOWER(TO_CHAR(SYSDATE,'DAY')) = 'monday' and
prix > 5.00 WITH CHECK OPTION;

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

Sylvain (Select + Insert + Update Grant

MarieClaude (Select + Update)


Jacques (Select + Insert)

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.

Employe: nas* nom noDep salaire Dep: noDep* site


27 audrey d1 15k$ d1 Qubec
20 benoit d2 20k$ d2 Montral
21 christine d2 19k$ d3 TroisRiv
22 audrey d2 18k$ d4 Qubec
23 audrey d4 15k$

Vue3: Vue2: Vue1:


nas* nom site nom* site* nas* salaire
27 audrey Qubec audrey qubec 27 15K
20 benot Montral benot Montral 20 20K
21 christine Montral christine Montral 21 19K

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

22 audrey Montral audrey Montral 22 18K


23 audrey Qubec audrey* Qubec 23 15K
Figure8.17

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.

Employe nas* nom noDep salaire Dep: noDep* site


27 Audrey d1 15k$ d1 Qubec
20 Benoit d2 20k$ d2 Montral
21 Christine d2 19k$ d3 TroisRiv
22 Audrey d2 18k$ d4 Qubec
23 Audrey d4 15k$ > Hull
> 28 Denis
Figure8.19
Eneffet,unaffichagedelextensiondelavuervlequaprscetteinsertionilyaunseul
tuplereprsentantDenisdontlenasest28.Sonlieudetravailestabsentdelabase,car
letuplevhiculantcetteinformationnapasputreinsrdanslarelationDepartement
puisquelaclestabsente.Lintentiondelutilisateurestclaire,maisilyauneambigut
auniveauduSGBD.QuelestleffetauniveaudelaBD?

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;

Lintention de lapplication est claire, mais le SGBD ne peut la comprendre, car il y a


plusieurs tuples candidats cette modification. Sans autre connaissance externe, le
SGBDtraduitcetteprocdureenuneautrequiutiliseseulementlesrelationsdebaseet
lesconstantesfourniesparlapplication:

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:

temp1: noP SUM(FP.qte)


1 44
3 33
2 22
Figure8.20
La relation temp1 est lobjet dune projection pour obtenir la valeur de SUM(FP.qte)
lequelpeuttrerenommSommequantit.Cestsurcettetabletemporairequelarequte
SQL est excute pour donner la moyenne escompte. Certains logiciels commencent
par utiliser la substitution et, en cas dchec, font appel la matrialisation (voir DB2
dIBM). Cette matrialisation est aussi employe pour le traitement des sousrequtes,
cestdirelesclausesSQLdeniveausuprieur1.

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

obtenu avec les fonctions arithmtiques, dagrgation et de groupement. Pour


contournerladifficult,leslangagesdedonnespermettentlutilisateurderemplacer
les enttes de colonne par des expressions plus significatives. Un autre cas trs
particulierviterestceluidelalecturedunerelationobtenueparlajointuredevues
interditesparunedpendancedejointure.Cetteanomalieestpossiblelorsquilyaune
dpendancedejointuresdansleschmadelaBDetqueleschmanestpasen5FN.

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

Menage: conjoint conjointe


345 456
923 786
387 384
629 310
319 231
127 612

Lieu_Travail: nas nom ville salaire


345 Jacques Qubec 20K$
231 Danielle TroisRivires 19K$
456 Sylvie Qubec 28K$
127 Nahn Nice 32K$
612 Jose Chicoutimi 26K$
387 Pierre Qubec 25K$
384 Clotilde SteFoy 22K$
923 Rachid Qubec 25K$
319 Arthur Qubec 22K$
187 Gerry Montral 25K$
310 Patricia Qubec 25K$
452 Estelle Montral 23K$
629 Andr Montral 25K$
876 Denise Qubec 27K$
Figure8.21

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.

CREATE view vue5.1 as


SELECT conjoint, conjointe, salaire, nom
FROM Menage [as] M, Lieu_travail [as] L
WHERE M. conjointe = L.nas;

Demmepourlaconjointe:
CREATE view vue5.2 as
SELECT conjoint, conjointe, salaire, nom
FROM Menage [as] M, Lieu_travail [as] L
WHERE M. conjoint = L.nas;

CREATE view reponse as


SELECT conjoint
FROM vue5.1 X, vue5.2 Y
WHERE X.conjointe = Y.conjointe and
X.conjoint = Y.conjoint and X.salaire = Y.salaire;

SELECT conjoint [as] nas-conjoint /*renommage attribut*/


FROM reponse;

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.

CREATE OR REPLACE view vue6.1 as


SELECT conjoint, conjointe, nom, ville
FROM Menage [as] M, LieuTravail [as] L
WHERE M.conjointe = L.nas;

CREATE view vue6.2 as
SELECT conjoint, conjointe, nom, ville
FROM Menage [as] M, LieuTravail [as] L
WHERE M.conjoint = L.nas;

CREATE view reponse as

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;

SELECT conjointe [as] nas-conjointe


FROM reponse;

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.

CREATE view vue7 (ville, moy_sal, min_sal, som_sal) AS


SELECT ville, Avg(salaire), Min(salaire), Sum(salaire)
FROM LieuTrav
GROUP BY ville;

SELECT ville, moy_sal /*interrogation possible*/


FROM vue7;
Restrictionsassocieslavuerelationnelle
La vue relationnelle est dfinie par une expression algbrique. Elle permet un
renommagedesattributs(alias),maisinterditlesoprationssuivantes:

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.

Mise jour de l'instantan


Lacrationduninstantansoustendlacrationdunetablecorrespondantauschma
delarequteetdontlextensionestformeaveclesdonnesfourniesparleestablesde
base.

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.

TableOuvrier_Exp(instantan) TableOuvrierdebase JournaldeOuvrier_Exp

26,fabella,68 26,fabella,68 35claude,56


18,paul,50
18,paul,50
35claude,56 35claude,56

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

Le traitement des exceptions est gr au moyen des exceptions dclares explicitement


dans le bloc PL/SQL ou dfinies implicitement dans le langage. Le traitement de
lexceptiontermin,lexcutionsepoursuitaveclepremiernoncaprslasortiedubloc
courant.
StructuregnraledunprogrammePL/SQL
Voici la structure gnrale dun programme PL/SQL17; elle comprend un ou plusieurs
blocs,dontchacunestconstitudelapartieDECLARE,BEGINetEXCEPTION.Seulela
partieBEGINestobligatoire.

[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

: Empl.nom_famille%TYPE). Linitialisation de la variable peut tre faite dans la


dclaration.Uneseulevariableestdclareetinitialiseparnonc.
DECLAREsalaireNUMBER(5,2);
tauxEmpl.tarif%TYPE;/*var.tauxaletypedeEmpl.tarif*/
matvarchar2(10);
bonusNUMBER(2):=10;
nom VARCHAR(35);
CURSORRechercheIS
SELECTE.nom,E.tauxH
FROMEmplasE
WHEREnoEmpl=P762;

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;

La procdure RAISE_APPLICATION_ERROR() est fournie par une librairie (Package)


STANDARD du SGBD et sexcute sur le serveur. Si la mme procdure est lance et
que lerreur 20200 doit tre traite non pas par le handler de Oracle, mais pour une
exceptiondelaprocdure,ilfautfaireappelladirectivedecompilationPRAGMA:

EXECSQLEXECUTE
DECLARE
...
tauxNulEXCEPTION;
PRAGMAEXECEPTION_INIT(tauxNul,+100);+100>no_data_found
BEGIN
...
EXCEPTION

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:

CREATE TRIGGER Verif BEFORE INSERT OR UPDATE ON Contrats FOR


EACHROW
DECLARE
no_certif_vreal;
montant_vnumber(5,2);
annulationEXCEPTION;
confirmationEXCEPTION;
BEGIN
SELECTmontantINTOmontant_vFROMCertificats
WHEREno_certif=:new.no_certif;
ifmontant_v!=:new.montantTHENRAISEannulation;
elseRAISEconfirmation;
endif;
EXCEPTION
WhenannulationTHEN
Raise_Application_Error(20523,autorisationinadquate);

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.

CREATE OR REPLACE TRIGGER TRIG_INSERT5 BEFORE INSERT OF nom


ONPatientFOREACHROW
DECLAREnbpatinteger;
BEGIN
SELECTcount(*)INTOnbpatFROMPatient
WHEREnom=:new.nom;
si0alorsnomabsent
IFnbpat=0THENNULLelseRAISE_APPLICATION_ERROR(
20249,patientexistantdanslaBD);
END IF ;
END ;
8.20Problmeetrsolutiondelamutationdestables(Oracle)
Voici une base de donnes simple forme par deux tables Employe et Projet entre
lesquellesilyauneassociationmatrialiseparunecontrainterfrentielle.Untrigger
dfinisurunetableetquiestlancsuiteunemisejourouunINSERTsurladite
tablegnreuneerreurdetableenmutation.Laseulefaondecorrigerceproblmeest
depasserparunpackageetdecrerunevariableglobaleauniveauduserveur.
Exemple:
Employe(nas*,nom,classe)
Projet(noP*,site,budget,nas)

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;

nas nom 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
Chapitre8Indexationetvuerelationnelle 184

1 Gagn A
2 Michaud A
3 Landry A

noP site budget nas


100 Qubec 20000 1
101 Qubec 40000 2
102 Montral 5000 3

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;

noP site budget nas


100 Qubec 20000 1
101 Qubec 40000 2
102 Montral 5000 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 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:

nop site budget nas


100 Qubec 20000 1
101 Qubec 40000 2
102 Montral 5000 3

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.

Create or REPLACE trigger inst_emp_projet_INSERT instead of Insert on v_E_P for


eachrow
Declare
cnumber;

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

pas tre rfrence directement dans la sousclause FROM. A chaque rfrence, le


gnrateurfournitlavaleursuivantesansutiliserdeverrou.Cegnrateuresttrsutile
dans un trigger pour gnrer automatiquement un numro de lot, ou de facture ou
encoreunnumrodordre.Lasquenceestcreparlacommandesuivante:

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.

Un inconvnient de ce type de gnration est la perte ventuelle dun entier lorsque


lapplicationquilademandnelutilisepas.Enperdantcenombre,ilyadestrousdans
lasuitedesentiersstocksdanslaBD.

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.

Prdicat Prdicat(attribut) Evaluation


INSERTING Inserting(nom) IFInserting(nom)THEN
VraisileDMLdclencheurestunInsert.
UPDATING Updating(Salaire) Vraisilesalaireestmodifi
DELETING Vraisiletupleestlobjetdunesuppressiondanslatable.

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.

CREATE OR REPLACE TRIGGER TR60 AFTER UPDATE OF Qte_d ON


ProductionFOREACHROW

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.

Le mcanisme des synonymes est un moyen simple et efficace de rendre des


changements dans les mtadonnes transparents aux applications et de simplifier la
formulation des requtes DML pour les utilisateurs. Ainsi, tout changement au niveau
du dictionnaire qui consiste changer le nom des tables, des index, des squences,
exigera par voix de consquence un changement du nom de lobjet dans toutes les
applicationsoprationnelles.Parcontre,silesapplicationsutilisentdessynonymespour
rfrerauxtables,auxindex...,leschangementsdenomdesobjetsdelabasenontplus
dimpactssurlesapplications.

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;

Cette commande inhibera laccs la BD pour ce compte si ce dernier na pas cr


dobjets dans la BD. Dans le cas contraire, la commande ne pourra pas supprimer le
compte.

Cas2:Supprimeruncomptequi adjcrdesobjetscommeunschma,destables,
destriggers,...Lasuppressiondunutilisateurentraneaussicelledessesobjetscrs.

DROPUSERjbouchardCASCADE;

Decettefaon,touslesobjetsquiappartiennentauschmadecetutilisateursontaussi
supprimsdelabasededonnes.

Cas 3: Suppression de la capacit dun compte communiquer avec le SGBD sans


dtruire les objets de son schma. Pour ce faire, il suffit de lui retirer son privilge de
crationdunesession.
REVOKECREATESESSIONFROMjbouchard;

Le privilge CREATE SESSION est essentiel un compte utilisateur pour entrer en


communicationaveclaBD.Unutilisateurpourraitavoirunmotdepassepourentreren
ligneavecleSGBD,maisnepaspouvoirexploiterlaBDparcequilnapasleprivilge
decrerunesession.

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.

6 Expliquer pourquoi il ne peut pas y avoir de rollback dans un trigger de BD stock


dansledictionnaire?Suggestion:rflchirautraitementdunecascadedetriggers.
7DvelopperunblocPL/SQLpouraugmenterde15%leprixdesarticleseninventaire
(BD1)quiontunemargebnficiaire.

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.

11 Crer un index, nom_idx, avec le nom de lemploy. Effectuer une recherche de


quelquesnomsdemploysetnoterletempsderecherche.Supprimerlindexeteffectuer
nouveau la recherche avec les mmes employs. Notezvous une diffrence dans le
tempsderponse?

12 Formuler quelques requtes et utiliser la commande EXPLAIN PLAN pour faire


afficherleplandexcutiondelarequtetraiteavecetsansindex.Noterlesdiffrences
dansleplandexcutiongnrparlemoduledoptimisation.

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

Rpondre aux questions cidessous en utilisant, sil y a lieu, le schma de la base de


donnesBD3,Dotationdesressourceshumaines.Leschmadecettebaseestlesuivant:

Empl(noEmpl*,nom,tauxH)
Postes(noPoste*,description)
Assignations(noPoste*,noEmpl*,debut,quart)
N.B.LattributdebutestdetypeDate.

15 Afficher le nom des employs et la date du dbut de leur assignation (mandat de


travail)auxprojetsquidbutentaprsle10janvier1992.

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

You might also like