Académique Documents
Professionnel Documents
Culture Documents
CoursdeSQL/Oracle
Structured
Query
Language
Par Th. COSNUAU
Introduction
LemodlerelationnelatinitiparCODDIBMen1970maisfutsurtoututilis
partirdesannes1980.
1/44
20/2/2015
CoursdeSQL/Oracle
LeSQLestunlangagedclaratifdontlasyntaxeesttrssimple(commebeaucoup
delangagesdecetype)cequipermetdeseconcentrersurleproblmersoudre.
Tablesutilisesdanslesexemples
LesexemplescitsdanscedocumentonttousttestssousORACLE,undes
systmesdegestiondebasesdedonnesrelationnelslesplusrpandussurle
march.
Cesexemplessontbtissurunebasededonnescomposedesdeuxrelations
suivantes:
EMP(NOM,NUM,FONCTION,N_SUP,EMBAUCHE,SALAIRE,COMM,N_DEPT)
NOM
NUM
FONCTION
N_SUP
EMBAUCHE
SALAIRE
COMM
N_DEPT
MARTIN
16712 directeur
25717
23MAY90
40000
30
DUPONT
17574 administratif
16712
03MAY95
9000
30
DUPOND
26691 commercial
27047
04APR88
25000
LAMBERT
25012 administratif
27047
14APR91
12000
20
JOUBERT
25717 prsident
10OCT82
50000
30
LEBRETON
16034 commercial
27047
01JUN91
15000
20
MARTIN
17147 commercial
27047
10DEC93
20000
500
20
PAQUEL
27546 commercial
27047
03SEP83
22000
2000
20
LEFEBVRE
25935 commercial
27047
11JAN84
23500
1500
20
GARDARIN
15155 ingnieur
24533
22MAR85
24000
10
SIMON
26834 ingnieur
24533
04OCT88
20000
10
DELOBEL
16278 ingnieur
24533
16NOV94
21000
10
ADIBA
25067 ingnieur
24533
05PCT87
30000
10
CODD
24533 directeur
25717
12SEP75
55000
10
LAMERE
27047 directeur
25717
07SEP89
45000
20
BALIN
17232 administratif
24533
03OCT87
13500
10
BARA
24831 administratif
16712
10SEP88
15000
30
2500
20
DEPT(N_DEPT,NOM,LIEU)
N_DEPT
NOM
LIEU
10 recherche
Rennes
20 vente
Metz
30 direction
Gif
40 fabrication
Toulon
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
2/44
20/2/2015
CoursdeSQL/Oracle
La clause SELECT
LacommandeSELECTconstitue,elleseule,lelangagepermettantd'interrogerune
basededonnes.Ellepermet:
deslectionnercertainescolonnesd'unetable:c'estl'oprationde
projection
deslectionnercertaineslignesd'unetableenfonctiondeleurcontenu:
c'estl'oprationderestriction
decombinerdesinformationsvenantdeplusieurstables:cesontles
oprationsdejointure,union,intersection,diffrencerelationnelle
decombinerentreellescesdiffrentesoprations.
Uneinterrogation,onparlepluttderequte,estunecombinaisond'oprations
portantsurdestables(relations)etdontlersultatestluimmeunetabledont
l'existenceestphmre(letempsdelarequte).
Note:
Onpeutintroduireuncommentairel'intrieurd'unecommandeSQLenl'encadrant
par/**/.
Slectiondecolonnesouprojection
LacommandeSELECTlaplussimplealasyntaxesuivante:
SELECT*
FROMnom_table;
danslaquelle:
nom_table:estlenomdelatablesurlaquelleportelaslection.
*:signifiequetouteslescolonnesdelatablesontslectionnes.
Pardfauttoutesleslignessontslectionnes.Onpeutlimiterlaslection
certainescolonnes,enindiquantunelistedenomsdecolonneslaplacede
l'astrisque.
SELECTnom_col1,nom_col2,...
FROMnom_table;
Exemple:Donnerlenometlafonctiondechaqueemploy.
SELECTnom,fonctionFROMemp
LaclauseDISTINCTajoutederrirelacommandeSELECTpermetd'liminerles
duplications.
Exemple:Quellessonttouteslesfonctionsdiffrentes.
SELECTDISTINCTfonctionFROMemp
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
3/44
20/2/2015
CoursdeSQL/Oracle
Slectiondelignesourestriction
LaclauseWHEREpermetdespcifierquellessontleslignesslectionner.Elle
estsuivied'unprdicatquiseravalupourchaquelignedelatable.Leslignes
pourlesquellesleprdicatestvraiserontslectionnes.
Lasyntaxeestlasuivante:
SELECT*
FROMnom_table
WHEREpredicat;
Unprdicatn'estniplusnimoinsquelafaondontonexprimeuneproprit.Les
prdicats,qu'ilssoientsimplesoucomposs,sontconstituspartir
d'expressionsquel'oncompareentreelles.
Expressionsimple
Uneexpressionsimplepeuttre:
unevariabledsigneparunnomdecolonne,
uneconstante.
Lesexpressionspeuventtredetroistypes:numrique,chanedecaractresou
date.Achacundecestypescorrespondunformatdeconstante:
Constantenumrique
nombrecontenantventuellementunsigne,unpointdcimaletunepuissance
dedix.Ex:10,2.5,1.2E10
Constantechanedecaractres
unechanedecaractresentreapostrophes.Ex:'MARTIN'(Attention,une
lettreenmajusculesn'estpasconsidrecommegalelammelettreen
minuscule).
Constantedate
Unechanedecaractresentreapostrophesauformatsuivant:jourmois
anneolejourestsurdeuxchiffres,lemoisestdsignparlestrois
premireslettresdesonnomenanglais,l'anneestsurdeuxchiffres.Ex:
'01FEB85'
Onpeut,enSQL,exprimerdesexpressionspluscomplexesenutilisantdes
oprateursetdesfonctionstudisdanslechapitreExpressionsetfonctions.
Prdicatsimple
Unprdicatsimpleestlersultatdelacomparaisondedeuxexpressionsaumoyen
d'unoprateurdecomparaisonquipeuttre:
=gal
!=diffrent
<infrieur
<=infrieurougal
>suprieur
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
4/44
20/2/2015
CoursdeSQL/Oracle
>=suprieurougal
Lestroistypesd'expressionspeuventtrecomparsaumoyendecesoprateurs:
Pourlestypesdate,larelationd'ordreestl'ordrechronologique.
Pourlestypescaractre,larelationd'ordreestl'ordrealphabtique.
Ilfautajoutercesoprateursarithmtiquesclassiqueslesoprateurssuivants
:
expr1BETWEENexpr2ANDexpr3
vraisiexpr1estcomprisentreexpr2etexpr3,bornesincluses
expr1IN(expr2,expr3,...)
vraisiexpr1estgalel'unedesexpressionsdelalisteentre
parenthses
exprLIKEchaine
ochaineestunechanedecaractrespouvantcontenirl'undes
caractresjokers:
_remplaceexactement1caractre
%remplaceunechanedecaractresdelongueurquelconque,ycomprisde
longueurnulle.
Exemple:Quelssontlesemploysdontlacommissionestsuprieureausalaire?
SELECTnom,salaire,commFROMempWHEREcomm>salaire
Exemple:Quelssontlesemploysgagnantentre20000et25000?
SELECTnom,salaireFROMempWHEREsalaireBETWEEN20000AND25000
Exemple:Quelssontlesemployscommerciauxouingnieurs?
SELECTnum,nom,fonction,salaireFROMempWHEREfonctionIN
('commercial','ingenieur')
Exemple:QuelssontlesemploysdontlenomcommenceparM?
SELECTnomFROMempWHEREnomLIKE'M%'
Prdicatscomposs
LesoprateurslogiquesAND(et)etOR(ouinclusif)peuventtreutilisspour
combinerentreeuxplusieursprdicats.L'oprateurNOTplacdevantunprdicat
eninverselesens.
L'oprateurANDestprioritaireparrapportl'oprateurOR.Desparenthses
peuventtreutilisespourimposeruneprioritdansl'valuationduprdicat,ou
simplementpourrendreplusclairel'expressionlogique.
Exemple:Quelssontlesemploysdudpartement30ayantunsalairesuprieur
25000?
SELECTnomFROMempWHEREn_dept=30ANDsalaire>25000
Exemple:Quelssontlesemploysdirecteurs,oucommerciauxettravaillantdans
ledpartement10?
SELECTnom,fonction,salaire,n_deptFROMempWHEREfonction=
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
5/44
20/2/2015
CoursdeSQL/Oracle
'directeur'
OR(fonction='commercial'ANDn_dept=10)
Larequteprcdentedonneraitlemmersultatsanslesparenthses,rsultat
diffrentdeceluiduSELECTsuivant.
Exemple:Quelssontlesemploysdirecteursoucommerciaux,ettravaillantdans
ledpartement10?
SELECTnum,nom,fonction,n_deptFROMempWHERE(fonction='directeur'OR
fonction='commercial')ANDn_dept=10
ValeursNULL
PourSQL,unevaleurNULLestunevaleurnondfinie.Ilestpossibled'ajouter
uneligneunetablesansspcifierdevaleurpourlescolonnesnonobligatoires
:cescolonnesabsentesaurontlavaleurNULL.
Parexemplelesemploysdontlarmunrationneprendpasencomptedecommission
aurontunevaleurNULL,c'estdireindfinie,commecommission.
L'oprateurISNULLpermetdetesterlavaleurNULL:leprdicatexprISNULLest
vraisil'expressionalavaleurNULL(c'estdiresielleestindfinie).
Exemple:QuelssontlesemploysdontlacommissionalavaleurNULL?
SELECTnomFROMempWHEREcommISNULL
L'oprateurISNOTNULLpermetdeconstruireunprdicatvraisilavaleurn'est
pasNULL(etdoncleprdicatexprISNOTNULLestvraisiexprestdfinie)
Remarques
LavaleurNULLestdiffrentedelavaleurzroqui,elle,quiestunevaleur
biendfinie.
Leprdicatexpr=NULLesttoujoursfaux,etnepermetdoncpasdetestersi
l'expressionalavaleurNULL.
UneexpressiondelaformeNULL+valdonneNULLcommersultatquelleque
puissetrelavaleurdeval.
Nomdecolonne
Lescolonnesconstituantlersultatd'unSELECTpeuventtrerenommesdansle
SELECT,ceciestutileenparticulierlorsquelacolonnersultatestune
expression.Pourcela,ilsuffitdefairesuivrel'expressiondfinissantla
colonned'unnom,selonlesrglessuivantes:
lenom(30caractresmaximum)estinsrderrirel'expressiondfinissant
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
6/44
20/2/2015
CoursdeSQL/Oracle
lacolonne,spardecettedernireparunespace.
silenomcontientdessparateurs(espace,caractrespcial),ous'ilest
identiqueunmotcldeSQL(ex:DATE),ildoittremisentreguillemets
"".
Cenomestceluisouslequellacolonneseraconnuedesinterfacesexternes.Sous
SQLPLUS,parexemple,ilconstitueraletitrepardfautdelacolonne,etservira
derfrencepourdfinirunformatpourlacolonne.
Exemple:Salairedechaqueemploy.
SELECTnom,salaire"SALAIREMENSUEL"FROMemp
Remarque:Attention,cenomn'estpasconnul'intrieurduSELECT.
Classerlersultatd'uneinterrogation
Leslignesconstituantlersultatd'unSELECTsontobtenuesdansunordre
indtermin.Onpeut,dansunSELECT,demanderquelersultatsoitclassdans
unordreascendantoudescendant,enfonctionducontenud'uneouplusieurs
colonnes(jusqu'16critresdeclassementpossibles).Lescritresdeclassement
sontspcifisdansuneclauseORDERBYdontlasyntaxeestlasuivante:
ORDERBY{nom_col1|num_col1[DESC][,nom_col2|num_col2[DESC],...]}
Leclassementsefaitd'abordselonlapremirecolonnespcifiedansl'ORDERBY
puisleslignesayantlammevaleurdanslapremirecolonnesontclassesselon
ladeuximecolonnedel'ORDERBY,etc...Pourchaquecolonne,leclassementpeut
treascendant(pardfaut)oudescendant(DESC).
L'ORDERBYpeutfairerfrenceunecolonneparsonnomouparsapositiondans
lalistedescolonnesprsentesderrireleSELECT(lapremirecolonne
slectionnealenumro1,ladeuximealenumro2,...).
Exemple:Donnertouslesemploysclasssparfonction,etpourchaquefonction
classsparsalairedcroissant
SELECTnom,fonction,salaireFROMempORDERBYfonction,salaireDESC
Remarque:DansunclassementlesvaleursNULLsonttoujoursenttequelquesoit
l'ordreduclassement(ascendantoudescendant).
SyntaxeduSelect
SELECT[DISTINCT|ALL]
{*
|{[schema.]{table|view|snapshot}.*|expr[c_alias]
[,{[schema.]{table|view|snapshot}.*|expr[c_alias]}]...}
FROM[schema.]{table|view|snapshot}[t_alias]
[,[schema.]{table|view|snapshot}[t_alias]]...
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
7/44
20/2/2015
CoursdeSQL/Oracle
[WHEREcondition]
[[STARTWITHcondition]CONNECTBYcondition]
[GROUPBYexpr[,expr]...[HAVINGcondition]]
[{UNION|UNIONALL|INTERSECT|MINUS}SELECTcommand]
[ORDERBY{expr|position}[ASC|DESC][,{expr|position}[ASC|DESC]]...]
[FORUPDATE[OF[[schema.]{table|view}.]column
[,[[schema.]{table|view}.]column]...][NOWAIT]]
DISTINCT
renvoietoutesleslignesslectionnesenenlevantlesdoublons.
ALL
renvoietoutesleslignesslectionnessansenleverlesdoublons.C'estla
valeurpardfaut.
*
renvoietouteslescolonnesdetouteslestables,lesvuesetlesclichs
prcissdansleFROM.
table.*,view.*,snapshot.*
slectionnetouteslescolonnesdelatable,delavueouduclichprcis.
expr
slectionneuneexpressionhabituellementcalculesurlesvaleursdes
colonnesappartenantl'unedestables,vues,ouclichsdelaclauseFROM.
c_alias
lachanedecaractresquisertd'enttelacolonne(pardfautexpr)
schema
estlenomduschmacontenantlestables,vuesouclichsslectionns.Le
schmapardfautestceluidel'utilisateurquiexcutelarequte.
table,view,snapshot
estlenomdelatable,delavueouduclichcontenantlesdonnes
slectionnes.
t_alias
synonymepourlatabledontlenomprcde,utiliserdanslerestedela
requte.
WHERE
restreintleslignesslectionnescellespourlesquelleslaconditionest
vraie.Sicetteclauseestomise,toutesleslignesdestables,vuesou
clichsprcissderrireleFROMsontrenvoyes.
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
8/44
20/2/2015
CoursdeSQL/Oracle
STARTWITH,CONNECTBY
renvoieleslignesenparcourantunearborescence.
GROUPBY
groupeleslignesslectionnesensebasantsurlavaleurdeexprpour
chaqueligneetrenvoieuneseulelignepargroupe.
HAVING
restreintlesgroupesdelignesrenvoysceuxpourlesquelslacondition
spcifieestvraie.Sanscetteclause,touslesgroupessontrenvoys.
UNION,UNIONALL,INTERSECT,MINUS
CombineleslignesretournespardeuxSELECTenutilisantuneopration
ensembliste.
ORDERBY
ordonneleslignesslectionnes:
expr
enutilisantlavaleurdeexpr.Cetteexpressionestbasesurdescolonnes
prcisesderrireleSELECTousurdescolonnesappartenantdestables,
vuesouclichsprsentsderrireleFROM.
position
donnelenumrodelacolonnedansl'ordreduSELECT.
ASC,DESC
modeascendantoudescendant.LavaleurpardfautASC.
FORUPDATE
"locke"leslignesslectionnes.
NOWAIT
retournelecontrolel'utilisateursilacommandeSELECTessayedebloquer
unetableutiliseparunautreutilisateur.
Prrequis
Pourpouvoirslectionnerdeslignesd'unobjet(table,vue,clich)ilfautsoit
trepropritairedecetobjet,soitavoirleprivilgeSELECTsurcetobjet.
LeprivilgeSELECTANYTABLEpermetdeslectionnerdeslignesden'importequel
objetappartenantn'importequelutilisateur.
Les jointures
Lajointureestuneoprationpermettantdecombinerdesinformationsvenantde
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
9/44
20/2/2015
CoursdeSQL/Oracle
plusieurstables.Lesexemplessuivantsselimiterontdeuxtables,maisonpeut
joindrejusqu'256tables.Unejointureseformulesimplementenspcifiant
plusieurstablesderrireleFROMdelafaonsuivante:
SELECT...
FROMnom_table1,nom_table2...
WHEREpredicat;
Sionneprcisepasdeconditiondeslection,lersultatobtenuseraleproduit
cartsiendestablesprsentesderrireleFROM(rsultatnonsouhaiten
gnral).
Iln'existepasd'associationsimplicitesouexplicitesentrelestablesdansSQL.
Lesassociationsentrelestablessontdfiniesdynamiquementlorsdes
interrogations,cequicontribuelagrandesouplessedulangagesqletrend
possibletouteassociationmmesiellen'apastprvuelorsdeladfinition
etduchargementdelabase.
Equijointure
Lerapprochementdechaquelignedelatableempaveclalignedelatabledept
ayantmmenumrodedpartementpermetd'obtenirlalistedesemploysavecla
localitdanslaquelleilstravaillent.Cerapprochemententredeuxcolonnes
appartenantdeuxtablesdiffrentesmaisayantlemmesens(icilenumrode
dpartement)etvenantvraisemblablementd'unerelation1nlorsdelaconception
(ici1entitdpartementpournentitsemploys)estasseznaturel.C'est
pourquoicetypedejointureportelenomdejointurenaturelleoud'qui
jointure.
Exemple:Donnerpourchaqueemploysonnometsonlieudetravail.
SELECTemp.nom,lieuFROMemp,deptWHEREemp.n_dept=dept.n_dept
Lefaitquelacolonnecontenantlenumrodedpartementaitlemmenomdansles
deuxtablesarenduncessaireleprfixageparlenomdetabledanslecritrede
jointure(clauseWHERE).Lenomdecolonnenomaluiaussibesoind'treprfix
carilappartientauxdeuxtables(nomdelapersonnedansl'uneetnomdu
dpartementdansl'autre).Parcontrelenomdecolonnelieun'apasbesoind'tre
prfixcariln'yapasd'ambigutsurlatablelaquellecettecolonne
appartient.
Jointured'unetableellemme
Ilpeuttreutilederassemblerdesinformationsvenantd'uneligned'unetable
avecdesinformationsvenantd'uneautrelignedelammetable.
Exemple:Donnerpourchaqueemploylenomdesonsuprieurhirarchique.
SELECTemp.nom,mgr.nomFROMemp,empmgrWHEREemp.n_sup=mgr.num
Remarque:Danscecas,ilfautimprativementrenommeraumoinsl'unedesdeux
occurencesdelatable(iciemp)enluidonnantunsynonyme,afindepouvoir
prfixersansambiguitchaquenomdecolonne.
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
10/44
20/2/2015
CoursdeSQL/Oracle
Autresjointures
Lecritred'galitestlecritredejointureleplusnaturel.Maisonpeut
utiliserd'autrestypesdecomparaisonscommecritresdejointures.
Exemple:QuelssontlesemploysgagnantplusqueSIMON?
SELECTemp.nom,emp.salaire,emp.fonctionFROMemp,empjWHERE
emp.salaire>j.salaireANDJ.nom='SIMON'
Jointureexterne
Lorsqu'uneligned'unetablefigurantdansunejointuren'apasdecorrespondant
danslesautrestables,ellenesatisfaitpasaucritred'quijointureetdonc
nefigurepasdanslersultatdelajointure.
Uneoptionpermetdefairefigurerdanslersultatleslignessatisfaisantla
conditiond'quijointurepluscellesn'ayantpasdecorrespondant.Cetteoption
s'obtientenaccolant(+)aunomdecolonnedelatabledanslaquellemanquentdes
lments,danslaconditiond'quijointure.
Exemple:Ledpartement40nefiguraitpasdanslersultatduSELECT
prcdent.Parcontre,ilfigureradanslersultatduSELECTsuivant.
SELECTemp.nom,lieuFROMemp,deptWHEREemp.n_dept(+)=dept.n_dept
Le(+)peuts'interprtercommel'ajoutd'unelignefictivedonttoutesles
colonnesontlavaleurNULL,etquiraliselacorrespondanceavecleslignesde
l'autretablequin'ontpasdecorrespondantrel.Dansl'exemplecidessus,la
valeurdenomassocieaudpartement40estlavaleurNULL.
Exemple:Retrouverlesdpartementsn'ayantaucunemploy.
SELECTdept.n_dept,emp.nomFROMemp,deptWHEREdept.n_dept=emp.n_dept
(+)ANDemp.nomISNULL
11/44
20/2/2015
CoursdeSQL/Oracle
Lasyntaxed'utilisationestlammepourcestroisoprateurs:
SELECT...{UNION|INTERSECT|MINUS}SELECT...
Dansunerequteutilisantdesoprateursensemblistes:
TouslesSELECTdoiventavoirlemmenombredecolonnesslectionnes,et
leurtypesdoiventtreununidentiques.Lesconversionsventuelles
doiventtrefaitesl'intrieurduSELECTl'aidedesfonctionsde
conversion.
Lesdoublessontlimins(DISTINCTimplicite).
Lesnomsdecolonnes(titres)sontceuxdupremierSELECT.
LalargeurdescolonnesestlaplusgrandeparmitouslesSELECT.
Dansunerequteonnepeuttrouverqu'unseulORDERBY.S'ilestprsent,il
doittremisdansledernierSELECTetilnepeutfairerfrencequ'aux
numrosdescolonnesetnonpasleursnoms(carlesnomspeuventtre
diffrentsdanschacunedesinterrogations).
OnpeutcombinerlersultatdeplusdedeuxSELECTaumoyendesoprateurs
UNION,INTERSECT,MINUS.
SELECT...UNIONSELECT...MINUSSELECT...
Danscecasl'expressionestvaluedegauchedroite,maisonpeutmodifier
l'ordred'valuationenutilisantdesparenthses.
SELECT...
UNION(SELECT...
MINUS
SELECT...)
Sousinterrogationramenantuneseulevaleur
Exemple:QuelssontlesemploysayantlammefonctionqueCODD?
SELECTnomFROMempWHEREfonction=(SELECTfonctionFROMempWHEREnom
='CODD')
Remarques
unesousinterrogationquineramneaucunelignesetermineavecuncode
d'erreur.
unesousinterrogationramenantplusieurslignesprovoqueraaussi,dansce
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
12/44
20/2/2015
CoursdeSQL/Oracle
cas,uneerreur(pourtraitercorrectementcecas,voirparagrapheci
dessous)
Sousinterrogationramenantplusieurslignes
Unesousinterrogationpeutramenerplusieurslignesconditionquel'oprateur
decomparaisonadmettesadroiteunensembledevaleurs.Lesoprateurs
permettantdecomparerunevaleurunensembledevaleurssont:
l'oprateurIN
lesoprateursobtenusenajoutantANYouALLlasuited'unoprateurde
comparaisonclassique(=,!=,>,>=,<,<=)
ANY:lacomparaisonestvraiesielleestvraiepouraumoinsundes
lmentsdel'ensemble.
ALL:lacomparaisonseravraiesielleestvraiepourtousleslments
del'ensemble.
Exemple:Quelssontlesemploysgagnantplusquetouslesemploysdu
dpartement30.
SELECTnom,salaireFROMempWHEREsalaire>ALL(SELECTsalaireFROMemp
WHEREn_dept=20)
Sousinterrogationramenantplusieurscolonnes
Ilestpossibledecomparerlersultatd'unSELECTramenantplusieurscolonnes
unelistedecolonnes.Lalistedecolonnesfigureraentreparenthsesgauche
del'oprateurdecomparaison.
Exemple:QuelssontlesemploysayantmmefonctionetmmesuprieurqueCODD?
SELECTnom,fonction,n_supFROMempWHERE(fonction,n_sup)=(SELECT
fonction,n_supFROMempWHEREnom='CODD')
Sousinterrogationsynchroniseavecl'interrogationprincipale
Danslesexemplesprcdents,lasousinterrogationtaitvalued'abord,puisle
rsultatpouvaittreutilispourexcuterl'interrogationprincipale.SQLsait
galementtraiterunesousinterrogationfaisantrfrenceunecolonnedela
tabledel'interrogationprincipale.Letraitementdanscecasestpluscomplexe
carilfautvaluerlasousinterrogationpourchaquelignedel'interrogation
principale.
Exemple:Quelssontlesemploysnetravaillantpasdanslemmedpartementque
leursuprieurhirarchique.
SELECTnomFROMempeWHEREn_dept!=(SELECTn_deptFROMempWHERE
e.n_sup=num)ANDn_supISNOTNULL
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
13/44
20/2/2015
CoursdeSQL/Oracle
Ilafalluicirenommerlatableempdel'interrogationprincipalepourpouvoirla
rfrencerdanslasousinterrogation.
n_supISNOTNULLestncessairecardanslecasdeJOUBERTlacolonnen_supestNULL
etlasousrequteneramnealorsaucunevaleur.
Sousinterrogationramenantaumoinsuneligne
L'oprateurEXISTSpermetdeconstruireunprdicatvraisilasousinterrogation
quisuitramneaumoinsuneligne.
Exemple:Quelssontlesemploystravaillantdansundpartementquiaprocd
desembauchesdepuisledbutdel'anne94.
SELECT*FROMempeWHEREEXISTS(SELECT*FROMempWHEREembauche>='01
jan94'ANDn_dept=e.n_dept)
Remarque:Onpeutinverserlesensdel'oprateurEXISTSenlefaisantprcder
deNOT.
Sousinterrogationsmultiples
UnSELECTpeutcomporterplusieurssousinterrogations,soitimbriques,soitau
mmeniveaudansdiffrentsprdicatscombinspardesANDoudesOR.
Exemple:Listedesemploysdudpartement10ayantmmefonctionquequelqu'un
dudpartementdeDUPONT.
SELECTnom,fonctionFROMempWHEREn_dept=10ANDfonctionIN(SELECT
fonctionFROMempWHEREn_dept=(SELECTn_deptFROMempWHEREnom=
'DUPONT'))
14/44
20/2/2015
CoursdeSQL/Oracle
dansuneclauseORDERBY.
Ilexistetroistypesd'expressionscorrespondantchacununtypededonnesde
SQL:arithmtique,chanedecaractre,date.Achaquetypecorrespondentdes
oprateursetdesfonctionsspcifiques.
SQLautoriselesmlangesdetypesdanslesexpressionseteffectuerales
conversionsncessaires:dansuneexpressionmlangeantdatesetchanesde
caractres,leschanesdecaractresserontconvertiesendates,dansune
expressionmlangeantnombresetchanesdecaractres,leschanesdecaractres
serontconvertiesennombre.
Expressionsetfonctionsarithmtiques
Uneexpressionarithmtiquepeutcontenir:
desnomsdecolonnes
desconstantes
desfonctionsarithmtiques
combinsaumoyendesoprateursarithmtiques.
Oprateursarithmtiques
Lesoprateursarithmtiquesprsentsdanssqlsontlessuivants:
+additionou+unaire
soustractionouunaire
*multiplication
/division
Remarque:ladivisionpar0provoqueunefinaveccoded'erreur.
Prioritdesoprateurs
Uneexpressionarithmtiquepeutcomporterplusieursoprateurs.Danscecas,le
rsultatdel'expressionpeutvarierselonl'ordredanslequelsonteffectuesles
oprations.Lesoprateursdemultiplicationetdedivisionsontprioritairespar
rapportauxoprateursd'additionetdesoustraction.Desparenthsespeuventtre
utilisespourforcerl'valuationdel'expressiondansunordrediffrentde
celuidcoulantdelaprioritdesoprateurs.
Exemple:Donnerpourchaquecommercialsonrevenu(salaire+commission).
SELECTnom,salaire+commFROMempWHEREfonction='commercial'
Exemple:Donnerlalistedescommerciauxclasseparcommissionsursalaire
dcroissant.
SELECTnom,comm/salaire,comm,salaireFROMempWHEREfonction=
'commercial'ORDERBYcomm/salaireDESC
Exemple:Donnerlalistedesemploysdontlacommissionestinfrieure5%du
salaire.
SELECTnom,salaire,commFROMempWHEREcomm<=salaire*.05
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
15/44
20/2/2015
CoursdeSQL/Oracle
Fonctionsarithmtiques
Dansceparagraphe,onttregroupeslesfonctionsayantunouplusieursnombres
commearguments,etrenvoyantunevaleurnumrique.[ROUND(n,m)]
ABS(nb)
Renvoielavaleurabsoluedenb.
CEIL(nb)
Renvoielepluspetitentiersuprieurougalnb.
COS(n)
Renvoielecosinusden,ntantunangleexprimenradians.
COSH(n)
Renvoielecosinushyperboliqueden.
EXP(n)
Renvoieepuissancen.
FLOOR(nb)
Renvoieleplusgrandentierinfrieurougalnb.
LN(n)
Renvoielelogarithmenpriendenquidoittreunentierstrictement
positif.
LOG(m,n)
Renvoielelogarithmeenbasemden.mdoittreunentierstrictement
suprieur1,etnunentierstrictementpositif.
MOD(m,n)
Renvoielerestedeladivisionentiredemparn,sinvaut0alorsrenvoie
m.Attention,utiliseavecaumoinsundesesargumentsngatifs,cette
fonctiondonnedesrsultatsquipeuventtrediffrentsd'unmodulo
classique.Cettefonctionnedonnepastoujoursunrsultatdontlesignedu
diviseur.
POWER(m,n)
Renvoiempuissancen,metnpeuventtredesnombresquelconquesentiersou
relsmaissimestngatifndoittreunentier.
ROUND(n[,m])
Simestpositif,renvoienarrondi(etnonpastronqu)mchiffresaprs
lavirgule.Simestngatif,renvoienarrondimchiffresavantla
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
16/44
20/2/2015
CoursdeSQL/Oracle
virgule.mdoittreunentieretilvaut0pardfaut.
SIGN(nb)
Renvoie1sinbestngatif,0sinbestnul,1sinbestpositif.
SIN(n)
Renvoielesinusden,ntantunangleexprimenradians.
SINH(n)
Renvoielesinushyperboliqueden.
SQRT(nb)
Renvoielaracinecarredenbquidoittreunentierpositifounul.
TAN(n)
Renvoielatangenteden,ntantunangleexprimenradians.
TANH(n)
Renvoielatangentehyperboliqueden.
TRUNC(n[,m])
Simestpositif,renvoienarronditronqumchiffresaprslavirgule.Si
mestngatif,renvoientronqumchiffresavantlavirgule.mdoittre
unentieretilvaut0pardfaut.
Exemple:Donnerpourchaqueemploysonsalairejournalier.
SELECTnom,ROUND(salaire/22,2)FROMemp
Expressionsetfonctionssurleschanesdecaractres
Oprateursurleschanesdecaractres
Ilexisteunseuloprateursurleschanesdecaractres:laconcatnation.Cet
oprateursenoteaumoyendedeuxcaractres|(barreverticale)accols.Le
rsultatd'uneconcatnationestunechanedecaractresobtenueencrivant
d'abordlachanegauchede||puiscelledroitede||.
SELECTnom||'/'||fonctionFROMemp
Fonctionssurleschanesdecaractres
Leparagraphesuivantcontientlesfonctionstravaillantsurleschanesde
caractresetrenvoyantdeschanesdecaractres.
CONCAT(chane1,chane2)
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
17/44
20/2/2015
CoursdeSQL/Oracle
Renvoielachaneobtenueenconcatnantchane1chane2.Cettefonctionest
quivalentel'oprateurdeconcatnation||.
INITCAP(chane)
Renvoiechaneenayantmislapremirelettredechaquemotenmajusculeet
touteslesautresenminuscule.Lessparateursdemotssontlesespaceset
lescaractresnonalphanumriques.
LOWER(chane)
Renvoiechaneenayantmistoutesseslettresenminuscules.
LPAD(chane,long,[char])
Renvoielachaneobtenueencompltant,ouentronquant,chanepourqu'elle
aitcommelongueurlongenajoutantventuellementgauchelecaractre(ou
lachanedecaractres)char.Lavaleurpardfautdecharestunespace.
LTRIM(chane[,ens])
Renvoielachaneobtenueenparcourantpartirdelagauchechaneeten
supprimanttouslescaractresquisontdansens.Ons'arrtequandontrouve
uncaractrequin'estpasdansens.Lavaleurdedefautdeensestun
espace.
REPLACE(chaine,avant,aprs
Renvoiechainedanslaquelletouteslesoccurrencesdelachanede
caractresavantonttremplacsparlachanedecaractresaprs.
RPAD(chane,n,[char])
Renvoielachaneobtenueencompltant,ouentronquant,chanepourqu'elle
aitcommelongueurlongenajoutantventuellementdroitelecaractre(ou
lachanedecaractres)char.Lavaleurpardfautdecharestunespace.
RTRIM(chane[,ens])
Renvoielachaneobtenueenparcourantpartirdeladroitechaneeten
supprimanttouslescaractresquisontdansens.Ons'arrtequandontrouve
uncaractrequin'estpasdansens.Lavaleurdedefautdeensestun
espace.
SOUNDEX(chane)
Renvoielachanedecaratresconstituedelareprsentationphontiquedes
motsdechane.
SUBSTR(chane,m[,n])
Renvoielapartiedechanecommenantaucaractremetayantunelongueur
den.
TRANSLATE(chane,avant,aprs)
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
18/44
20/2/2015
CoursdeSQL/Oracle
Renvoieunechanedecaractresenremplaantchaquecaractredechane
prsentdansavantparlecaractresitulammepositiondansaprs.Les
caractresdechanenonprsentsdansavantnesontpasmodifis.avantpeut
contenirplusdecaractresqueaprs,danscecaslescaractresdeavant
sanscorrespondantsdansaprsserontsupprimsdechane.
UPPER(chane)
Renvoiechaneenayantmistoutesseslettresenmajuscules.
Leparagraphesuivantcontientlesfonctionstravaillantsurleschanesde
caractresetrenvoyantdesentiers.
INSTR(chane,souschane,debut,occ)
Renvoielapositiondupremiercaractredechanecorrespondant
l'occurrenceoccdesouschaneencommenantlarecherchelapositiondbut.
LENGTH(chane)
Renvoielalongueurdechane,exprimeennombredecaractres.
Expressionsetfonctionssurlesdates
Oprateurssurlesdates
Aumoyendesoprateursarithmtiques+etilestpossibledeconstruireles
expressionssuivantes:
date+/nombre:leresultatestunedateobtenueenajoutantlenombrede
joursnombreladatedate.
date2date1:leresultatestlenombredejoursentrelesdeuxdates.
Fonctionssurlesdates
ADD_MONTHS(date,n)
Renvoieladateobtenueenajoutantnmoisdate.npeuttreunentier
quelconque.Silemoisobtenuamoinsdejoursquelejourdedate,lejour
obtenuestledernierdumois.
LAST_DAY(date)
Renvoieladatedudernierjourdumoisdedate.
MONTHS_BETWEEN(date2,date1)
Renvoielenombredemoisentredate2etdate1,sidate2estaprsdate1le
rsultatestpositif,sinonlersultatestngatif.Silesjoursdate2et
date1sontlesmmes,ousicesontlesderniersjoursdumois,lersultat
estunentier.Lapartiefractionnaireestcalculeenconsidrantchaque
jourcomme1/31medemois
NEXT_DAY(date,nom_du_jour)
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
19/44
20/2/2015
CoursdeSQL/Oracle
Renvoieladateduprochainjourdelasemainedontlenomestnom_de_jour.
ROUND(date[,prcision])
Renvoiedatearrondiel'unitspcifiedansprcision.L'unitdeprcision
estindiqueenutilisantundesmasquesdemiseenformedeladate.Onpeut
ainsiarrondirunedatel'anne,aumois,laminute,...Pardfautla
prcisionestlejour.
SYSDATE
Renvoieladateetl'heurecourantesdusystmed'exploitationhote.
TRUNC(date[,prcision])
Renvoiedatetronquel'unitspcifiedansprcision.Lesparamtressont
analoguesceuxdelafonctionROUND.
Exemple:Donnerladatedulundisuivantl'embauchedechaqueemploy.
SELECTNEXT_DAY(embauche,'MONDAY')FROMemp
Exemple:Donnerladated'embauchedechaqueemployarrondiel'anne
SELECTROUND(embauche,'Y')FROMemp
Exemple:Donnerpourchaqueemploylenombredejoursdepuissonembauche.
SELECTROUND(SYSDATEembauche)FROMemp
Fonctionsdeconversion
ASCII(chane)
Renvoielenombrecorrespondantaucodeasciidupremiercaractredechaine.
CHR(nombre)
Renvoielecaractredontnombreestlecodeascii.
TO_CHAR(nombre,format)
Renvoielachanedecaratresenobtenueenconvertissantnombreenfonction
deformat.
Formatestunechanedecaractrespouvantcontenirlescaractres
suivants:
9
reprsenteunchiffre(nonreprsentsinonsignificatif)
0
reprsenteunchiffre(reprsentmmesinonsignificatif)
.
pointdcimalapparent
V
dfinitlapositiondupointdcimalnonapparent
,
unevirguleapparatracetendroit
$
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
20/44
20/2/2015
CoursdeSQL/Oracle
un$prcderalepremierchiffresignificatif
B
lenombreserareprsentpardesblancss'ilvaut0
EEEE
lenombreserareprsentavecunexposant(lespcifieravantMIouPR)
MI
lesignengatifseradroite
PR
unnombrengatifseraentre<>
TO_CHAR(date,format)
Renvoieconversiond'unedateenchanedecaractres.Leformatindique
quellepartiedeladatedoitapparatre,c'estunecombinaisondescodes
suivants:
scc
sicleavecsigne
cc
sicle
sy,yyy
anne(avecsigneetvirgule)
y,yyy
anne(avecvirgule)
yyyy
anne
yyy
3dernierschiffresdel'anne
yy
2dernierschiffresdel'anne
y
dernierchiffredel'anne
q
numrodutrimestredansl'anne
ww
numrodelasemainedansl'anne
w
numrodelasemainedanslemois
mm
numrodumois
ddd
numrodujourdansl'anne
dd
numrodujourdanslemois
d
numrodujourdanslasemaine
hhouhh12
heure(sur12heures)
hh24
heuresur24heures
mi
minutes
ss
secondes
sssss
secondesaprsminuit
j
jourducalendrierjulien
Lesformatssuivantspermettentd'obtenirdesdatesenlettres(enanglais):
syearouyear
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
21/44
20/2/2015
CoursdeSQL/Oracle
anneentouteslettres
month
nomdumois
mon
nomdumoisabrgsur3lettres
day
nomdujour
dy
nomdujourabrgsur3lettres
amoupm
indicationamoupm
bcouad
indicationavantouaprsJsusChrist
Lessuffixessuivantsmodifientlaprsentationdunombreauquelilssontaccols
:
th
ajoutdusuffixeordinatst,nd,rd,th
sp
nombreentouteslettres
Toutcaractrespcialinsrdansleformatserareproduittelqueldansla
chanedecaractresrsultat.
TO_DATE(chane,format)
Permetdeconvertirunechanedecaractresendonnedetypedate.Le
formatestidentiqueceluidelafonctionTO_CHAR.
TO_NUMBER(chane)
Convertitchaneensavaleurnumrique.
Remarque:Onpeutgalementinsrerdansleformatunechanedecaractres
quelconque,conditiondelaplacerentreguillemets"".
Exemple:
SELECTTO_CHAR(embauche,'DD/MM/YYHH24:MI:SS')FROMemp
Exemple:DonnerlalistedetouslesemploysdontlenomressembleDUPONT.
SELECTnomFROMempWHERESOUNDEX(nom)=SOUNDEX('DUPONT')
Exemple:Donnerlalistedetouslesnomsdesemploysenayantsupprimtousles
'L'etles'E'enttedesnoms.
SELECTLTRIM(nom,'LE')FROMemp
Exemple:DonnerlalistedetouslesnomsdesemploysenayantremplaclesAet
lesMpardes*danslesnoms.
SELECTTRANSLATE(nom,'AM','**')FROMemp
Exemple:Affichertouslessalairesavecun$entteetaumoinstroischiffres
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
22/44
20/2/2015
CoursdeSQL/Oracle
(dontdeuxdcimales).
SELECTTO_CHAR(salaire,'<MATH>99900.00')FROMemp
Autresfonctions
GREATEST(expr1,expr2,...)
Renvoielaplusgrandedesvaleursexpr1,expr2,....Touteslesexpressions
sontconvertiesauformatdeexpr1avantcomparaison.
LEAST
Renvoielapluspetitedesvaleursexpr1,expr2,....Touteslesexpressions
sontconvertiesauformatdeexpr1avantcomparaison.
NVL(expr_1,expr_2)
Prendlavaleurexpr_1,saufsiexpr_1estNULLauquelcasNVLprendlavaleur
expr_2.
UnevaleurNULLenSQLestunevaleurnondfinie.
Lorsquel'undestermesd'uneexpressionalavaleurNULL,l'expression
entireprendlavaleurNULL.D'autrepart,unprdicatcomportantune
comparaisonavecuneexpressionayantlavaleurNULLprendratoujoursla
valeurfaux.LafonctionNVLpermetderemplacerunevaleurNULLparune
valeursignificative.
DECODE(crit,val_1,res_1[,val_2,res_2...],def)
Cettefonctionpermetdechoisirunevaleurparmiunelisted'expressions,en
fonctiondelavaleurpriseparuneexpressionservantdecritrede
slection.
Lersultatrcuprest:
res_1sil'expressioncritalavaleurval_1
res_2sil'expressioncritalavaleurval_2
def(lavaleurpardfaut)sil'expressioncritn'estgale
aucunedesexpressionsval_1,val_2,...,.
Lesexpressionsrsultatsres_1,res_2,...,defpeuventtredetypes
diffrents:caractreetnumrique,oucaractreetdate(lersultatestdu
typedelapremireexpressionrencontrdansleDECODE).
LafonctionDECODEpermetgalementdemlangerdansunecolonnersultatdes
informationsvenantdeplusieurscolonnesd'unemmetable.
Exemple:Donnerpourchaqueemploysesrevenus(salaire+commission).
SELECTnom,salaire,comm,salaire+NVL(comm,0)FROMemp
Exemple:Donnerlalistedesemploysavecpourchacund'euxsacatgorie
(prsident=1,directeur=2,autre=3)
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
23/44
20/2/2015
CoursdeSQL/Oracle
SELECTnom,DECODE(fonction,'president',1,'directeur',2,3)FROMemp
Exemple:Donnerlalistedesemploysenlesidentifiantparleurfonctiondans
ledpartement10etparleurnomdanslesautresdpartements.
SELECTDECODE(n_dept,10,fonction,nom)FROMemp
24/44
20/2/2015
CoursdeSQL/Oracle
Indiquelafonctiondegroupedeprendreencomptetouteslesvaleurs,
c'estlavaleurpardfaut.
Exemple:Donnerletotaldessalairesdudpartement10.
SELECTSUM(salaire)FROMempWHEREn_dept=10
Exemple:Donnerlenom,lafonctionetlesalairedel'employ(oudesemploys)
ayantlesalairelepluslev.
SELECTnom,fonction,salaireFROMempWHEREsalaire=(SELECT
MAX(salaire)FROMemp)
Remarques
CesSELECTsontdiffrentsdeceuxvusprcdemment.Ilest,parexemple,
impossiblededemanderenrsultatlafoisunecolonneetunefonctionde
groupe.
unSELECTcomportantunefonctiondegroupepeuttreutilisdansune
sousinterrogation.
ValeursNULL
AucunedesfonctionsdegroupenetientcomptedesvaleursNULLl'exceptionde
count(*).Ainsi,SUM(col)estlasommedesvaleursnonNULLdelacolonnecol.De
mmeAVGestlasommedesvaleursnonNULLdiviseparlenombredevaleursnon
NULL.
Calculsurplusieursgroupes
Ilestpossibledesubdiviserlatableengroupes,chaquegroupetantl'ensemble
deslignesayantunevaleurcommune.C'estlaclauseGROUPBYquipermetde
dcouperlatableenplusieursgroupes:
GROUPBYexpr_1,expr_2,...
Sionauneseuleexpression,cecidfinitlesgroupescommelesensemblesde
lignespourlesquellescetteexpressionprendlammevaleur.Siplusieurs
expressionssontprsenteslesgroupessontdfinisdelafaonsuivante:parmi
toutesleslignespourlesquellesexpr_1prendlammevaleur,onregroupecelles
ayantexpr_2identique,...UnSELECTdegroupeavecuneclauseGROUPBYdonnera
unelignersultatpourchaquegroupe.
Exemple:Totaldessalairespourchaquedpartement
SELECTSUM(salaire),n_deptFROMempGROUPBYn_dept
Remarque:Danslalistedescolonnesrsultatd'unSELECTcomportantune
fonctiondegroupe,nepeuventfigurerquedescaractristiquesdegroupe,c'est
dire:
soitdesfonctionsdegroupe
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
25/44
20/2/2015
CoursdeSQL/Oracle
soitdesexpressionsfigurantdansleGROUPBY.
Slectiondesgroupes
Delammefaonqu'ilestpossibledeslectionnercertaineslignesaumoyende
laclauseWHERE,ilestpossibledansunSELECTcomportantunefonctiondegroupe
deslectionnerparlaclauseHAVING,quiseplaceaprslaclauseGROUPBY.
LeprdicatdanslaclauseHAVINGsuitlesmmesrglesdesyntaxequ'unprdicat
figurantdansuneclauseWHERE.
Cependant,ilnepeutporterquesurdescaractristiquesdugroupe:fonctionde
groupeouexpressionfigurantdanslaclauseGROUPBY,danscecaslaclauseHAVING
doittreplaceaprslaclauseGROUPBY.
Exemple:Donnerlalistedessalairesmoyensparfonctionpourlesgroupesayant
plusdedeuxemploys.
SELECTfonction,COUNT(*),AVG(salaire)FROMempGROUPBYfonctionHAVING
COUNT(*)>2
Remarque:UnSELECTdegroupepeutcontenirlafoisuneclauseWHEREetune
clauseHAVING.LaclauseWHEREserad'abordappliquepourslectionnerleslignes,
puislesgroupesserontconstituspartirdeslignesslectionnes,etles
fonctionsdegroupeserontvalues.
Exemple:Donnerlenombred'ingnieursoudecommerciauxdesdpartementsayant
aumoinsdeuxemploysdecescatgories.
SELECTn_dept,COUNT(*)FROMempWHEREfonctionin
('ingenieur','commercial')GROUPBYn_deptHAVINGCOUNT(*)>=2
UneclauseHAVINGpeutcomporterunesousinterrogation.
Exemple:Quelestledpartementayantleplusd'employs?
SELECTn_dept,COUNT(*)FROMempGROUPBYn_deptHAVINGCOUNT(*)=(SELECT
MAX(COUNT(*))FROMempGROUPBYn_dept)
Fonctiondegroupedeuxniveaux
Ilestpossibled'appliqueraursultatd'unSELECTavecGROUPBYundeuxime
niveaudefonctiondegroupe.
Exemple:lafonctionMAXpeuttreappliqueauxnombresd'employsdechaque
dpartementpourobtenirlenombred'employsdudpartementayantleplus
d'employs.
SELECTMAX(COUNT(*))FROMempGROUPBYn_dept
26/44
20/2/2015
CoursdeSQL/Oracle
Dfinition
Lelangagedemanipulationdedonnesestlelangagepermettantdemodifierles
informationscontenuesdansunebasededonnes.
L'unitmanipuleestlaligne.IlexistetroiscommandesSQLpermettant
d'effectuerlestroistypesdemodificationsdesdonnes:ajout,modificationet
suppression.
Ajoutdelignes
Dfinition
LacommandeINSERTpermetd'insrerunelignedansunetableenspcifiantles
valeursinsrer.Lasyntaxeestlasuivante:
INSERTINTOnom_table(nom_col1,nom_col2,...)
VALUES(val1,val2...)
Lalistedesnomsdecolonneestoptionnelle.Sielleestomise,lalistedes
colonnesserapardfautlalistedel'ensembledescolonnesdelatabledans
l'ordredelacrationdelatable.
Siunelistedecolonnesestspcifie,lescolonnesnefigurantpasdanslaliste
aurontlavaleurNULL.
Ilestpossibled'insrerdansunetabledeslignesprovenantd'uneautretable.
Lasyntaxeestlasuivante:
INSERTINTOnom_table(nom_col1,nom_col2,...)
SELECT...
LeSELECTpeutcontenirn'importequelleclausesaufunORDERBYquiimpliquerait
unclassementdeslignescontrairel'espritdurelationnel.
Exemple:Insrerdanslatablebonuslesnomsetsalairesdesdirecteurs.
INSERTINTObonus
SELECTnom,salaire
FROMemp
WHEREfonction='directeur'
Syntaxe
INSERTINTO[schema.]table|view
[(column[,column]...)]
VALUES(expr[,expr]...)|subquery
schema
estlenomduschmacontenantlatableoulavue.Leschmapardfautest
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
27/44
20/2/2015
CoursdeSQL/Oracle
celuidel'utilisateurquiexcutelarequte.
table/view
estlenomdelatabledanslaquelleleslignesserontinsrs.Sic'estun
nomdevuequiestprcis,lesdonnesserontinsrsdanslatablebase
surlavue.
column
nomdescolonnes
VALUESExpr/subquery
Valeursdescolonnes
Prrequis
Pourpouvoirinsrerdeslignesdansunetableilfautsoittrepropritairede
cetobjet,soitavoirleprivilgeINSERTsurcettetable.
LeprivilgeINSERTANYTABLEpermetd'insrerdeslignesdansn'importequelle
tableappartenantn'importequelutilisateur.
Modificationdelignes
Dfinition
LacommandeUPDATEpermetdemodifierlesvaleursd'uneouplusieurscolonnes,
dansuneouplusieurslignesexistantesd'unetable.Lasyntaxeestlasuivante:
UPDATEnom_table
SETnom_col1={expression1|(SELECT...)},
nom_col2={expression2|(SELECT...)}
WHEREpredicat
Lesvaleursdescolonnesnom_col1,nom_col2,...sontmodifiesdanstoutesles
lignessatisfaisantauprdicat.Enl'absenced'uneclauseWHERE,toutesles
lignessontmisesjour.
Lesexpressionsexpression1,expression2,...peuventfairerfrenceauxanciennes
valeursdelaligne.
Exemple:Augmenterde10%lesingnieurs.
UPDATEemp
SETsalaire=salaire*1.1
WHEREfonction='ingenieur'
Syntaxe
UPDATE[schema.]table|view[alias]
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
28/44
20/2/2015
CoursdeSQL/Oracle
SET(column[,column]...)=(subquery)
|column=expr|(subquery)
[,(column[,column]...)=(subquery)
|column=expr|(subquery)]...
[WHEREcondition]
schema
estlenomduschmacontenantlatableoulavuemodifier.Leschmapar
dfautestceluidel'utilisateurquiexcutelarequte.
table,view
estlenomdelatablemettrejour.Sic'estunnomdevue,latablemise
jourestcellesurlaquellelavueestdfinie.
alias
estunaliasassignlatable.lesaliassontgnralementutilissdans
desUPDATEcontenantdesrequtes.
column
estlenomdelacolonnequiseramodifie.
expr
estlanouvellevaleurdelacolonne.
subquery
estunSELECTquirenvoielesnouvellesvaleursaffectesauxcolonnes
correspondantes.
WHERE
restreintleslignesmodifiescellespourlesquelleslaconditionest
vraie.Sionometcetteclausetoutesleslignessontmodifies.
Prrequis
Pourpouvoirmodifierdeslignesappartenantunetable,ilfautsoittre
propritairedecetobjet,soitavoirleprivilgeUPDATEsurcettetable.
leprivilgeUPDATEANYTABLEpermetdeslectionnerdeslignesden'importequel
objetappartenantn'importequelutilisateur.
Suppressiondelignes
Dfinition
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
29/44
20/2/2015
CoursdeSQL/Oracle
LacommandeDELETEpermetdesupprimerdeslignesd'unetable.
Lasyntaxeestlasuivante:
DELETEFROMnom_table
WHEREprdicat;
Toutesleslignespourlesquellesprdicatestvaluvraisontsupprimes.En
l'absencedeclauseWHERE,toutesleslignesdelatablesontsupprimes.
Syntaxe
DELETE[FROM][schema.]table|view[alias]
[WHEREcondition]
schema
estlenomduschmacontenantlatableoulavuedtruire.Leschmapar
dfautestceluidel'utilisateurquiexcutelarequte.
table,view
estlenomdelatableoudelavuecontenantleslignesquiseront
dtruites.Sic'estunnomdevue,leslignesdtruitesappartiennentla
tablesurlaquellelavueestbase.
alias
Estunaliasassignlatable.lesaliassontgnralementutilissdans
desDELETEcontenantdesrequtes.
WHERE
Dtruitseulementleslignessatisfaisantlacondition.Cetteconditionpeut
rfrencerlatableetpeutcontenirdessousrequtes.Sicetteclauseest
omisedtruittoutesleslignes.
Prrequis
Pourdtruiredeslignesappartenantunetable,ilfautsoittrepropritaire
delatable,soitavoirleprivilgeDELETEsurcettetable.
LeprivilgeDELETEANYTABLEpermetunutilisateurdedtruiredeslignesse
trouvantdansn'importequelletable,oun'importequellevuebasesurunetable.
Suppressiond'unetable
Dfinition
LacommandeDROPpermetdedtruireunetableettoutessesdonnes.
Syntaxe
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
30/44
20/2/2015
CoursdeSQL/Oracle
DROPTABLE[schema.]table
[CASCADECONSTRAINTS]
schema
estlenomduschmacontenantlatableoulavuedtruireLeschmapardfaut
estceluidel'utilisateurquiexcutelarequte.
table
estlenomdelatabledtruire.
CASCADECONSTRAINTS
Supprimetouteslescontraintesquisereferelatablesupprime.
Prrequis
Pourpouvoirdtruireunetableilfautsoittrepropritairedecettetable,
soitavoirleprivilgeDROPANYTABLE.
Gestiondestransactions
Unetransactionestunensembledemodificationsdelabasequiformeuntout
indivisible.Ilfauteffectuercesmodificationsentirementoupasdutout,sous
peinedelaisserlabasedansuntatincohrent.
LesSystmesdeGestiondeBasesdeDonnespermettentauxutilisateursdegrer
leurstransactions.Ilspeuventtoutmoment:
ValiderlatransactionencoursparlacommandeCOMMIT.Lesmodifications
deviennentdfinitivesetvisiblestouslesutilisateurs.
AnnulerlatransactionencoursparlacommandeROLLBACK.Toutesles
modificationsdepuisledbutdelatransactionsontalorsdfaites.
Encoursdetransaction,seull'utilisateurayanteffectulesmodificationsles
voit.
Cemcanismeestutilisparlessystmesdegestiondebasesdedonnespour
assurerl'intgritdelabaseencasdefinanormaled'unetcheutilisateur:il
yaautomatiquementROLLBACKdestransactionsnontermines.
ORACLEestunsystmetransactionnelquiassurelacohrencedesdonnesencasde
misejourdelabase,mmesiplusieursutilisateurslisentoumodifientles
mmesdonnessimultanment.
ORACLEutiliseunmcanismedeverrouillagepourempcherdeuxutilisateurs
d'effectuerdestransactionsincompatiblesetrglerlesproblmespouvant
survenir.
ORACLEpermetleverrouillagedecertainesunits(tableouligne)automatiquement
ousurdemandedel'utilisateur.
Lesverroussontlibrsenfindetransaction.
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
31/44
20/2/2015
CoursdeSQL/Oracle
Les tables
Lelangagededfinitiondesdonnesestlelangagepermettantdecreroude
modifierleschmad'unerelationetdoncd'unetable.
Ilpermetdecrer,demodifieretdesupprimernonseulementlestables,mais
aussilesvues,lesindexetlesclusters.
Crerunetable
Latableestlastructuredebasecontenantlesdonnesdesutilisateurs.Quandon
creunetable,onpeutspcifierlesinformationssuivantes:
ladfinitiondescolonnes,
lescontraintesd'intgrit,
LaTableSpacecontenantlatable,
lescaractristiquesdestockage,
leclustercontenantlatable,
lesdonnesrsultantd'uneventuellerequte.
Crationsimple
Lacommandedecrationdetablelaplussimplenecomporteraquelenometle
typedechaquecolonnedelatable.L'onpeutcrerunetableparlacommande
CREATETABLEenspcifiantlenometletypedechaquecolonne.Alacration,la
tableseravidemaisuncertainespaceluiseraallou.Lasyntaxeestlasuivante
:
CREATETABLEnom_table
(nom_col1TYPE1,
nom_col2TYPE2,
...)
L'optionNOTNULLassurequ'ORACLEinterditlorsd'unINSERToud'unUPDATEque
cettecolonnecontiennelavaleurNULL,pardfautelleestautorise.
CrationavecInsertiondedonnes
Onpeutinsrerdesdonnesdansunetablelorsdesacrationparlacommande
suivante:
CREATETABLEnom_table
[(nom_col1,
nom_col2,
...)]
ASSELECT...
Onpeutainsi,enunseulordreSQLcrerunetableetlarempliravecdesdonnes
provenantdursultatd'unSELECT.
Onn'apasbesoinalorsdespcifierdetypepourlescolonnes:lestypesdes
donnessontceuxprovenantduSELECT.Sidesconversionsdetypesontfaire,
onpeutdansleSELECTutiliserlesfonctionsTO_CHAR,TO_DATE,TO_NUMBER.
Pardfautlesnomsdescolonnesdelanouvelletablesontlesnomsdescolonnes
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
32/44
20/2/2015
CoursdeSQL/Oracle
duSELECT.SidesexpressionsapparaissentdansleSELECT,lescolonnes
correspondantesdoiventimprativementtrerenommes.
LeSELECTpeutcontenirdesfonctionsdegroupesmaispasd'ORDERBYcarles
lignesd'unetablenepeuventpastreclasses.
Onpeut,etmmeondoit,quandoncreunetabledfinirlescontraintes
d'intgritquedevrontrespecterlesdonnesquel'onmettradanslatable(voir
unpeuplusbas).
Lestypesdedonnes
NUMBER[(longueur,[prcision])
Cetypededonnespermetdestockerdesdonnesnumriqueslafois
entiresetrellesdontlavaleurestcompriseentre10^130et10^125avec
uneprcisionde38chiffres.
longueur
prciselenombremaximumdechiffressignificatifsstocks(pardfaut38),
prcision
donnelenombremaximumdechiffresaprslavirgule(pardfaut38),sa
valeurpeuttrecompriseentre84et127.Unevaleurngativesignifieque
lenombreestarrondigauchedelavirgule.
CHAR(longueur)
Cetypededonnespermetdestockerdeschanesdecaractresdelongueur
fixe.Longueurdoittreinfrieur255,savaleurpardfautest1.
VARCHAR(longueur)
Cetypededonnespermetdestockerdeschanesdecaractresdelongueur
variable.Longueurdoittreinfrieur2000,iln'yapasdevaleurpar
dfaut.
DATE
Cetypededonnespermetdestockerdesdonnesconstituesd'unedateet
d'uneheure.
RAW(longueur)
Cetypededonnespermetdestockerdescaractresnonimprimables.
LONG
Cetypededonnespermetdesstockerdeschanesdecaractresdelongueur
variableetinfrieure2^311.Lescolonnesdecetypesontsoumises
certainesrestrictions
unetablenepeutpascontenirplusd'unecolonnedecetype
lescolonnesdecetypenepeuventpasapparatredansdes
contraintesd'intgrit
lescolonnesdecetypenepeuventpastreindexes
lescolonnesdecetypenepeuventpasapparatredansdesclauses
:WHERE,GROUPBY,ORDERBYouCONNECTBYainsiquedansunDISTINCT.
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
33/44
20/2/2015
CoursdeSQL/Oracle
Contraintesd'intgrit
Alacrationd'unetable,lescontraintesd'intgritsedclarentdelafaon
suivante:
CREATETABLEnom_table(
nom_col_1type_1,
nom_col_2type_2,
...
nom_col_ntype_n
CONSTRAINT[nom_contrainte_1]contrainte_1,
CONSTRAINT[nom_contrainte_2]contrainte_2,
...
CONSTRAINT[nom_contrainte_m]contrainte_m
);
Oubiendelafaonsuivante:
CREATETABLEnom_table(
nom_col_1type_1CONSTRAINT[nom_contrainte_1_1]contrainte_1_1
CONSTRAINT[nom_contrainte_1_2]contrainte_1_2
...
CONSTRAINT[nom_contrainte_1_m]contrainte_1_m,
nom_col_2type_2CONSTRAINT[nom_contrainte_2_1]contrainte_2_1
CONSTRAINT[nom_contrainte_2_2]contrainte_2_2
...
CONSTRAINT[nom_contrainte_2_p]contrainte_2_p,
...
nom_col_ntype_nCONSTRAINT[nom_contrainte_n_1]contrainte_n_1
CONSTRAINT[nom_contrainte_n_2]contrainte_n_2
...
CONSTRAINT[nom_contrainte_n_q]contrainte_n_q
);
Lescontraintesdiffrentesquel'onpeutdclarersontlessuivantes:
NOTNULL
LacolonnenepeutpascontenirdevaleursNULL.
UNIQUE
ChaquelignedelatabledoitavoirunevaleurdiffrenteouNULLpourcette
(ouces)colonne.
PRIMARYKEY
Chaquelignedelatabledoitavoirunevaleurdiffrentepourcette(ouces)
colonne.lesvaleursNULLsontrejetes.
FOREIGNKEY
Cettecolonnefaitrfrenceunecolonnecld'uneautretable.
CHECK
Permetdespcifierlesvaleursacceptablespourunecolonne.
Modifierunetable
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
34/44
20/2/2015
CoursdeSQL/Oracle
Onpeutmodifierdynamiquementladfinitiond'unetablegrcealacommandeALTER
TABLE.
Deuxtypesdemodificationssontpossibles:ajoutd'unecolonneetmodification
d'unecolonneexistante.
Iln'estpaspossibledesupprimerunecolonne.Parcontreunecolonnequin'est
plusutilisepeuttremiselavaleurNULL,auquelcasellen'occupeplus
d'espacedisque.Siondsirevraimentsupprimerunecolonne,ilfaut:
secrerunenouvelletablesanslacolonneenquestion
dtruirel'anciennetable,
donnerlanouvelletablelenomdel'ancienne.
Ajouterunecolonne
Lacommandesuivantepermetd'ajouteruneouplusieurscolonnesunetable
existante:
ALTERTABLEnom_tableADD
(nom_col1TYPE1,
nom_col2TYPE2,
...)
LestypespossiblessontlesmmesqueceuxdcritsaveclacommandeCREATETABLE.
Silatablecontientdjdeslignes,lanouvellecolonneauradesvaleursNULL
pourleslignesexistantes.
Modifierunecolonne
Ilestpossibledemodifierladfinitiond'unecolonne,conditionquela
nouvelledfinitionsoitcompatibleaveclecontenudelacolonneetenrespectant
lescontraintessuivantes:
danstouslescasilestpossibled'augmenterlatailled'unecolonne
ilestpossibledediminuerlataille,oummedechangerletyped'une
colonnevide
onpeutspcifierNOTNULLsilacolonnenecontientaucunevaleurNULL
onpeutdanstouslescasspcifierNULLpourautoriserlesvaleursNULL.
Supprimerunetable
LacommandeDROPTABLEpermetdesupprimerunetable,sasyntaxeestlasuivante:
DROPTABLEnom_table;
Latablenom_tableestalorssupprime.Ladfinitiondelatableainsiqueson
contenusontdtruits,etl'espaceoccupparlatableestlibr.
Renommerunetable
Onalapossibilitdechangerlenomd'unetableparlacommandeRENAME,la
syntaxeestlasuivante:
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
35/44
20/2/2015
CoursdeSQL/Oracle
RENAMEancien_nomTOnouveau_nom;
Les vues
Lesvuespermettentd'assurerl'objectifd'indpendancelogique.Grceelles,
chaqueutilisateurpourraavoirsavisionpropredesdonnes.
Onavuquelersultatd'unSELECTestluimmeunetable.
Unetelletable,quin'existepasdanslabasemaisestcredynamiquementlors
del'excutionduSELECT,peuttrevuecommeunetablerelleparles
utilisateurs.Pourcela,ilsuffitdecataloguerleSELECTentantquevue.
Lesutilisateurspourrontconsulterlabase,oumodifierlabase(aveccertaines
restrictions)traverslavue,c'estdiremanipulerlatablersultatdu
SELECTcommesic'taitunetablerelle.
Crerunevue
LacommandeCREATEVIEWpermetdecrerunevueenspcifiantleSELECT
constituantladfinitiondelavue:
CREATEVIEWnom_vue[(nom_col1,...)]
ASSELECT...
WITHCHECKOPTION;
Laspcificationdesnomsdecolonnesdelavueestfacultative.Pardfaut,les
nomsdescolonnesdelavuesontlesmmesquelesnomsdescolonnesrsultatdu
SELECT(sicertainescolonnesrsultatduSELECTsontdesexpressions,ilfaut
renommercescolonnesdansleSELECT,ouspcifierlesnomsdecolonnedela
vue).
Unefoiscre,unevues'utilisecommeunetable.Iln'yapasdeduplicationdes
informationsmaisstockagedeladfinitiondelavue.
Exemple:Crationd'unevueconstituantunerestrictiondelatableempaux
employsdudpartement10.
CREATEVIEWemp10AS
SELECT*
FROMemp
WHEREn_dept=10
LeCHECKOPTIONpermetdevrifierquelamisejouroul'insertionfaite
traverslavueneproduisentquedeslignesquifontpartiedelaslectiondela
vue.
Ainsidonc,silavueemp10atcreavecCHECKOPTIONonnepourratravers
cettevuenimodifier,niinsrerdesemploysnefaisantpaspartiedu
dpartement10.
Ilestpossibled'effectuerdesINSERTetdesUPDATEtraversdesvues,sousdeux
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
36/44
20/2/2015
CoursdeSQL/Oracle
conditions:
leSELECTdfinissantlavuenedoitpascomporterdejointure,
lescolonnesrsultatduSELECTdoiventtredescolonnesrellesetnon
pasdesexpressions.
Exemple:Modificationdessalairesdudpartement10traverslavueemp10.
UPDATEemp10
SETsal=sal*1.1
Toutesleslignesdelatableemp,tellesquelecontenudelacolonnen_deptest
gal10serontmodifies.
Supprimerunevue
Unevuepeuttredtruiteparlacommande:
DROPVIEWnom_vue;
Renommerunevue
Onpeutrenommerunevueparlacommande:
RENAMEancien_nomTOnouveau_nom;
Les index
IntroductionGnralits
Selonlemodlerelationnellesslectionspeuventtrefaitesenutilisantle
contenuden'importequellecolonneetleslignessontstockesdansn'importe
quelordre.
ConsidronsleSELECTsuivant:
SELECT*
FROMemp
WHEREnom='MARTIN'
Unmoyenderetrouverlaouleslignespourlesquelles,fontcolor=red>nomest
galMARTINestdebalayertoutelatable.
Untelmoyend'accsconduitdestempsderponseprohibitifspourdestables
dpassantquelquescentainesdelignes.
Unesolutionoffertepartouslessystmesdegestiondebasesdedonnesestla
crationd'index,quipermettradesatisfaireauxrequteslesplusfrquentes
avecdestempsderponseacceptables.
Unindexseramatrialisparlacrationdeblocsdisquecontenantdescouples
(valeursd'index,numrodebloc)donnantlenumrodeblocdisquedanslequelse
trouventleslignescorrespondantchaquevaleurd'index.
Structured'unindex
Lesindexsontdesstructurespermettantderetrouverunelignedansunetable
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
37/44
20/2/2015
CoursdeSQL/Oracle
partirdelavaleurd'unecolonneoud'unensembledecolonnes.Unindexcontient
lalistetriedesvaleursdescolonnesindexesaveclesadressesdeslignes
(numrodeblocdanslapartitionetnumrodelignedanslebloc)
correspondantes.
Touslesindexoraclesontstockssousformed'arbresquilibrs(btree):une
structurearborescentepermetderetrouverrapidementdansl'indexlavaleurde
clcherche,etdoncl'adressedelalignecorrespondantedanslatable.
Dansuntelarbre,touteslesfeuillessontlammeprofondeur,etdoncla
rechercheprendapproximativementlemmetempsquellequesoitlavaleurdela
cl.
Lorsqu'unblocd'indexestplein,ilestclatendeuxblocs.enconsquence,
touslesblocsd'indexontuntauxderemplissagevariantde50%100%.Sans
indexonbalaiesquentiellementtoutelatablequellequesoitlapositionde
lmentrecherch.
Utilisationdesindex
L'adjonctiond'unindexunetableralentitlesmisesjour(insertion,
suppression,modificationdelacl)maisacclrebeaucouplarecherched'une
lignedanslatable.
L'indexacclrelarecherched'unelignepartird'unevaleurdonnedecl,
maisaussilarecherchedeslignesayantunevaleurd'indexsuprieureou
infrieureunevaleurdonne,carlesvaleursdeclssonttriesdansl'index.
Exemple:Lesrequtessuivantesbnficierontd'unindexsurlechampn_dept.
SELECT*FROMempWHEREnum=16034
SELECT*FROMempWHEREnum>=27234
SELECT*FROMempWHEREnumBETWEEN16034AND27234
Unindexestutilisablemmesilecritrederechercheestconstituseulementdu
dbutdelacl.
Exemple:Larequtesuivantebnficierad'unindexsurlacolonnenom.
SELECT*
FROMemp
WHEREnomLIKE'M%'
Parcontresiledbutdelacln'estpasconnu,l'indexestinutilisable.
Exemple:Larequtesuivantenebnficierapasd'unindexsurlechampnom.
SELECT*
FROMemp
WHEREenameLIKE'?????????'
ValeursNULL
Ellesnesontpasreprsentesdansl'index,ceciafindeminimiserlevolume
ncessairepourstockerl'index.Encontrepartie,l'indexneserad'aucuneutilit
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
38/44
20/2/2015
CoursdeSQL/Oracle
pourretrouverlesvaleursNULLlorsquelecritrederechercheestdutypeIS
NULL.
Conversions
L'indexn'estutilisablequesilecritredeslectionestlecontenudela
colonneindexe,sansaucunetransformation.Parexempleunindexsursalairene
serapasutilispourlarequtesuivante:
SELECT*FROMemp
WHEREsalaire*12>300000
Attentionenparticulierauxconversionsdetypequipeuventempcher
l'utilisationdel'index.
SQLestunlangagetyp,chaquetypededonnes(numrique,caractre,date)ayant
sespropresoprateurs,sespropresfonctionsetsaproprerelationd'ordre.En
consquence,sidansuneexpression,figurentlafoisunnombreetunechanede
caractres,SQLconvertiralachanedecaractresennombre.Demmesidansune
expression,figurentlafoisunechanedecaractresetunedate,SQL
convertiralachanedecaractresendate.
Or,dansunprdicatdutype:
WHEREfonction(col_indexe)=constante
SQLnepeutpasutiliserl'index.
Cecipeutseproduire,defaoninsidieuse,lorsqueSQLestobligd'ajouterun
appelunefonctiondeconversioncaused'unediscordancedetype.
Exemple:Leprdicatsuivantnebnficierapasd'unindexsurlechampembauche.
SELECT*FROMemp
WHEREembaucheLIKE'????'
Eneffet,SQLestobligd'effectueruneconversion,etleprdicatquisera
valuest:
WHERETO_CHAR(embauche)LIKE'????'
Lecritrederechercheestunefonctiondeembauche,etnonlechampembauchelui
mme,danscecasl'indexestinutilisable.
Choixdesindex
Indexerenpriorit:
1. lesclsprimaires
2. lescolonnesservantdecritredejointure
3. lescolonnesservantsouventdecritrederecherche
Nepasindexer:
1. lescolonnescontenantpeudevaleursdistinctes(indexalorspeuefficace)
2. lescolonnesfrquemmentmodifies
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
39/44
20/2/2015
CoursdeSQL/Oracle
Crerunindex
Unindexpeuttrecrparlacommandesuivante:
CREATE[UNIQUE]INDEXnom_index
ONnom_table(nom_col1,nom_col2,...)
[PCTFREEnombre]
[COMPRESS|NOCOMPRESS]
[ROWS=nombre_lignes];
danslaquelle:
L'optionUNIQUEindiquequel'oninterditquedeuxlignesaientlamme
valeurdanslacolonneindexe.
PCTFREEprciselepourcentagedeplacelaisselibredanslesblocsd'index
lacrationdel'index.Cetteplacelibreviteraunerorganisationde
l'indexdeslespremiresinsertionsdenouvellescls.Lavaleurpardfaut
est20%.
NOCOMPRESSindiquequel'onneveutpascomprimerlescls.
nombre_lignesestuneestimationdunombredelignes,permettantd'optimiser
l'algorithmedeclassement..
Unindexpeuttrecrdynamiquementsurunetablecontenantdjdeslignes.Il
seraensuitetenujourautomatiquementlorsdesmodificationsdelatable.
Unindexpeutportersurplusieurscolonnes,lacld'accsseraalorsla
concatnationdesdiffrentescolonnes.
Onpeutcrerplusieursindexindpendantssurunemmetable.
LesrequtesSQLsonttransparentesaufaitqu'ilexisteunindexounon.C'est
l'optimiseurdusystmedegestiondebasesdedonnesqui,aumomentde
l'excutiondechaquerequte,recherches'ilpeuts'aiderounond'unindex.
Indexcomprimetnoncomprim
Lesclsdanslesindexpeuventtrecomprimesounon.Lacompressionestune
techniquepermettantderduiredansdesproportionstrsimportantes(d'autant
plusquelaclestlongue)levolumedel'index.
Encontrepartie,ilfautparfoisuntraitementsupplmentairepourrecomposerla
cllorsdesmisesjourdel'index.
Pardfaut,lesindexsontcomprims,lesavantagesderductiondetaille
l'emportantsurlesinconvnientsdanslaplupartdescas.
sqlsaitexcutercertainesrequtesdirectementauniveaudel'indexsanspasser
parlesegmentdedonnes,sil'indexestnoncomprimetsitousleschamps
rsultatsdelarequtesontdansl'index.
Exemple:L'indexcrepar:
CREATEINDEXx
ONemp(num,nom)
nocompress
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
40/44
20/2/2015
CoursdeSQL/Oracle
permettraderpondrelaquestion:
SELECTnom
FROMemp
WHEREnum<17217
sanslirelatablepuisquetouteslesinformationssetrouventdansl'indexetque
l'indexestnonconcatn.
Indexconcatn
Unindexconcatnestunindexportantsurplusieurscolonnes.
Exemple:
CREATEINDEXxemp
ON(n_dept,num)
Lesindexconcatnspeuventtreutilisspourmatrialiseruneclcomposede
plusieurscolonnes.
SQLsaitutiliserunindexconcatnmmesilecritrederechercheneportepas
surtouteslescolonnesprsentesdansl'index.
Exemple:L'indexcidessusestutilisablesil'onneconnaitquelenumrode
dpartement.
SELECTnom
FROMemp
WHEREn_dept=20
Supprimerunindex
Unindexpeuttresupprimdynamiquementparlacommande:
DROPINDEXnom_index;
L'espacelibrresteattachausegmentd'indexdelatable:ilpourratre
utilispourunautreindexsurlammetable.
L'espaceneserarendulapartitionquelorsdelasuppressiondelatable.
Les clusters
IntroductionGnralits
Dfinition
Leclusterestuneorganisationphysiquedesdonnesquiconsisteregrouper
physiquement(dansunmmeblocdisque)leslignesd'uneouplusieurstablesayant
unecaractristiquecommune(unemmevaleurdansuneouplusieurscolonnes)
constituantlaclducluster.
Lamiseenclusteratroisobjectifs:
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
41/44
20/2/2015
CoursdeSQL/Oracle
acclrerlajointureselonlacldeclusterdestablesmisesencluster,
acclrerlaslectiondeslignesd'unetableayantmmevaleurdecl,par
lefaitqueceslignessontregroupesphysiquement,
conomiserdelaplace,dufaitquechaquevaleurdelaclduclusterne
serastockequ'uneseulefois.
Leregroupementenclusteresttotalementtransparentl'utilisateur:destables
misesenclustersonttoujoursvuescommedestablesindpendantes.
Parexempleonpourraitmettreenclusterlestablesempetdeptselonn_dept.Ces
tablesseraientrorganisesdelafaonsuivante:unblocdeclusterseraitcr
pourchaquenumrodedpartement,cebloccontenantlafoisleslignesdela
tableempetdelatabledeptcorrespondantcenumrodedpartement.La
jointureentrelestablesempetdeptselonn_deptdeviendraitalorsbeaucoupplus
rapide,puisqu'elleseraitdjralisedansl'organisationphysiquedestables.
Pourquel'onpuissemettreunetableenclusterilfautquel'uneaumoinsdes
colonnesfaisantpartieduclustersoitdfiniecommeobligatoire(NOTNULL).
Onpeutindexerlescolonnesd'unetableencluster,ycomprislescolonnes
correspondantlaclouunepartiedelaclducluster.Laclellemmeest
automatiquementindexe,onpeutventuellementlarindexerpourcrerunindex
uniqueservantcontrlersonunicit.
Creruncluster
Avantdepouvoirmettreenclusteruneouplusieurstablesilfautcrerle
clusteraumoyendelacommandeCREATECLUSTERdontlasyntaxeestlasuivante:
CREATECLUSTERnom_cluster
(cle1type1,
cle2type2,
...)
ol'ondonneunnomaucluster,etol'ondfinitlenometletypedescolonnes
constituantlaclducluster.
CREATECLUSTERnom_cluster
(cle1type1,
cle2type2,
...)
[SIZEtaille_du_bloc]
[COMPRESS|NOCOMPRESS]
[SPACEnom_de_space_definition]
danslaquelle:
SIZE
estlatailled'unblocdecluster.Cettetaillepeutvarierde1/6debloc
oracle1blocoracle(2koctetssurvax/vms),ceparamtredoittrechoisi
defaonavoirunbonremplissagedesblocs.
COMPRESS|NOCOMPRESS
estrelatifl'indexquiseracresurlaclducluster
SPACE
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
42/44
20/2/2015
CoursdeSQL/Oracle
spcifieleSPACEDEFINITIONquidfiniralesparamtresd'allocationd'espace
pourlecluster.
CREATECLUSTERDEM
(DEPNONUMBER)
SIZE512
;
Miseenclusterd'unetable
Enprincipec'estdssacrationqu'ilfautspcifiersiunetableseraimplante
dansuncluster.
Lorsdelacrationdelatable
L'optionclusterdel'ordreCREATETABLEpermetdespcifierquelatabledoittre
miseencluster.Leclusterdoitdjexister.
CREATETABLEnom_table
(nom_col1TYPE1NOTNULL,
(nom_col2TYPE2NOTNULL,
...)
CLUSTERNOM_CLUSTER(nom_coli,nom_colj...)
nom_coli,nom_coljsontdesnomsdecolonnesdelatable,ellesserontidentifies
uneuneauxcolonnesclsduclusterspcifieslacrationducluster.
Tabledjexistante
Enprincipecelan'estpaspossible,ilfautdoncprocderdelafaonsuivante:
crerunenouvelletableavecl'optionclusteretycopierlecontenudela
tableinitiale
supprimerl'anciennetable
renommerventuellementlanouvelletable.
Retraitd'unetabled'uncluster
Pourretirerunetabled'unclusterilfaut:
crerunenouvelletableendehorsduclusteretcopierlatableencluster
danslanouvelletable
dtruirel'anciennetable
lanouvelletablepourraalorstrerenommepourprendrelenomde
l'ancienne.
cecinedtruitpaslatable,maislareconstruitendehorsducluster.
Supprimeruncluster
Unclusternecontenantaucunetablepeuttresupprimparlacommande:
DROPCLUSTERnom_cluster;
Remarque:Lesperformancesduclusternesontvalablesquesionn'apasdeblocs
chans(exdegrandetable).
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
43/44
20/2/2015
CoursdeSQL/Oracle
1999/05ThC
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM
44/44