Date post: | 04-Oct-2015 |
Category: |
Documents |
Upload: | moisendiaye245 |
View: | 214 times |
Download: | 0 times |
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 1/44
StructuredQueryLanguage
Par Th. COSNUAU
Introduction
Unmodlededonnesestunensembledeconceptsetderglesdecompositiondecesconceptspermettantdedcriredesdonnes.
Ilexisteprincipalementtroistypesdemodles:
Lemodlehirarchique
Lemodlerseau
Lemodlerelationnel
LemodlerelationnelatinitiparCODDIBMen1970maisfutsurtoututilispartirdesannes1980.
Lelangagedemanipulationdedonnesrelationnellessecomposed'unensembledecommandespermettantd'interrogeretdemodifierunebasededonnes.
Ce " langage de requte structur " (SQL = Structured Query Language) est unevolution(1981)dulangageSEQUELd'IBM.
Ilpermetnotammentd'exprimerdefaonsimple,desslections,desprojectionsetdesjointures.
Ondistinguetroissousensembles:
Lelangagededescriptiondesdonnes(LDD)
Lelangagedemanipulationdesdonnes(LMD)
Lalangagedespcificationdescontraintesd'intgrit(LSCI)
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 2/44
LeSQLestunlangagedclaratifdontlasyntaxeesttrssimple(commebeaucoupdelangagesdecetype)cequipermetdeseconcentrersurleproblmersoudre.
Tablesutilisesdanslesexemples
LesexemplescitsdanscedocumentonttousttestssousORACLE,undessystmesdegestiondebasesdedonnesrelationnelslesplusrpandussurlemarch.
Cesexemplessontbtissurunebasededonnescomposedesdeuxrelationssuivantes:
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 2500 20
LAMBERT 25012 administratif 27047 14APR91 12000 20
JOUBERT 25717 prsident 10OCT82 50000 30
LEBRETON 16034 commercial 27047 01JUN91 15000 0 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
DEPT(N_DEPT,NOM,LIEU)
N_DEPT NOM LIEU
10 recherche Rennes
20 vente Metz
30 direction Gif
40 fabrication Toulon
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 3/44
La clause SELECT
LacommandeSELECTconstitue,elleseule,lelangagepermettantd'interrogerunebasededonnes.Ellepermet:
deslectionnercertainescolonnesd'unetable:c'estl'oprationdeprojectiondeslectionnercertaineslignesd'unetableenfonctiondeleurcontenu:c'estl'oprationderestrictiondecombinerdesinformationsvenantdeplusieurstables:cesontlesoprationsdejointure,union,intersection,diffrencerelationnelledecombinerentreellescesdiffrentesoprations.
Uneinterrogation,onparlepluttderequte,estunecombinaisond'oprationsportantsurdestables(relations)etdontlersultatestluimmeunetabledontl'existenceestphmre(letempsdelarequte).
Note:
Onpeutintroduireuncommentairel'intrieurd'unecommandeSQLenl'encadrantpar/**/.
Slectiondecolonnesouprojection
LacommandeSELECTlaplussimplealasyntaxesuivante:
SELECT*FROMnom_table;
danslaquelle:
nom_table:estlenomdelatablesurlaquelleportelaslection.
*:signifiequetouteslescolonnesdelatablesontslectionnes.
Pardfauttoutesleslignessontslectionnes.Onpeutlimiterlaslectioncertainescolonnes,enindiquantunelistedenomsdecolonneslaplacedel'astrisque.
SELECTnom_col1,nom_col2,...FROMnom_table;
Exemple:Donnerlenometlafonctiondechaqueemploy.
SELECTnom,fonctionFROMemp
LaclauseDISTINCTajoutederrirelacommandeSELECTpermetd'liminerlesduplications.
Exemple:Quellessonttouteslesfonctionsdiffrentes.
SELECTDISTINCTfonctionFROMemp
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 4/44
Slectiondelignesourestriction
LaclauseWHEREpermetdespcifierquellessontleslignesslectionner.Elleestsuivied'unprdicatquiseravalupourchaquelignedelatable.Leslignespourlesquellesleprdicatestvraiserontslectionnes.
Lasyntaxeestlasuivante:
SELECT*FROMnom_tableWHEREpredicat;
Unprdicatn'estniplusnimoinsquelafaondontonexprimeuneproprit.Lesprdicats,qu'ilssoientsimplesoucomposs,sontconstituspartird'expressionsquel'oncompareentreelles.
Expressionsimple
Uneexpressionsimplepeuttre:
unevariabledsigneparunnomdecolonne,uneconstante.
Lesexpressionspeuventtredetroistypes:numrique,chanedecaractresoudate.Achacundecestypescorrespondunformatdeconstante:
Constantenumrique
nombrecontenantventuellementunsigne,unpointdcimaletunepuissancededix.Ex:10,2.5,1.2E10
Constantechanedecaractres
unechanedecaractresentreapostrophes.Ex:'MARTIN'(Attention,unelettreenmajusculesn'estpasconsidrecommegalelammelettreenminuscule).
Constantedate
Unechanedecaractresentreapostrophesauformatsuivant:jourmoisanneolejourestsurdeuxchiffres,lemoisestdsignparlestroispremireslettresdesonnomenanglais,l'anneestsurdeuxchiffres.Ex:'01FEB85'
Onpeut,enSQL,exprimerdesexpressionspluscomplexesenutilisantdesoprateursetdesfonctionstudisdanslechapitreExpressionsetfonctions.
Prdicatsimple
Unprdicatsimpleestlersultatdelacomparaisondedeuxexpressionsaumoyend'unoprateurdecomparaisonquipeuttre:
=gal!=diffrent
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 5/44
>=suprieurougal
Lestroistypesd'expressionspeuventtrecomparsaumoyendecesoprateurs:
Pourlestypesdate,larelationd'ordreestl'ordrechronologique.Pourlestypescaractre,larelationd'ordreestl'ordrealphabtique.
Ilfautajoutercesoprateursarithmtiquesclassiqueslesoprateurssuivants:
expr1BETWEENexpr2ANDexpr3vraisiexpr1estcomprisentreexpr2etexpr3,bornesincluses
expr1IN(expr2,expr3,...)vraisiexpr1estgalel'unedesexpressionsdelalisteentreparenthses
exprLIKEchaineochaineestunechanedecaractrespouvantcontenirl'undescaractresjokers:
_remplaceexactement1caractre%remplaceunechanedecaractresdelongueurquelconque,ycomprisdelongueurnulle.
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)peuventtreutilisspourcombinerentreeuxplusieursprdicats.L'oprateurNOTplacdevantunprdicateninverselesens.
L'oprateurANDestprioritaireparrapportl'oprateurOR.Desparenthsespeuventtreutilisespourimposeruneprioritdansl'valuationduprdicat,ousimplementpourrendreplusclairel'expressionlogique.
Exemple:Quelssontlesemploysdudpartement30ayantunsalairesuprieur25000?
SELECTnomFROMempWHEREn_dept=30ANDsalaire>25000
Exemple:Quelssontlesemploysdirecteurs,oucommerciauxettravaillantdansledpartement10?
SELECTnom,fonction,salaire,n_deptFROMempWHEREfonction=
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 6/44
'directeur'
OR(fonction='commercial'ANDn_dept=10)
Larequteprcdentedonneraitlemmersultatsanslesparenthses,rsultat
diffrentdeceluiduSELECTsuivant.
Exemple:Quelssontlesemploysdirecteursoucommerciaux,ettravaillantdansledpartement10?
SELECTnum,nom,fonction,n_deptFROMempWHERE(fonction='directeur'ORfonction='commercial')ANDn_dept=10
ValeursNULL
PourSQL,unevaleurNULLestunevaleurnondfinie.Ilestpossibled'ajouteruneligneunetablesansspcifierdevaleurpourlescolonnesnonobligatoires:cescolonnesabsentesaurontlavaleurNULL.
ParexemplelesemploysdontlarmunrationneprendpasencomptedecommissionaurontunevaleurNULL,c'estdireindfinie,commecommission.
L'oprateurISNULLpermetdetesterlavaleurNULL:leprdicatexprISNULLestvraisil'expressionalavaleurNULL(c'estdiresielleestindfinie).
Exemple:QuelssontlesemploysdontlacommissionalavaleurNULL?
SELECTnomFROMempWHEREcommISNULL
L'oprateurISNOTNULLpermetdeconstruireunprdicatvraisilavaleurn'estpasNULL(etdoncleprdicatexprISNOTNULLestvraisiexprestdfinie)
Remarques
LavaleurNULLestdiffrentedelavaleurzroqui,elle,quiestunevaleur
biendfinie.
Leprdicatexpr=NULLesttoujoursfaux,etnepermetdoncpasdetestersi
l'expressionalavaleurNULL.
UneexpressiondelaformeNULL+valdonneNULLcommersultatquelleque
puissetrelavaleurdeval.
Nomdecolonne
Lescolonnesconstituantlersultatd'unSELECTpeuventtrerenommesdansleSELECT,ceciestutileenparticulierlorsquelacolonnersultatestuneexpression.Pourcela,ilsuffitdefairesuivrel'expressiondfinissantlacolonned'unnom,selonlesrglessuivantes:
lenom(30caractresmaximum)estinsrderrirel'expressiondfinissant
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 7/44
lacolonne,spardecettedernireparunespace.
silenomcontientdessparateurs(espace,caractrespcial),ous'ilest
identiqueunmotcldeSQL(ex:DATE),ildoittremisentreguillemets
"".
Cenomestceluisouslequellacolonneseraconnuedesinterfacesexternes.SousSQLPLUS,parexemple,ilconstitueraletitrepardfautdelacolonne,etserviraderfrencepourdfinirunformatpourlacolonne.
Exemple:Salairedechaqueemploy.
SELECTnom,salaire"SALAIREMENSUEL"FROMemp
Remarque:Attention,cenomn'estpasconnul'intrieurduSELECT.
Classerlersultatd'uneinterrogation
Leslignesconstituantlersultatd'unSELECTsontobtenuesdansunordreindtermin.Onpeut,dansunSELECT,demanderquelersultatsoitclassdansunordreascendantoudescendant,enfonctionducontenud'uneouplusieurscolonnes(jusqu'16critresdeclassementpossibles).LescritresdeclassementsontspcifisdansuneclauseORDERBYdontlasyntaxeestlasuivante:
ORDERBY{nom_col1|num_col1[DESC][,nom_col2|num_col2[DESC],...]}
Leclassementsefaitd'abordselonlapremirecolonnespcifiedansl'ORDERBYpuisleslignesayantlammevaleurdanslapremirecolonnesontclassesselonladeuximecolonnedel'ORDERBY,etc...Pourchaquecolonne,leclassementpeuttreascendant(pardfaut)oudescendant(DESC).L'ORDERBYpeutfairerfrenceunecolonneparsonnomouparsapositiondans
lalistedescolonnesprsentesderrireleSELECT(lapremirecolonneslectionnealenumro1,ladeuximealenumro2,...).
Exemple:Donnertouslesemploysclasssparfonction,etpourchaquefonctionclasssparsalairedcroissant
SELECTnom,fonction,salaireFROMempORDERBYfonction,salaireDESC
Remarque:DansunclassementlesvaleursNULLsonttoujoursenttequelquesoitl'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]]...
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 8/44
[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'estlavaleurpardfaut.
*
renvoietouteslescolonnesdetouteslestables,lesvuesetlesclichsprcissdansleFROM.
table.*,view.*,snapshot.*
slectionnetouteslescolonnesdelatable,delavueouduclichprcis.
expr
slectionneuneexpressionhabituellementcalculesurlesvaleursdescolonnesappartenantl'unedestables,vues,ouclichsdelaclauseFROM.
c_alias
lachanedecaractresquisertd'enttelacolonne(pardfautexpr)
schema
estlenomduschmacontenantlestables,vuesouclichsslectionns.Leschmapardfautestceluidel'utilisateurquiexcutelarequte.
table,view,snapshot
estlenomdelatable,delavueouduclichcontenantlesdonnesslectionnes.
t_alias
synonymepourlatabledontlenomprcde,utiliserdanslerestedelarequte.
WHERE
restreintleslignesslectionnescellespourlesquelleslaconditionestvraie.Sicetteclauseestomise,toutesleslignesdestables,vuesouclichsprcissderrireleFROMsontrenvoyes.
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 9/44
STARTWITH,CONNECTBY
renvoieleslignesenparcourantunearborescence.
GROUPBY
groupeleslignesslectionnesensebasantsurlavaleurdeexprpourchaqueligneetrenvoieuneseulelignepargroupe.
HAVING
restreintlesgroupesdelignesrenvoysceuxpourlesquelslaconditionspcifieestvraie.Sanscetteclause,touslesgroupessontrenvoys.
UNION,UNIONALL,INTERSECT,MINUS
CombineleslignesretournespardeuxSELECTenutilisantuneoprationensembliste.
ORDERBY
ordonneleslignesslectionnes:expr
enutilisantlavaleurdeexpr.CetteexpressionestbasesurdescolonnesprcisesderrireleSELECTousurdescolonnesappartenantdestables,vuesouclichsprsentsderrireleFROM.
positiondonnelenumrodelacolonnedansl'ordreduSELECT.
ASC,DESCmodeascendantoudescendant.LavaleurpardfautASC.
FORUPDATE
"locke"leslignesslectionnes.
NOWAIT
retournelecontrolel'utilisateursilacommandeSELECTessayedebloquerunetableutiliseparunautreutilisateur.
Prrequis
Pourpouvoirslectionnerdeslignesd'unobjet(table,vue,clich)ilfautsoittrepropritairedecetobjet,soitavoirleprivilgeSELECTsurcetobjet.
LeprivilgeSELECTANYTABLEpermetdeslectionnerdeslignesden'importequelobjetappartenantn'importequelutilisateur.
Les jointures
Lajointureestuneoprationpermettantdecombinerdesinformationsvenantde
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 10/44
plusieurstables.Lesexemplessuivantsselimiterontdeuxtables,maisonpeutjoindrejusqu'256tables.UnejointureseformulesimplementenspcifiantplusieurstablesderrireleFROMdelafaonsuivante:
SELECT...FROMnom_table1,nom_table2...WHEREpredicat;
Sionneprcisepasdeconditiondeslection,lersultatobtenuseraleproduitcartsiendestablesprsentesderrireleFROM(rsultatnonsouhaitengnral).
Iln'existepasd'associationsimplicitesouexplicitesentrelestablesdansSQL.Lesassociationsentrelestablessontdfiniesdynamiquementlorsdesinterrogations,cequicontribuelagrandesouplessedulangagesqletrendpossibletouteassociationmmesiellen'apastprvuelorsdeladfinitionetduchargementdelabase.
Equijointure
Lerapprochementdechaquelignedelatableempaveclalignedelatabledeptayantmmenumrodedpartementpermetd'obtenirlalistedesemploysaveclalocalitdanslaquelleilstravaillent.Cerapprochemententredeuxcolonnesappartenantdeuxtablesdiffrentesmaisayantlemmesens(icilenumrodedpartement)etvenantvraisemblablementd'unerelation1nlorsdelaconception(ici1entitdpartementpournentitsemploys)estasseznaturel.C'estpourquoicetypedejointureportelenomdejointurenaturelleoud'quijointure.
Exemple:Donnerpourchaqueemploysonnometsonlieudetravail.
SELECTemp.nom,lieuFROMemp,deptWHEREemp.n_dept=dept.n_dept
Lefaitquelacolonnecontenantlenumrodedpartementaitlemmenomdanslesdeuxtablesarenduncessaireleprfixageparlenomdetabledanslecritredejointure(clauseWHERE).Lenomdecolonnenomaluiaussibesoind'treprfixcarilappartientauxdeuxtables(nomdelapersonnedansl'uneetnomdudpartementdansl'autre).Parcontrelenomdecolonnelieun'apasbesoind'treprfixcariln'yapasd'ambigutsurlatablelaquellecettecolonneappartient.
Jointured'unetableellemme
Ilpeuttreutilederassemblerdesinformationsvenantd'uneligned'unetableavecdesinformationsvenantd'uneautrelignedelammetable.
Exemple:Donnerpourchaqueemploylenomdesonsuprieurhirarchique.
SELECTemp.nom,mgr.nomFROMemp,empmgrWHEREemp.n_sup=mgr.num
Remarque:Danscecas,ilfautimprativementrenommeraumoinsl'unedesdeuxoccurencesdelatable(iciemp)enluidonnantunsynonyme,afindepouvoirprfixersansambiguitchaquenomdecolonne.
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 11/44
Autresjointures
Lecritred'galitestlecritredejointureleplusnaturel.Maisonpeututiliserd'autrestypesdecomparaisonscommecritresdejointures.
Exemple:QuelssontlesemploysgagnantplusqueSIMON?
SELECTemp.nom,emp.salaire,emp.fonctionFROMemp,empjWHEREemp.salaire>j.salaireANDJ.nom='SIMON'
Jointureexterne
Lorsqu'uneligned'unetablefigurantdansunejointuren'apasdecorrespondantdanslesautrestables,ellenesatisfaitpasaucritred'quijointureetdoncnefigurepasdanslersultatdelajointure.Uneoptionpermetdefairefigurerdanslersultatleslignessatisfaisantlaconditiond'quijointurepluscellesn'ayantpasdecorrespondant.Cetteoptions'obtientenaccolant(+)aunomdecolonnedelatabledanslaquellemanquentdeslments,danslaconditiond'quijointure.
Exemple:Ledpartement40nefiguraitpasdanslersultatduSELECTprcdent.Parcontre,ilfigureradanslersultatduSELECTsuivant.
SELECTemp.nom,lieuFROMemp,deptWHEREemp.n_dept(+)=dept.n_dept
Le(+)peuts'interprtercommel'ajoutd'unelignefictivedonttouteslescolonnesontlavaleurNULL,etquiraliselacorrespondanceavecleslignesdel'autretablequin'ontpasdecorrespondantrel.Dansl'exemplecidessus,lavaleurdenomassocieaudpartement40estlavaleurNULL.
Exemple:Retrouverlesdpartementsn'ayantaucunemploy.
SELECTdept.n_dept,emp.nomFROMemp,deptWHEREdept.n_dept=emp.n_dept(+)ANDemp.nomISNULL
Les oprateurs ensemblistes
Lesoprateursensemblistespermettentde"joindre"destablesverticalementc'estdiredecombinerdansunrsultatuniquedeslignesprovenantdedeuxinterrogations.Leslignespeuventvenirdetablesdiffrentesmaisaprsprojectionondoitobtenirdestablesayantmmeschmaderelation.
Lesoprateursensemblistessontlessuivants:
l'union:UNION
l'intersection:INTERSECT
ladiffrencerelationnelle:MINUS
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 12/44
Lasyntaxed'utilisationestlammepourcestroisoprateurs:
SELECT...{UNION|INTERSECT|MINUS}SELECT...
Dansunerequteutilisantdesoprateursensemblistes:
TouslesSELECTdoiventavoirlemmenombredecolonnesslectionnes,etleurtypesdoiventtreununidentiques.Lesconversionsventuelles
doiventtrefaitesl'intrieurduSELECTl'aidedesfonctionsdeconversion.
Lesdoublessontlimins(DISTINCTimplicite).
Lesnomsdecolonnes(titres)sontceuxdupremierSELECT.LalargeurdescolonnesestlaplusgrandeparmitouslesSELECT.Dansunerequteonnepeuttrouverqu'unseulORDERBY.S'ilestprsent,il
doittremisdansledernierSELECTetilnepeutfairerfrencequ'auxnumrosdescolonnesetnonpasleursnoms(carlesnomspeuventtre
diffrentsdanschacunedesinterrogations).
OnpeutcombinerlersultatdeplusdedeuxSELECTaumoyendesoprateursUNION,INTERSECT,MINUS.
SELECT...UNIONSELECT...MINUSSELECT...
Danscecasl'expressionestvaluedegauchedroite,maisonpeutmodifierl'ordred'valuationenutilisantdesparenthses.
SELECT...UNION(SELECT...MINUSSELECT...)
Les sous-interrogations (Imbrications & Corrlations)
UnecaractristiquepuissantedeSQLestlapossibilitqu'uncritrederechercheemploydansuneclauseWHERE(expressiondroited'unoprateurdecomparaison)soitluimmelersultatd'unSELECTc'estcequ'onappelleunesousinterrogation.
Sousinterrogationramenantuneseulevaleur
Exemple:QuelssontlesemploysayantlammefonctionqueCODD?
SELECTnomFROMempWHEREfonction=(SELECTfonctionFROMempWHEREnom='CODD')
Remarques
unesousinterrogationquineramneaucunelignesetermineavecuncoded'erreur.unesousinterrogationramenantplusieurslignesprovoqueraaussi,dansce
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 13/44
cas,uneerreur(pourtraitercorrectementcecas,voirparagraphecidessous)
Sousinterrogationramenantplusieurslignes
Unesousinterrogationpeutramenerplusieurslignesconditionquel'oprateurdecomparaisonadmettesadroiteunensembledevaleurs.Lesoprateurspermettantdecomparerunevaleurunensembledevaleurssont:
l'oprateurIN
lesoprateursobtenusenajoutantANYouALLlasuited'unoprateurde
comparaisonclassique(=,!=,>,>=,ALL(SELECTsalaireFROMempWHEREn_dept=20)
Sousinterrogationramenantplusieurscolonnes
Ilestpossibledecomparerlersultatd'unSELECTramenantplusieurscolonnesunelistedecolonnes.Lalistedecolonnesfigureraentreparenthsesgauchedel'oprateurdecomparaison.
Exemple:QuelssontlesemploysayantmmefonctionetmmesuprieurqueCODD?
SELECTnom,fonction,n_supFROMempWHERE(fonction,n_sup)=(SELECTfonction,n_supFROMempWHEREnom='CODD')
Sousinterrogationsynchroniseavecl'interrogationprincipale
Danslesexemplesprcdents,lasousinterrogationtaitvalued'abord,puislersultatpouvaittreutilispourexcuterl'interrogationprincipale.SQLsaitgalementtraiterunesousinterrogationfaisantrfrenceunecolonnedelatabledel'interrogationprincipale.Letraitementdanscecasestpluscomplexecarilfautvaluerlasousinterrogationpourchaquelignedel'interrogationprincipale.
Exemple:Quelssontlesemploysnetravaillantpasdanslemmedpartementqueleursuprieurhirarchique.
SELECTnomFROMempeWHEREn_dept!=(SELECTn_deptFROMempWHEREe.n_sup=num)ANDn_supISNOTNULL
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 14/44
Ilafalluicirenommerlatableempdel'interrogationprincipalepourpouvoirlarfrencerdanslasousinterrogation.n_supISNOTNULLestncessairecardanslecasdeJOUBERTlacolonnen_supestNULLetlasousrequteneramnealorsaucunevaleur.
Sousinterrogationramenantaumoinsuneligne
L'oprateurEXISTSpermetdeconstruireunprdicatvraisilasousinterrogationquisuitramneaumoinsuneligne.
Exemple:Quelssontlesemploystravaillantdansundpartementquiaprocddesembauchesdepuisledbutdel'anne94.
SELECT*FROMempeWHEREEXISTS(SELECT*FROMempWHEREembauche>='01jan94'ANDn_dept=e.n_dept)
Remarque:Onpeutinverserlesensdel'oprateurEXISTSenlefaisantprcderdeNOT.
Sousinterrogationsmultiples
UnSELECTpeutcomporterplusieurssousinterrogations,soitimbriques,soitaummeniveaudansdiffrentsprdicatscombinspardesANDoudesOR.
Exemple:Listedesemploysdudpartement10ayantmmefonctionquequelqu'undudpartementdeDUPONT.
SELECTnom,fonctionFROMempWHEREn_dept=10ANDfonctionIN(SELECTfonctionFROMempWHEREn_dept=(SELECTn_deptFROMempWHEREnom='DUPONT'))
Expressions et Fonctions simples
Uneexpressionestunensembledevariables(contenud'unecolonne),deconstantesetdefonctionscombinesaumoyend'oprateurs.Lesfonctionsprennentunevaleurdpendantdeleursargumentsquipeuventtreeuxmmesdesexpressions.
Lesexpressionspeuventfigurer:
entantquecolonnersultatd'unSELECT,dansuneclauseWHERE,
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 15/44
dansuneclauseORDERBY.
Ilexistetroistypesd'expressionscorrespondantchacununtypededonnesdeSQL:arithmtique,chanedecaractre,date.Achaquetypecorrespondentdesoprateursetdesfonctionsspcifiques.
SQLautoriselesmlangesdetypesdanslesexpressionseteffectueralesconversionsncessaires:dansuneexpressionmlangeantdatesetchanesdecaractres,leschanesdecaractresserontconvertiesendates,dansuneexpressionmlangeantnombresetchanesdecaractres,leschanesdecaractresserontconvertiesennombre.
Expressionsetfonctionsarithmtiques
Uneexpressionarithmtiquepeutcontenir:
desnomsdecolonnesdesconstantesdesfonctionsarithmtiques
combinsaumoyendesoprateursarithmtiques.
Oprateursarithmtiques
Lesoprateursarithmtiquesprsentsdanssqlsontlessuivants:
+additionou+unairesoustractionouunaire*multiplication/division
Remarque:ladivisionpar0provoqueunefinaveccoded'erreur.
Prioritdesoprateurs
Uneexpressionarithmtiquepeutcomporterplusieursoprateurs.Danscecas,lersultatdel'expressionpeutvarierselonl'ordredanslequelsonteffectueslesoprations.Lesoprateursdemultiplicationetdedivisionsontprioritairesparrapportauxoprateursd'additionetdesoustraction.Desparenthsespeuventtreutilisespourforcerl'valuationdel'expressiondansunordrediffrentdeceluidcoulantdelaprioritdesoprateurs.
Exemple:Donnerpourchaquecommercialsonrevenu(salaire+commission).
SELECTnom,salaire+commFROMempWHEREfonction='commercial'
Exemple:Donnerlalistedescommerciauxclasseparcommissionsursalairedcroissant.
SELECTnom,comm/salaire,comm,salaireFROMempWHEREfonction='commercial'ORDERBYcomm/salaireDESC
Exemple:Donnerlalistedesemploysdontlacommissionestinfrieure5%dusalaire.
SELECTnom,salaire,commFROMempWHEREcomm
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 16/44
Fonctionsarithmtiques
Dansceparagraphe,onttregroupeslesfonctionsayantunouplusieursnombrescommearguments,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)
Renvoielelogarithmenpriendenquidoittreunentierstrictementpositif.
LOG(m,n)
Renvoielelogarithmeenbasemden.mdoittreunentierstrictementsuprieur1,etnunentierstrictementpositif.
MOD(m,n)
Renvoielerestedeladivisionentiredemparn,sinvaut0alorsrenvoiem.Attention,utiliseavecaumoinsundesesargumentsngatifs,cettefonctiondonnedesrsultatsquipeuventtrediffrentsd'unmoduloclassique.Cettefonctionnedonnepastoujoursunrsultatdontlesignedudiviseur.
POWER(m,n)
Renvoiempuissancen,metnpeuventtredesnombresquelconquesentiersourelsmaissimestngatifndoittreunentier.
ROUND(n[,m])
Simestpositif,renvoienarrondi(etnonpastronqu)mchiffresaprslavirgule.Simestngatif,renvoienarrondimchiffresavantla
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 17/44
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.Simestngatif,renvoientronqumchiffresavantlavirgule.mdoittreunentieretilvaut0pardfaut.
Exemple:Donnerpourchaqueemploysonsalairejournalier.
SELECTnom,ROUND(salaire/22,2)FROMemp
Expressionsetfonctionssurleschanesdecaractres
Oprateursurleschanesdecaractres
Ilexisteunseuloprateursurleschanesdecaractres:laconcatnation.Cetoprateursenoteaumoyendedeuxcaractres|(barreverticale)accols.Lersultatd'uneconcatnationestunechanedecaractresobtenueencrivantd'abordlachanegauchede||puiscelledroitede||.
SELECTnom||'/'||fonctionFROMemp
Fonctionssurleschanesdecaractres
Leparagraphesuivantcontientlesfonctionstravaillantsurleschanesdecaractresetrenvoyantdeschanesdecaractres.
CONCAT(chane1,chane2)
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 18/44
Renvoielachaneobtenueenconcatnantchane1chane2.Cettefonctionestquivalentel'oprateurdeconcatnation||.
INITCAP(chane)
Renvoiechaneenayantmislapremirelettredechaquemotenmajusculeettouteslesautresenminuscule.Lessparateursdemotssontlesespacesetlescaractresnonalphanumriques.
LOWER(chane)
Renvoiechaneenayantmistoutesseslettresenminuscules.
LPAD(chane,long,[char])
Renvoielachaneobtenueencompltant,ouentronquant,chanepourqu'elleaitcommelongueurlongenajoutantventuellementgauchelecaractre(oulachanedecaractres)char.Lavaleurpardfautdecharestunespace.
LTRIM(chane[,ens])
Renvoielachaneobtenueenparcourantpartirdelagauchechaneetensupprimanttouslescaractresquisontdansens.Ons'arrtequandontrouveuncaractrequin'estpasdansens.Lavaleurdedefautdeensestunespace.
REPLACE(chaine,avant,aprs
Renvoiechainedanslaquelletouteslesoccurrencesdelachanedecaractresavantonttremplacsparlachanedecaractresaprs.
RPAD(chane,n,[char])
Renvoielachaneobtenueencompltant,ouentronquant,chanepourqu'elleaitcommelongueurlongenajoutantventuellementdroitelecaractre(oulachanedecaractres)char.Lavaleurpardfautdecharestunespace.
RTRIM(chane[,ens])
Renvoielachaneobtenueenparcourantpartirdeladroitechaneetensupprimanttouslescaractresquisontdansens.Ons'arrtequandontrouveuncaractrequin'estpasdansens.Lavaleurdedefautdeensestunespace.
SOUNDEX(chane)
Renvoielachanedecaratresconstituedelareprsentationphontiquedesmotsdechane.
SUBSTR(chane,m[,n])
Renvoielapartiedechanecommenantaucaractremetayantunelongueurden.
TRANSLATE(chane,avant,aprs)
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 19/44
Renvoieunechanedecaractresenremplaantchaquecaractredechaneprsentdansavantparlecaractresitulammepositiondansaprs.Lescaractresdechanenonprsentsdansavantnesontpasmodifis.avantpeutcontenirplusdecaractresqueaprs,danscecaslescaractresdeavantsanscorrespondantsdansaprsserontsupprimsdechane.
UPPER(chane)
Renvoiechaneenayantmistoutesseslettresenmajuscules.
Leparagraphesuivantcontientlesfonctionstravaillantsurleschanesdecaractresetrenvoyantdesentiers.
INSTR(chane,souschane,debut,occ)
Renvoielapositiondupremiercaractredechanecorrespondantl'occurrenceoccdesouschaneencommenantlarecherchelapositiondbut.
LENGTH(chane)
Renvoielalongueurdechane,exprimeennombredecaractres.
Expressionsetfonctionssurlesdates
Oprateurssurlesdates
Aumoyendesoprateursarithmtiques+etilestpossibledeconstruirelesexpressionssuivantes:
date+/nombre:leresultatestunedateobtenueenajoutantlenombrede
joursnombreladatedate.
date2date1:leresultatestlenombredejoursentrelesdeuxdates.
Fonctionssurlesdates
ADD_MONTHS(date,n)
Renvoieladateobtenueenajoutantnmoisdate.npeuttreunentierquelconque.Silemoisobtenuamoinsdejoursquelejourdedate,lejourobtenuestledernierdumois.
LAST_DAY(date)
Renvoieladatedudernierjourdumoisdedate.
MONTHS_BETWEEN(date2,date1)
Renvoielenombredemoisentredate2etdate1,sidate2estaprsdate1lersultatestpositif,sinonlersultatestngatif.Silesjoursdate2etdate1sontlesmmes,ousicesontlesderniersjoursdumois,lersultatestunentier.Lapartiefractionnaireestcalculeenconsidrantchaquejourcomme1/31medemois
NEXT_DAY(date,nom_du_jour)
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 20/44
Renvoieladateduprochainjourdelasemainedontlenomestnom_de_jour.
ROUND(date[,prcision])
Renvoiedatearrondiel'unitspcifiedansprcision.L'unitdeprcisionestindiqueenutilisantundesmasquesdemiseenformedeladate.Onpeutainsiarrondirunedatel'anne,aumois,laminute,...Pardfautlaprcisionestlejour.
SYSDATE
Renvoieladateetl'heurecourantesdusystmed'exploitationhote.
TRUNC(date[,prcision])
Renvoiedatetronquel'unitspcifiedansprcision.LesparamtressontanaloguesceuxdelafonctionROUND.
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)
Renvoielachanedecaratresenobtenueenconvertissantnombreenfonctiondeformat.Formatestunechanedecaractrespouvantcontenirlescaractressuivants:
9reprsenteunchiffre(nonreprsentsinonsignificatif)
0reprsenteunchiffre(reprsentmmesinonsignificatif)
.pointdcimalapparent
Vdfinitlapositiondupointdcimalnonapparent
,unevirguleapparatracetendroit
$
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 21/44
un$prcderalepremierchiffresignificatifB
lenombreserareprsentpardesblancss'ilvaut0EEEE
lenombreserareprsentavecunexposant(lespcifieravantMIouPR)MI
lesignengatifseradroitePR
unnombrengatifseraentre
TO_CHAR(date,format)
Renvoieconversiond'unedateenchanedecaractres.Leformatindiquequellepartiedeladatedoitapparatre,c'estunecombinaisondescodessuivants:
sccsicleavecsigne
ccsicle
sy,yyyanne(avecsigneetvirgule)
y,yyyanne(avecvirgule)
yyyyanne
yyy3dernierschiffresdel'anne
yy2dernierschiffresdel'anne
ydernierchiffredel'anne
qnumrodutrimestredansl'anne
wwnumrodelasemainedansl'anne
wnumrodelasemainedanslemois
mmnumrodumois
dddnumrodujourdansl'anne
ddnumrodujourdanslemois
dnumrodujourdanslasemaine
hhouhh12heure(sur12heures)
hh24heuresur24heures
miminutes
sssecondes
ssssssecondesaprsminuit
jjourducalendrierjulien
Lesformatssuivantspermettentd'obtenirdesdatesenlettres(enanglais):
syearouyear
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 22/44
anneentouteslettresmonth
nomdumoismon
nomdumoisabrgsur3lettresday
nomdujourdy
nomdujourabrgsur3lettresamoupm
indicationamoupmbcouad
indicationavantouaprsJsusChrist
Lessuffixessuivantsmodifientlaprsentationdunombreauquelilssontaccols:
thajoutdusuffixeordinatst,nd,rd,th
spnombreentouteslettres
Toutcaractrespcialinsrdansleformatserareproduittelqueldanslachanedecaractresrsultat.
TO_DATE(chane,format)
Permetdeconvertirunechanedecaractresendonnedetypedate.LeformatestidentiqueceluidelafonctionTO_CHAR.
TO_NUMBER(chane)
Convertitchaneensavaleurnumrique.
Remarque:Onpeutgalementinsrerdansleformatunechanedecaractresquelconque,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:DonnerlalistedetouslesnomsdesemploysenayantremplaclesAetlesMpardes*danslesnoms.
SELECTTRANSLATE(nom,'AM','**')FROMemp
Exemple:Affichertouslessalairesavecun$entteetaumoinstroischiffres
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 23/44
(dontdeuxdcimales).
SELECTTO_CHAR(salaire,'99900.00')FROMemp
Autresfonctions
GREATEST(expr1,expr2,...)
Renvoielaplusgrandedesvaleursexpr1,expr2,....Touteslesexpressionssontconvertiesauformatdeexpr1avantcomparaison.
LEAST
Renvoielapluspetitedesvaleursexpr1,expr2,....Touteslesexpressionssontconvertiesauformatdeexpr1avantcomparaison.
NVL(expr_1,expr_2)
Prendlavaleurexpr_1,saufsiexpr_1estNULLauquelcasNVLprendlavaleurexpr_2.UnevaleurNULLenSQLestunevaleurnondfinie.Lorsquel'undestermesd'uneexpressionalavaleurNULL,l'expressionentireprendlavaleurNULL.D'autrepart,unprdicatcomportantunecomparaisonavecuneexpressionayantlavaleurNULLprendratoujourslavaleurfaux.LafonctionNVLpermetderemplacerunevaleurNULLparunevaleursignificative.
DECODE(crit,val_1,res_1[,val_2,res_2...],def)
Cettefonctionpermetdechoisirunevaleurparmiunelisted'expressions,enfonctiondelavaleurpriseparuneexpressionservantdecritredeslection.Lersultatrcuprest:
res_1sil'expressioncritalavaleurval_1
res_2sil'expressioncritalavaleurval_2
def(lavaleurpardfaut)sil'expressioncritn'estgale
aucunedesexpressionsval_1,val_2,...,.
Lesexpressionsrsultatsres_1,res_2,...,defpeuventtredetypesdiffrents:caractreetnumrique,oucaractreetdate(lersultatestdutypedelapremireexpressionrencontrdansleDECODE).LafonctionDECODEpermetgalementdemlangerdansunecolonnersultatdesinformationsvenantdeplusieurscolonnesd'unemmetable.
Exemple:Donnerpourchaqueemploysesrevenus(salaire+commission).
SELECTnom,salaire,comm,salaire+NVL(comm,0)FROMemp
Exemple:Donnerlalistedesemploysavecpourchacund'euxsacatgorie(prsident=1,directeur=2,autre=3)
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 24/44
SELECTnom,DECODE(fonction,'president',1,'directeur',2,3)FROMemp
Exemple:Donnerlalistedesemploysenlesidentifiantparleurfonctiondansledpartement10etparleurnomdanslesautresdpartements.
SELECTDECODE(n_dept,10,fonction,nom)FROMemp
Les fonctions de groupe
Danslesexemplesprcdents,chaquelignersultatd'unSELECTtaitlersultatdecalculssurlesvaleursd'uneseulelignedelatableconsulte.Il
existeunautretypedeSELECTquipermetd'effectuerdescalculssurl'ensembledesvaleursd'unecolonne.Cescalculssurl'ensembledesvaleursd'unecolonnesefontaumoyendel'unedesfonctionssuivantes:
AVG([DISTINCT|ALL]expression)
Renvoielamoyennedesvaleursd'expression.
COUNT(*|[DISTINCT|ALL]expression)
Renvoielenombredelignesdursultatdelarequte.Siexpressionestprsent,onnecomptequeleslignespourlesquellescetteexpressionn'estpasNULL.
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
Indiquelafonctiondegroupedeneprendreencomptequedesvaleursdistinctes.
ALL
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 25/44
Indiquelafonctiondegroupedeprendreencomptetouteslesvaleurs,c'estlavaleurpardfaut.
Exemple:Donnerletotaldessalairesdudpartement10.
SELECTSUM(salaire)FROMempWHEREn_dept=10
Exemple:Donnerlenom,lafonctionetlesalairedel'employ(oudesemploys)ayantlesalairelepluslev.
SELECTnom,fonction,salaireFROMempWHEREsalaire=(SELECTMAX(salaire)FROMemp)
Remarques
CesSELECTsontdiffrentsdeceuxvusprcdemment.Ilest,parexemple,impossiblededemanderenrsultatlafoisunecolonneetunefonctionde
groupe.
unSELECTcomportantunefonctiondegroupepeuttreutilisdansunesousinterrogation.
ValeursNULL
AucunedesfonctionsdegroupenetientcomptedesvaleursNULLl'exceptiondecount(*).Ainsi,SUM(col)estlasommedesvaleursnonNULLdelacolonnecol.DemmeAVGestlasommedesvaleursnonNULLdiviseparlenombredevaleursnonNULL.
Calculsurplusieursgroupes
Ilestpossibledesubdiviserlatableengroupes,chaquegroupetantl'ensembledeslignesayantunevaleurcommune.C'estlaclauseGROUPBYquipermetdedcouperlatableenplusieursgroupes:
GROUPBYexpr_1,expr_2,...
Sionauneseuleexpression,cecidfinitlesgroupescommelesensemblesdelignespourlesquellescetteexpressionprendlammevaleur.Siplusieursexpressionssontprsenteslesgroupessontdfinisdelafaonsuivante:parmitoutesleslignespourlesquellesexpr_1prendlammevaleur,onregroupecelles
ayantexpr_2identique,...UnSELECTdegroupeavecuneclauseGROUPBYdonneraunelignersultatpourchaquegroupe.
Exemple:Totaldessalairespourchaquedpartement
SELECTSUM(salaire),n_deptFROMempGROUPBYn_dept
Remarque:Danslalistedescolonnesrsultatd'unSELECTcomportantunefonctiondegroupe,nepeuventfigurerquedescaractristiquesdegroupe,c'estdire:
soitdesfonctionsdegroupe
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 26/44
soitdesexpressionsfigurantdansleGROUPBY.
Slectiondesgroupes
Delammefaonqu'ilestpossibledeslectionnercertaineslignesaumoyende
laclauseWHERE,ilestpossibledansunSELECTcomportantunefonctiondegroupedeslectionnerparlaclauseHAVING,quiseplaceaprslaclauseGROUPBY.
LeprdicatdanslaclauseHAVINGsuitlesmmesrglesdesyntaxequ'unprdicatfigurantdansuneclauseWHERE.
Cependant,ilnepeutporterquesurdescaractristiquesdugroupe:fonctiondegroupeouexpressionfigurantdanslaclauseGROUPBY,danscecaslaclauseHAVINGdoittreplaceaprslaclauseGROUPBY.
Exemple:Donnerlalistedessalairesmoyensparfonctionpourlesgroupesayantplusdedeuxemploys.
SELECTfonction,COUNT(*),AVG(salaire)FROMempGROUPBYfonctionHAVINGCOUNT(*)>2
Remarque:UnSELECTdegroupepeutcontenirlafoisuneclauseWHEREetuneclauseHAVING.LaclauseWHEREserad'abordappliquepourslectionnerleslignes,puislesgroupesserontconstituspartirdeslignesslectionnes,etlesfonctionsdegroupeserontvalues.
Exemple:Donnerlenombred'ingnieursoudecommerciauxdesdpartementsayantaumoinsdeuxemploysdecescatgories.
SELECTn_dept,COUNT(*)FROMempWHEREfonctionin('ingenieur','commercial')GROUPBYn_deptHAVINGCOUNT(*)>=2
UneclauseHAVINGpeutcomporterunesousinterrogation.
Exemple:Quelestledpartementayantleplusd'employs?
SELECTn_dept,COUNT(*)FROMempGROUPBYn_deptHAVINGCOUNT(*)=(SELECTMAX(COUNT(*))FROMempGROUPBYn_dept)
Fonctiondegroupedeuxniveaux
Ilestpossibled'appliqueraursultatd'unSELECTavecGROUPBYundeuximeniveaudefonctiondegroupe.
Exemple:lafonctionMAXpeuttreappliqueauxnombresd'employsdechaquedpartementpourobtenirlenombred'employsdudpartementayantleplusd'employs.
SELECTMAX(COUNT(*))FROMempGROUPBYn_dept
Modification une base
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 27/44
Dfinition
Lelangagedemanipulationdedonnesestlelangagepermettantdemodifierlesinformationscontenuesdansunebasededonnes.L'unitmanipuleestlaligne.IlexistetroiscommandesSQLpermettantd'effectuerlestroistypesdemodificationsdesdonnes:ajout,modificationetsuppression.
Ajoutdelignes
Dfinition
LacommandeINSERTpermetd'insrerunelignedansunetableenspcifiantlesvaleursinsrer.Lasyntaxeestlasuivante:
INSERTINTOnom_table(nom_col1,nom_col2,...)VALUES(val1,val2...)
Lalistedesnomsdecolonneestoptionnelle.Sielleestomise,lalistedescolonnesserapardfautlalistedel'ensembledescolonnesdelatabledansl'ordredelacrationdelatable.Siunelistedecolonnesestspcifie,lescolonnesnefigurantpasdanslalisteaurontlavaleurNULL.
Ilestpossibled'insrerdansunetabledeslignesprovenantd'uneautretable.Lasyntaxeestlasuivante:
INSERTINTOnom_table(nom_col1,nom_col2,...)SELECT...
LeSELECTpeutcontenirn'importequelleclausesaufunORDERBYquiimpliqueraitunclassementdeslignescontrairel'espritdurelationnel.
Exemple:Insrerdanslatablebonuslesnomsetsalairesdesdirecteurs.
INSERTINTObonus
SELECTnom,salaire
FROMemp
WHEREfonction='directeur'
Syntaxe
INSERTINTO[schema.]table|view
[(column[,column]...)]
VALUES(expr[,expr]...)|subquery
schema
estlenomduschmacontenantlatableoulavue.Leschmapardfautest
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 28/44
celuidel'utilisateurquiexcutelarequte.
table/view
estlenomdelatabledanslaquelleleslignesserontinsrs.Sic'estunnomdevuequiestprcis,lesdonnesserontinsrsdanslatablebasesurlavue.
column
nomdescolonnes
VALUESExpr/subquery
Valeursdescolonnes
Prrequis
Pourpouvoirinsrerdeslignesdansunetableilfautsoittrepropritairedecetobjet,soitavoirleprivilgeINSERTsurcettetable.
LeprivilgeINSERTANYTABLEpermetd'insrerdeslignesdansn'importequelletableappartenantn'importequelutilisateur.
Modificationdelignes
Dfinition
LacommandeUPDATEpermetdemodifierlesvaleursd'uneouplusieurscolonnes,dansuneouplusieurslignesexistantesd'unetable.Lasyntaxeestlasuivante:
UPDATEnom_tableSETnom_col1={expression1|(SELECT...)},nom_col2={expression2|(SELECT...)}WHEREpredicat
Lesvaleursdescolonnesnom_col1,nom_col2,...sontmodifiesdanstoutesleslignessatisfaisantauprdicat.Enl'absenced'uneclauseWHERE,toutesleslignessontmisesjour.Lesexpressionsexpression1,expression2,...peuventfairerfrenceauxanciennesvaleursdelaligne.
Exemple:Augmenterde10%lesingnieurs.
UPDATEemp
SETsalaire=salaire*1.1
WHEREfonction='ingenieur'
Syntaxe
UPDATE[schema.]table|view[alias]
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 29/44
SET(column[,column]...)=(subquery)|column=expr|(subquery)[,(column[,column]...)=(subquery)|column=expr|(subquery)]...[WHEREcondition]
schema
estlenomduschmacontenantlatableoulavuemodifier.Leschmapardfautestceluidel'utilisateurquiexcutelarequte.
table,view
estlenomdelatablemettrejour.Sic'estunnomdevue,latablemisejourestcellesurlaquellelavueestdfinie.
alias
estunaliasassignlatable.lesaliassontgnralementutilissdansdesUPDATEcontenantdesrequtes.
column
estlenomdelacolonnequiseramodifie.
expr
estlanouvellevaleurdelacolonne.
subquery
estunSELECTquirenvoielesnouvellesvaleursaffectesauxcolonnescorrespondantes.
WHERE
restreintleslignesmodifiescellespourlesquelleslaconditionestvraie.Sionometcetteclausetoutesleslignessontmodifies.
Prrequis
Pourpouvoirmodifierdeslignesappartenantunetable,ilfautsoittrepropritairedecetobjet,soitavoirleprivilgeUPDATEsurcettetable.
leprivilgeUPDATEANYTABLEpermetdeslectionnerdeslignesden'importequelobjetappartenantn'importequelutilisateur.
Suppressiondelignes
Dfinition
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 30/44
LacommandeDELETEpermetdesupprimerdeslignesd'unetable.Lasyntaxeestlasuivante:
DELETEFROMnom_tableWHEREprdicat;
Toutesleslignespourlesquellesprdicatestvaluvraisontsupprimes.Enl'absencedeclauseWHERE,toutesleslignesdelatablesontsupprimes.
Syntaxe
DELETE[FROM][schema.]table|view[alias]
[WHEREcondition]
schema
estlenomduschmacontenantlatableoulavuedtruire.Leschmapardfautestceluidel'utilisateurquiexcutelarequte.
table,view
estlenomdelatableoudelavuecontenantleslignesquiserontdtruites.Sic'estunnomdevue,leslignesdtruitesappartiennentlatablesurlaquellelavueestbase.
alias
Estunaliasassignlatable.lesaliassontgnralementutilissdansdesDELETEcontenantdesrequtes.
WHERE
Dtruitseulementleslignessatisfaisantlacondition.Cetteconditionpeutrfrencerlatableetpeutcontenirdessousrequtes.Sicetteclauseestomisedtruittoutesleslignes.
Prrequis
Pourdtruiredeslignesappartenantunetable,ilfautsoittrepropritairedelatable,soitavoirleprivilgeDELETEsurcettetable.
LeprivilgeDELETEANYTABLEpermetunutilisateurdedtruiredeslignessetrouvantdansn'importequelletable,oun'importequellevuebasesurunetable.
Suppressiond'unetable
Dfinition
LacommandeDROPpermetdedtruireunetableettoutessesdonnes.
Syntaxe
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 31/44
DROPTABLE[schema.]table
[CASCADECONSTRAINTS]
schema
estlenomduschmacontenantlatableoulavuedtruireLeschmapardfautestceluidel'utilisateurquiexcutelarequte.
table
estlenomdelatabledtruire.
CASCADECONSTRAINTS
Supprimetouteslescontraintesquisereferelatablesupprime.
Prrequis
Pourpouvoirdtruireunetableilfautsoittrepropritairedecettetable,soitavoirleprivilgeDROPANYTABLE.
Gestiondestransactions
Unetransactionestunensembledemodificationsdelabasequiformeuntoutindivisible.Ilfauteffectuercesmodificationsentirementoupasdutout,souspeinedelaisserlabasedansuntatincohrent.
LesSystmesdeGestiondeBasesdeDonnespermettentauxutilisateursdegrerleurstransactions.Ilspeuventtoutmoment:
ValiderlatransactionencoursparlacommandeCOMMIT.Lesmodifications
deviennentdfinitivesetvisiblestouslesutilisateurs.
AnnulerlatransactionencoursparlacommandeROLLBACK.Toutesles
modificationsdepuisledbutdelatransactionsontalorsdfaites.
Encoursdetransaction,seull'utilisateurayanteffectulesmodificationslesvoit.
Cemcanismeestutilisparlessystmesdegestiondebasesdedonnespourassurerl'intgritdelabaseencasdefinanormaled'unetcheutilisateur:ilyaautomatiquementROLLBACKdestransactionsnontermines.
ORACLEestunsystmetransactionnelquiassurelacohrencedesdonnesencasdemisejourdelabase,mmesiplusieursutilisateurslisentoumodifientlesmmesdonnessimultanment.
ORACLEutiliseunmcanismedeverrouillagepourempcherdeuxutilisateursd'effectuerdestransactionsincompatiblesetrglerlesproblmespouvantsurvenir.
ORACLEpermetleverrouillagedecertainesunits(tableouligne)automatiquementousurdemandedel'utilisateur.Lesverroussontlibrsenfindetransaction.
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 32/44
Les tables
Lelangagededfinitiondesdonnesestlelangagepermettantdecreroudemodifierleschmad'unerelationetdoncd'unetable.Ilpermetdecrer,demodifieretdesupprimernonseulementlestables,maisaussilesvues,lesindexetlesclusters.
Crerunetable
Latableestlastructuredebasecontenantlesdonnesdesutilisateurs.Quandoncreunetable,onpeutspcifierlesinformationssuivantes:
ladfinitiondescolonnes,lescontraintesd'intgrit,LaTableSpacecontenantlatable,lescaractristiquesdestockage,leclustercontenantlatable,lesdonnesrsultantd'uneventuellerequte.
Crationsimple
Lacommandedecrationdetablelaplussimplenecomporteraquelenometletypedechaquecolonnedelatable.L'onpeutcrerunetableparlacommandeCREATETABLEenspcifiantlenometletypedechaquecolonne.Alacration,latableseravidemaisuncertainespaceluiseraallou.Lasyntaxeestlasuivante:
CREATETABLEnom_table(nom_col1TYPE1,nom_col2TYPE2,...)
L'optionNOTNULLassurequ'ORACLEinterditlorsd'unINSERToud'unUPDATEquecettecolonnecontiennelavaleurNULL,pardfautelleestautorise.
CrationavecInsertiondedonnes
Onpeutinsrerdesdonnesdansunetablelorsdesacrationparlacommandesuivante:
CREATETABLEnom_table[(nom_col1,nom_col2, ...)]ASSELECT...
Onpeutainsi,enunseulordreSQLcrerunetableetlarempliravecdesdonnes
provenantdursultatd'unSELECT.
Onn'apasbesoinalorsdespcifierdetypepourlescolonnes:lestypesdes
donnessontceuxprovenantduSELECT.Sidesconversionsdetypesontfaire,onpeutdansleSELECTutiliserlesfonctionsTO_CHAR,TO_DATE,TO_NUMBER.
Pardfautlesnomsdescolonnesdelanouvelletablesontlesnomsdescolonnes
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 33/44
duSELECT.SidesexpressionsapparaissentdansleSELECT,lescolonnescorrespondantesdoiventimprativementtrerenommes.
LeSELECTpeutcontenirdesfonctionsdegroupesmaispasd'ORDERBYcarleslignesd'unetablenepeuventpastreclasses.
Onpeut,etmmeondoit,quandoncreunetabledfinirlescontraintesd'intgritquedevrontrespecterlesdonnesquel'onmettradanslatable(voirunpeuplusbas).
Lestypesdedonnes
NUMBER[(longueur,[prcision])
Cetypededonnespermetdestockerdesdonnesnumriqueslafoisentiresetrellesdontlavaleurestcompriseentre10^130et10^125avecuneprcisionde38chiffres.
longueurprciselenombremaximumdechiffressignificatifsstocks(pardfaut38),
prcisiondonnelenombremaximumdechiffresaprslavirgule(pardfaut38),savaleurpeuttrecompriseentre84et127.Unevaleurngativesignifiequelenombreestarrondigauchedelavirgule.
CHAR(longueur)
Cetypededonnespermetdestockerdeschanesdecaractresdelongueurfixe.Longueurdoittreinfrieur255,savaleurpardfautest1.
VARCHAR(longueur)
Cetypededonnespermetdestockerdeschanesdecaractresdelongueurvariable.Longueurdoittreinfrieur2000,iln'yapasdevaleurpardfaut.
DATE
Cetypededonnespermetdestockerdesdonnesconstituesd'unedateetd'uneheure.
RAW(longueur)
Cetypededonnespermetdestockerdescaractresnonimprimables.
LONG
Cetypededonnespermetdesstockerdeschanesdecaractresdelongueurvariableetinfrieure2^311.Lescolonnesdecetypesontsoumisescertainesrestrictions
unetablenepeutpascontenirplusd'unecolonnedecetypelescolonnesdecetypenepeuventpasapparatredansdescontraintesd'intgritlescolonnesdecetypenepeuventpastreindexes
lescolonnesdecetypenepeuventpasapparatredansdesclauses
:WHERE,GROUPBY,ORDERBYouCONNECTBYainsiquedansunDISTINCT.
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 34/44
Contraintesd'intgrit
Alacrationd'unetable,lescontraintesd'intgritsedclarentdelafaonsuivante:
CREATETABLEnom_table(nom_col_1type_1,nom_col_2type_2,...nom_col_ntype_nCONSTRAINT[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_1CONSTRAINT[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_1CONSTRAINT[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_1CONSTRAINT[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
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 35/44
Onpeutmodifierdynamiquementladfinitiond'unetablegrcealacommandeALTERTABLE.Deuxtypesdemodificationssontpossibles:ajoutd'unecolonneetmodificationd'unecolonneexistante.
Iln'estpaspossibledesupprimerunecolonne.Parcontreunecolonnequin'estplusutilisepeuttremiselavaleurNULL,auquelcasellen'occupeplusd'espacedisque.Siondsirevraimentsupprimerunecolonne,ilfaut:
secrerunenouvelletablesanslacolonneenquestiondtruirel'anciennetable,donnerlanouvelletablelenomdel'ancienne.
Ajouterunecolonne
Lacommandesuivantepermetd'ajouteruneouplusieurscolonnesunetableexistante:
ALTERTABLEnom_tableADD(nom_col1TYPE1,nom_col2TYPE2,...)
LestypespossiblessontlesmmesqueceuxdcritsaveclacommandeCREATETABLE.
Silatablecontientdjdeslignes,lanouvellecolonneauradesvaleursNULLpourleslignesexistantes.
Modifierunecolonne
Ilestpossibledemodifierladfinitiond'unecolonne,conditionquelanouvelledfinitionsoitcompatibleaveclecontenudelacolonneetenrespectantlescontraintessuivantes:
danstouslescasilestpossibled'augmenterlatailled'unecolonneilestpossibledediminuerlataille,oummedechangerletyped'unecolonnevide
onpeutspcifierNOTNULLsilacolonnenecontientaucunevaleurNULL
onpeutdanstouslescasspcifierNULLpourautoriserlesvaleursNULL.
Supprimerunetable
LacommandeDROPTABLEpermetdesupprimerunetable,sasyntaxeestlasuivante:
DROPTABLEnom_table;
Latablenom_tableestalorssupprime.Ladfinitiondelatableainsiquesoncontenusontdtruits,etl'espaceoccupparlatableestlibr.
Renommerunetable
Onalapossibilitdechangerlenomd'unetableparlacommandeRENAME,lasyntaxeestlasuivante:
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 36/44
RENAMEancien_nomTOnouveau_nom;
Les vues
Lesvuespermettentd'assurerl'objectifd'indpendancelogique.Grceelles,chaqueutilisateurpourraavoirsavisionpropredesdonnes.
Onavuquelersultatd'unSELECTestluimmeunetable.Unetelletable,quin'existepasdanslabasemaisestcredynamiquementlors
del'excutionduSELECT,peuttrevuecommeunetablerelleparlesutilisateurs.Pourcela,ilsuffitdecataloguerleSELECTentantquevue.
Lesutilisateurspourrontconsulterlabase,oumodifierlabase(aveccertainesrestrictions)traverslavue,c'estdiremanipulerlatablersultatdu
SELECTcommesic'taitunetablerelle.
Crerunevue
LacommandeCREATEVIEWpermetdecrerunevueenspcifiantleSELECTconstituantladfinitiondelavue:
CREATEVIEWnom_vue[(nom_col1,...)]ASSELECT...WITHCHECKOPTION;
Laspcificationdesnomsdecolonnesdelavueestfacultative.Pardfaut,lesnomsdescolonnesdelavuesontlesmmesquelesnomsdescolonnesrsultatdu
SELECT(sicertainescolonnesrsultatduSELECTsontdesexpressions,ilfautrenommercescolonnesdansleSELECT,ouspcifierlesnomsdecolonnedelavue).
Unefoiscre,unevues'utilisecommeunetable.Iln'yapasdeduplicationdesinformationsmaisstockagedeladfinitiondelavue.
Exemple:Crationd'unevueconstituantunerestrictiondelatableempauxemploysdudpartement10.
CREATEVIEWemp10AS
SELECT*
FROMemp
WHEREn_dept=10
LeCHECKOPTIONpermetdevrifierquelamisejouroul'insertionfaitetraverslavueneproduisentquedeslignesquifontpartiedelaslectiondelavue.
Ainsidonc,silavueemp10atcreavecCHECKOPTIONonnepourratraverscettevuenimodifier,niinsrerdesemploysnefaisantpaspartiedudpartement10.
Ilestpossibled'effectuerdesINSERTetdesUPDATEtraversdesvues,sousdeux
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 37/44
conditions:
leSELECTdfinissantlavuenedoitpascomporterdejointure,lescolonnesrsultatduSELECTdoiventtredescolonnesrellesetnonpasdesexpressions.
Exemple:Modificationdessalairesdudpartement10traverslavueemp10.
UPDATEemp10
SETsal=sal*1.1
Toutesleslignesdelatableemp,tellesquelecontenudelacolonnen_deptestgal10serontmodifies.
Supprimerunevue
Unevuepeuttredtruiteparlacommande:
DROPVIEWnom_vue;
Renommerunevue
Onpeutrenommerunevueparlacommande:
RENAMEancien_nomTOnouveau_nom;
Les index
IntroductionGnralits
Selonlemodlerelationnellesslectionspeuventtrefaitesenutilisantlecontenuden'importequellecolonneetleslignessontstockesdansn'importequelordre.
ConsidronsleSELECTsuivant:
SELECT*FROMempWHEREnom='MARTIN'
Unmoyenderetrouverlaouleslignespourlesquelles,fontcolor=red>nomestgalMARTINestdebalayertoutelatable.
Untelmoyend'accsconduitdestempsderponseprohibitifspourdestablesdpassantquelquescentainesdelignes.
Unesolutionoffertepartouslessystmesdegestiondebasesdedonnesestlacrationd'index,quipermettradesatisfaireauxrequteslesplusfrquentesavecdestempsderponseacceptables.
Unindexseramatrialisparlacrationdeblocsdisquecontenantdescouples(valeursd'index,numrodebloc)donnantlenumrodeblocdisquedanslequelsetrouventleslignescorrespondantchaquevaleurd'index.
Structured'unindex
Lesindexsontdesstructurespermettantderetrouverunelignedansunetable
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 38/44
partirdelavaleurd'unecolonneoud'unensembledecolonnes.Unindexcontientlalistetriedesvaleursdescolonnesindexesaveclesadressesdeslignes(numrodeblocdanslapartitionetnumrodelignedanslebloc)correspondantes.
Touslesindexoraclesontstockssousformed'arbresquilibrs(btree):unestructurearborescentepermetderetrouverrapidementdansl'indexlavaleurdeclcherche,etdoncl'adressedelalignecorrespondantedanslatable.
Dansuntelarbre,touteslesfeuillessontlammeprofondeur,etdonclarechercheprendapproximativementlemmetempsquellequesoitlavaleurdelacl.
Lorsqu'unblocd'indexestplein,ilestclatendeuxblocs.enconsquence,touslesblocsd'indexontuntauxderemplissagevariantde50%100%.Sansindexonbalaiesquentiellementtoutelatablequellequesoitlapositiondelmentrecherch.
Utilisationdesindex
L'adjonctiond'unindexunetableralentitlesmisesjour(insertion,suppression,modificationdelacl)maisacclrebeaucouplarecherched'unelignedanslatable.
L'indexacclrelarecherched'unelignepartird'unevaleurdonnedecl,maisaussilarecherchedeslignesayantunevaleurd'indexsuprieureouinfrieureunevaleurdonne,carlesvaleursdeclssonttriesdansl'index.
Exemple:Lesrequtessuivantesbnficierontd'unindexsurlechampn_dept.
SELECT*FROMempWHEREnum=16034
SELECT*FROMempWHEREnum>=27234
SELECT*FROMempWHEREnumBETWEEN16034AND27234
Unindexestutilisablemmesilecritrederechercheestconstituseulementdudbutdelacl.
Exemple:Larequtesuivantebnficierad'unindexsurlacolonnenom.
SELECT*
FROMemp
WHEREnomLIKE'M%'
Parcontresiledbutdelacln'estpasconnu,l'indexestinutilisable.
Exemple:Larequtesuivantenebnficierapasd'unindexsurlechampnom.
SELECT*
FROMemp
WHEREenameLIKE'?????????'
ValeursNULL
Ellesnesontpasreprsentesdansl'index,ceciafindeminimiserlevolumencessairepourstockerl'index.Encontrepartie,l'indexneserad'aucuneutilit
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 39/44
pourretrouverlesvaleursNULLlorsquelecritrederechercheestdutypeISNULL.
Conversions
L'indexn'estutilisablequesilecritredeslectionestlecontenudelacolonneindexe,sansaucunetransformation.Parexempleunindexsursalaireneserapasutilispourlarequtesuivante:
SELECT*FROMemp
WHEREsalaire*12>300000
Attentionenparticulierauxconversionsdetypequipeuventempcherl'utilisationdel'index.
SQLestunlangagetyp,chaquetypededonnes(numrique,caractre,date)ayantsespropresoprateurs,sespropresfonctionsetsaproprerelationd'ordre.Enconsquence,sidansuneexpression,figurentlafoisunnombreetunechanedecaractres,SQLconvertiralachanedecaractresennombre.Demmesidansuneexpression,figurentlafoisunechanedecaractresetunedate,SQLconvertiralachanedecaractresendate.
Or,dansunprdicatdutype:
WHEREfonction(col_indexe)=constante
SQLnepeutpasutiliserl'index.
Cecipeutseproduire,defaoninsidieuse,lorsqueSQLestobligd'ajouterunappelunefonctiondeconversioncaused'unediscordancedetype.
Exemple:Leprdicatsuivantnebnficierapasd'unindexsurlechampembauche.
SELECT*FROMemp
WHEREembaucheLIKE'????'
Eneffet,SQLestobligd'effectueruneconversion,etleprdicatquiseravaluest:
WHERETO_CHAR(embauche)LIKE'????'
Lecritrederechercheestunefonctiondeembauche,etnonlechampembaucheluimme,danscecasl'indexestinutilisable.
Choixdesindex
Indexerenpriorit:
1. lesclsprimaires2. lescolonnesservantdecritredejointure3. lescolonnesservantsouventdecritrederecherche
Nepasindexer:
1. lescolonnescontenantpeudevaleursdistinctes(indexalorspeuefficace)2. lescolonnesfrquemmentmodifies
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 40/44
Crerunindex
Unindexpeuttrecrparlacommandesuivante:
CREATE[UNIQUE]INDEXnom_indexONnom_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.Ilseraensuitetenujourautomatiquementlorsdesmodificationsdelatable.
Unindexpeutportersurplusieurscolonnes,lacld'accsseraalorslaconcatnationdesdiffrentescolonnes.
Onpeutcrerplusieursindexindpendantssurunemmetable.
LesrequtesSQLsonttransparentesaufaitqu'ilexisteunindexounon.C'estl'optimiseurdusystmedegestiondebasesdedonnesqui,aumomentdel'excutiondechaquerequte,recherches'ilpeuts'aiderounond'unindex.
Indexcomprimetnoncomprim
Lesclsdanslesindexpeuventtrecomprimesounon.Lacompressionestunetechniquepermettantderduiredansdesproportionstrsimportantes(d'autantplusquelaclestlongue)levolumedel'index.
Encontrepartie,ilfautparfoisuntraitementsupplmentairepourrecomposerlacllorsdesmisesjourdel'index.
Pardfaut,lesindexsontcomprims,lesavantagesderductiondetaillel'emportantsurlesinconvnientsdanslaplupartdescas.
sqlsaitexcutercertainesrequtesdirectementauniveaudel'indexsanspasserparlesegmentdedonnes,sil'indexestnoncomprimetsitousleschampsrsultatsdelarequtesontdansl'index.
Exemple:L'indexcrepar:
CREATEINDEXx
ONemp(num,nom)
nocompress
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 41/44
permettraderpondrelaquestion:
SELECTnom
FROMemp
WHEREnum
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 42/44
acclrerlajointureselonlacldeclusterdestablesmisesencluster,acclrerlaslectiondeslignesd'unetableayantmmevaleurdecl,parlefaitqueceslignessontregroupesphysiquement,conomiserdelaplace,dufaitquechaquevaleurdelaclduclusterneserastockequ'uneseulefois.
Leregroupementenclusteresttotalementtransparentl'utilisateur:destablesmisesenclustersonttoujoursvuescommedestablesindpendantes.
Parexempleonpourraitmettreenclusterlestablesempetdeptselonn_dept.Cestablesseraientrorganisesdelafaonsuivante:unblocdeclusterseraitcrpourchaquenumrodedpartement,cebloccontenantlafoisleslignesdelatableempetdelatabledeptcorrespondantcenumrodedpartement.Lajointureentrelestablesempetdeptselonn_deptdeviendraitalorsbeaucoupplusrapide,puisqu'elleseraitdjralisedansl'organisationphysiquedestables.
Pourquel'onpuissemettreunetableenclusterilfautquel'uneaumoinsdescolonnesfaisantpartieduclustersoitdfiniecommeobligatoire(NOTNULL).
Onpeutindexerlescolonnesd'unetableencluster,ycomprislescolonnescorrespondantlaclouunepartiedelaclducluster.Laclellemmeestautomatiquementindexe,onpeutventuellementlarindexerpourcrerunindexuniqueservantcontrlersonunicit.
Creruncluster
AvantdepouvoirmettreenclusteruneouplusieurstablesilfautcrerleclusteraumoyendelacommandeCREATECLUSTERdontlasyntaxeestlasuivante:
CREATECLUSTERnom_cluster(cle1type1,cle2type2,...)
ol'ondonneunnomaucluster,etol'ondfinitlenometletypedescolonnesconstituantlaclducluster.
CREATECLUSTERnom_cluster(cle1type1,cle2type2,...)[SIZEtaille_du_bloc][COMPRESS|NOCOMPRESS]
[SPACEnom_de_space_definition]
danslaquelle:
SIZE
estlatailled'unblocdecluster.Cettetaillepeutvarierde1/6deblocoracle1blocoracle(2koctetssurvax/vms),ceparamtredoittrechoisidefaonavoirunbonremplissagedesblocs.
COMPRESS|NOCOMPRESS
estrelatifl'indexquiseracresurlaclducluster
SPACE
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 43/44
spcifieleSPACEDEFINITIONquidfiniralesparamtresd'allocationd'espacepourlecluster.
CREATECLUSTERDEM(DEPNONUMBER)SIZE512;
Miseenclusterd'unetable
Enprincipec'estdssacrationqu'ilfautspcifiersiunetableseraimplantedansuncluster.
Lorsdelacrationdelatable
L'optionclusterdel'ordreCREATETABLEpermetdespcifierquelatabledoittremiseencluster.Leclusterdoitdjexister.
CREATETABLEnom_table
(nom_col1TYPE1NOTNULL,(nom_col2TYPE2NOTNULL, ...)CLUSTERNOM_CLUSTER(nom_coli,nom_colj...)
nom_coli,nom_coljsontdesnomsdecolonnesdelatable,ellesserontidentifiesuneuneauxcolonnesclsduclusterspcifieslacrationducluster.
Tabledjexistante
Enprincipecelan'estpaspossible,ilfautdoncprocderdelafaonsuivante:
crerunenouvelletableavecl'optionclusteretycopierlecontenudelatableinitialesupprimerl'anciennetablerenommerventuellementlanouvelletable.
Retraitd'unetabled'uncluster
Pourretirerunetabled'unclusterilfaut:
crerunenouvelletableendehorsduclusteretcopierlatableenclusterdanslanouvelletabledtruirel'anciennetablelanouvelletablepourraalorstrerenommepourprendrelenomdel'ancienne.
cecinedtruitpaslatable,maislareconstruitendehorsducluster.
Supprimeruncluster
Unclusternecontenantaucunetablepeuttresupprimparlacommande:
DROPCLUSTERnom_cluster;
Remarque:Lesperformancesduclusternesontvalablesquesionn'apasdeblocschans(exdegrandetable).
20/2/2015 CoursdeSQL/Oracle
http://tcosnuau.free.fr/COURS/SQL/SQL_ORA.HTM 44/44
1999/05ThC