Vous êtes sur la page 1sur 44

20/2/2015

CoursdeSQL/Oracle

Structured
Query
Language
Par Th. COSNUAU

Introduction

Un modle de donnes est un ensemble de concepts et de rgles de composition de


cesconceptspermettantdedcriredesdonnes.
Ilexisteprincipalementtroistypesdemodles:
Lemodlehirarchique
Lemodlerseau
Lemodlerelationnel

LemodlerelationnelatinitiparCODDIBMen1970maisfutsurtoututilis
partirdesannes1980.

Le langage de manipulation de donnes relationnelles se compose d'un ensemble de


commandespermettantd'interrogeretdemodifierunebasededonnes.
Ce " langage de requte structur " (SQL = Structured Query Language) est une
volution(1981)dulangageSEQUELd'IBM.
Ilpermetnotammentd'exprimerdefaonsimple,desslections,desprojectionset
desjointures.
Ondistinguetroissousensembles:
Lelangagededescriptiondesdonnes(LDD)
Lelangagedemanipulationdesdonnes(LMD)
Lalangagedespcificationdescontraintesd'intgrit(LSCI)
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM

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

Les oprateurs ensemblistes


Lesoprateursensemblistespermettentde"joindre"destablesverticalement
c'estdiredecombinerdansunrsultatuniquedeslignesprovenantdedeux
interrogations.Leslignespeuventvenirdetablesdiffrentesmaisaprs
projectionondoitobtenirdestablesayantmmeschmaderelation.
Lesoprateursensemblistessontlessuivants:
l'union:UNION
l'intersection:INTERSECT
ladiffrencerelationnelle:MINUS
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM

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

Les sous-interrogations (Imbrications & Corrlations)


UnecaractristiquepuissantedeSQLestlapossibilitqu'uncritrederecherche
employdansuneclauseWHERE(expressiondroited'unoprateurdecomparaison)
soitluimmelersultatd'unSELECTc'estcequ'onappelleunesous
interrogation.

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

Expressions et Fonctions simples


Uneexpressionestunensembledevariables(contenud'unecolonne),deconstantes
etdefonctionscombinesaumoyend'oprateurs.Lesfonctionsprennentunevaleur
dpendantdeleursargumentsquipeuventtreeuxmmesdesexpressions.
Lesexpressionspeuventfigurer:
entantquecolonnersultatd'unSELECT,
dansuneclauseWHERE,
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM

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

Les fonctions de groupe


Danslesexemplesprcdents,chaquelignersultatd'unSELECTtaitle
rsultatdecalculssurlesvaleursd'uneseulelignedelatableconsulte.Il
existeunautretypedeSELECTquipermetd'effectuerdescalculssurl'ensemble
desvaleursd'unecolonne.Cescalculssurl'ensembledesvaleursd'unecolonnese
fontaumoyendel'unedesfonctionssuivantes:
AVG([DISTINCT|ALL]expression)
Renvoielamoyennedesvaleursd'expression.
COUNT(*|[DISTINCT|ALL]expression)
Renvoielenombredelignesdursultatdelarequte.Siexpressionest
prsent,onnecomptequeleslignespourlesquellescetteexpressionn'est
pasNULL.
MAX([DISTINCT|ALL]expression)
Renvoielapluspetitedesvaleursd'expression.
MIN([DISTINCT|ALL]expression)
Renvoielaplusgrandedesvaleursd'expression.
STDDEV([DISTINCT|ALL]expression)
Renvoiel'carttypedesvaleursd'expression.
SUM([DISTINCT|ALL]expression)
Renvoielasommedesvaleurs
VARIANCE([DISTINCT|ALL]expression)
Renvoielavariancedesvaleursd'expression.
DISTINCT
Indiquelafonctiondegroupedeneprendreencomptequedesvaleurs
distinctes.
ALL
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM

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

Modification une base


http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM

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