Sunteți pe pagina 1din 11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
Forums Tutoriels Magazine FAQs Blogs Projets Chat Newsletter tudes Emploi Club Contacts

Accueil

ALM
SGBD

Java

4D

.NET

Dv.Web

Access

EDI

BigData

AccueilSGBD

Programmation
DB2

ForumsSGBD

Firebird

FAQsSGBD

SGBD

Office

InterBase

Solutionsd'entreprise

MySQL

TutorielsSGBD

SQL

NoSQL

Applications

PostgreSQL

OutilsSGBD

Oracle

Mobiles
Sybase

Systmes

SQLServer

LivresSGBDetSQL

LESQLdeAZ:4epartiegroupageetensembles
LegroupageetlesrequtesportantssurdessousensemblesconstituentsouventlapartielaplusdifficilecomprendreduSQL...C'estpourquoi
nousyconsacreronsunlongarticle.
Enfin,nousverronsdiffrentsoprateursensemblistespourmanipulerlestableslamaniredespatatesdeVenn.
Articlelu118054fois.
L'auteur
SQLPro
L'article
Publile26aot2003
Prambule
Publicvis:dbutant
NOTA:Lastructuredelabasededonnesexemple,ainsiqu'uneversiondesprincipalesbasesutilisessontdisponiblesdanslapage"La
Lienssociaux
basededonnesexemple"
1.LaclauseGROUPBY

Voustrouverezdescomplmentsd'informationsurlesujetauxpages153154del'ouvrage"SQL",collection"LaRfrence",CampusPress
diteur.
LaclauseBROUPBYestncessairedsquel'onutilisedesfonctionsdecalculsstatistiquesavecdesdonnesbrutes.Cetteclausegroupeles
lignesslectionnesensebasantsurlavaleurdecolonnesspcifiespourchaqueligneetrenvoieuneseulelignepargroupe.
Onpeutlacompareruneoprationdedcoupagedesousensembleunpeutlamaniredes"niveauxderupture"lorsquel'onralisedes
tatsimprims.
Cherchonscompterlenombredechambrepartagedenotrehtel:
Exemple1

Slectionnez
SELECTCOUNT(CHB_ID)ASNOMBRE,CHB_ETAGE
FROMT_CHAMBRE

Larequte,tellequeprsentecidessusn'estpascalculable.Eneffetcommentdcidersilecomptagedoitsefairepourchaquechambreou
pourungroupedechambreetnotammentlesgroupesformsparchacundestages?
Silarequtesefaisaitpourchaquechambre,lersultatserait:

Slectionnez
NOMBRECHB_ETAGE

1RDC
1RDC
1RDC
1RDC
11er
11er
11er
11er
11er
...

Etn'auraitpasbeaucoupdesens!
Enrevanche,unregroupementpartage,donnetoutsonsenslarequte:

Slectionnez
NOMBRECHB_ETAGE

81er
82e
4RDC

Pourraliseruntelregroupementilfautintroduireuneclausedegroupagedanslarequte.PourcelaSQLfournitleclauseGROUPBY:
Exemple1bis

Slectionnez

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

1/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
SELECTCOUNT(*)ASNOMBRE,CHB_ETAGE
FROMT_CHAMBRE
GROUPBYCHB_ETAGE

NOTA:
LaprsencedelaclauseGROUPBYestncessairedsquelaclausedeslection,oulefiltreWHERE,ouencorelesjointurescomportent
simultanmentdescalculsd'agrgationetlaprsencedecolonnesdetablehorsdecalculsd'agrgation.
Deplus,outeslescolonnesreprsenteshorsdescalculsd'agrgationdoiventfigurerdanslaclauseGROUPBY.
Laplupartdutemps,lemoteurderequtevousavertirad'unprobableincohrencedecalculdesagrgatsl'aided'unmessaged'erreur
(avantexcutiondelarequte),dugenre:"Lacolonne...estincorrectedanslalistedeslectionparcequ'ellen'estpascontenuedansune
fonctiond'agrgationetqu'iln'yapasdeclauseGROUPBY"(SQLServer).
Cherchonsmaintenantcompterlecouchagedechaquetage:
Exemple2

Slectionnez
SELECTSUM(CHB_COUCHAGE)ASNOMBRE,CHB_ETAGE
FROMT_CHAMBRE
GROUPBYCHB_ETAGE

Slectionnez
NOMBRECHB_ETAGE

231er
222e
9RDC

Unpeupluscompliqu,cherchonssavoirquelatlenombredenuitespourchaquechmabreaucoursdel'anne1999(unenuitetant
unepersonnepassantunenuitdansunechambre.Sideuxpersonnesoccupentlammechambrecelafaitdeuxnuites):
Exemple3

Slectionnez

Slectionnez
SELECTSUM(CHB_PLN_CLI_NB_PERS),C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLIP
ONC.CHB_ID=P.CHB_ID
WHEREPLN_JOURBETWEEN'19990101'AND'19991231'
GROUPBYC.CHB_ID

PERSONNECHB_ID

5581
3852
3223
3674
4455
7206
3907
4568
3629
36410
52911
46812
34713
36014
48415
72016
49117
37218
50419
36920

Partantdel,nouspouvonsrechercherletauxd'occupationdechaquechambredanscettepriode.
Lenombremaximaldenuitestantlenombredecouchagedechaquechambremultiplipartouteslesdatesdel'anne,cecalculs'obtient
par:
Exemple4

Slectionnez

Slectionnez
SELECTSUM(CHB_COUCHAGE)ASMAX_OCCUPATION,CHB_ID
FROMT_CHAMBREC
CROSSJOINT_PLANNINGP
WHEREPLN_JOURBETWEEN'19990101'AND'19991231'
GROUPBYC.CHB_ID

MAX_OCCUPATIONCHB_ID

10951
7302
7303
7304
10955
18256
7307
10958
7309
73010
109511
109512
73013
73014
109515
182516
109517
73018
109519
73020

Ilnesuffitplusquede"raccorder"lesrequtesdesexemples3et4:
Exemple5

Slectionnez
TAUX_OCCUPATION_POURCENTCHB_ID

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

2/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes

Slectionnez
SELECT(CAST(SUM(CHB_PLN_CLI_NB_PERS)ASFLOAT)/
CAST(SUM(CHB_COUCHAGE)ASFLOAT))*100

ASTAUX_OCCUPATION_POURCENT,
C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLICPC
ONC.CHB_ID=CPC.CHB_ID
CROSSJOINT_PLANNINGP
WHEREP.PLN_JOURBETWEEN'19990101'AND'19991231'
GROUPBYC.CHB_ID

65.2930402930402921
74.6065808297567942
74.644886363636363
74.6603260869565164
65.3013182674199585
60.279720279720286
74.7592847317744147
67.1919770773639028
75.8783783783783729
75.68119891008174710
67.71545827633377711
65.20947176684882212
75.92087312414733413
74.59568733153638214
67.34325665313485815
61.16216216216216116
66.89128481581310817
77.76298268974700518
65.90090090090090819
76.62517289073306920

Nousallonsvoir,maintenantquelaclauseGROUPBYestsouventutiliseaveclaclauseHAVING...
2.LaclauseHAVING

Voustrouverezdescomplmentsd'informationsurlesujetauxpages153154del'ouvrage"SQL",collection"LaRfrence",CampusPress
diteur.
LaclauseHAVINGagitcommelefiltreWHERE,maispermetdefiltrernonpluslesdonnes,maislesoprationsrsultantdesregroupements,
c'estdiretrsgnralementtouteexpressiondefiltredevantintroduireuncalculd'agrgation.
Pourtenterdecomprendrel'utilitdelaclausehaving,nousallonsprocderparunexemplesimple:recherchonsuntagedel'htelcapable
decoucheraumoins20personnes.
Partantdenotreexemple2,nousserionstenterd'crire:
Exemple6

Slectionnez
SELECTSUM(CHB_COUCHAGE)ASNOMBRE,CHB_ETAGE
FROMT_CHAMBRE
WHERESUM(CHB_COUCHAGE)>=20
GROUPBYCHB_ETAGE

MaiscetterequtevaimanquablementprovoqueruneerreuravantexcutiondufaitdelaclauseWHERE.Eneffet,souvenonsnousquele
filtreWHEREagitsurlesdonnesdestablesetpermetdefiltrerligneaprsligne.Orlefiltrageneporteplussurlanotiondelignes,
maissurunenotiondesousensembledelatable.End'autretermes,lefiltre,ici,doitportersurchacundesgroupes.C'estpourquoiSQL
introduitlefiltreHAVINGquiporte,nonpassurlesdonnes,maissurlescalculsrsultantsdesregroupements.
Enl'occurence,dansnotreexemple,nousdevonsdporterlefiltreWHEREdanslaclauseHAVINGetl'oprationdeviendrapossible:
Exemple6bis

Slectionnez

Slectionnez

SELECTSUM(CHB_COUCHAGE)ASNOMBRE,CHB_ETAGE
FROMT_CHAMBRE
GROUPBYCHB_ETAGE
HAVINGSUM(CHB_COUCHAGE)>=20

NOMBRECHB_ETAGE

231er
222e

Autreexemple:
Partantdelarequtevuel'exemple6,essayonsdeneretenirqueleschambresoccupesplusde2/3,soit66.666666...%?
Unepremiretentativeconsisteraitcrire:
Exemple7

Slectionnez

Slectionnez
SELECT(CAST(SUM(CHB_PLN_CLI_NB_PERS)ASFLOAT)/
CAST(SUM(CHB_COUCHAGE)ASFLOAT))*100AS
TAUX_OCCUPATION_POURCENT,C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLICPC
ONC.CHB_ID=CPC.CHB_ID
CROSSJOINT_PLANNINGP
WHEREP.PLN_JOURBETWEEN'19990101'AND'19991231'
GROUPBYC.CHB_ID
HAVINGCAST(SUM(CHB_PLN_CLI_NB_PERS)ASFLOAT)/
CAST(SUM(CHB_COUCHAGE)ASFLOAT)>=2.0/3.0

TAUX_OCCUPATION_POURCENTCHB_ID

74.6065808297567942
74.644886363636363
74.6603260869565164
74.7592847317744147
67.1919770773639028
75.8783783783783729
75.68119891008174710
67.71545827633377711
75.92087312414733413
74.59568733153638214
67.34325665313485815
66.89128481581310817
77.76298268974700518
76.62517289073306920

Unautreexempleintressantestderechercherquellessontleschambresquionttinnocupesplusde10joursaucoursdumoisdejanvier
2000...
Pourcalculerlenombredejourouleschambresonttoccupesaucoursdejanvier2000,ilsuffitdefaire:
Exemple8

Slectionnez

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

3/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes

Slectionnez
SELECTCOUNT(C.CHB_ID)ASNOMBRE,C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLICPC
ONC.CHB_ID=CPC.CHB_ID
WHEREEXTRACT(MONTHFROMP.PLN_JOUR)=1
ANDEXTRACT(YEARFROMP.PLN_JOUR)=2000
GROUPBYC.CHB_ID

NOMBRECHB_ID

191
202
183
234
215
196
187
208
219
2410
2111
2212
2013
2414
2315
2016
1917
2418
1919
2320

MaisnousvoulonslecomplmentdecettecolonneNOMBREaveclenombredejoursdumoisdejanvier2000,cequireprsente31jours.La
requtedevientdonc:
Exemple9

Slectionnez

Slectionnez
SELECT31COUNT(C.CHB_ID)ASNOMBRE,C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLICPC
ONC.CHB_ID=CPC.CHB_ID
WHEREEXTRACT(MONTHFROMP.PLN_JOUR)=1
ANDEXTRACT(YEARFROMP.PLN_JOUR)=2000
GROUPBYC.CHB_ID

NOMBRECHB_ID

121
112
133
84
105
126
137
118
109
710
1011
912
1113
714
815
1116
1217
718
1219
820

Dslorsilnesuffitplusquedefiltrerlecalcul:
31COUNT(C.CHB_ID)
pourneretenirquelesvaleurssuprieures10.Commecetteexpressioncontientunefonctiond'agrgation,cequisupposeungroupage,il
estncessaired'utiliserlefiltreWHERE:
Exemple10

Slectionnez
SELECT31COUNT(C.CHB_ID)ASNOMBRE,C.CHB_ID
FROMT_CHAMBREC
JOINTJ_CHB_PLN_CLICPC
ONC.CHB_ID=CPC.CHB_ID
WHEREEXTRACT(MONTHFROMCPC.PLN_JOUR)=1
ANDEXTRACT(YEARFROMCPC.PLN_JOUR)=2000
GROUPBYC.CHB_ID
HAVING31COUNT(C.CHB_ID)>10

Slectionnez
NOMBRECHB_ID

121
112
133
126
137
118
1113
1116
1217
1219

Pourdernierexemple,nousallonsnousplacerdansuncontexteplusprochedelaralit.Voicinotredirecteurquisouhaiteinciterlesclients
aveclesquelsilapeutravaillvenirplussouvent.L'ideluiprendd'offrirunbonderductionde15%surl'ensembledesprestations
htelirespourtouslesclientsayanteutunchiffred'affaireinfrieur15000FHTaucoursdel'anne2000.
Unepremireapprocheconsisteraisparexemplearecherchertoutesleschambreslibresentrelesdeuxdates:
Exemple11

Slectionnez
SELECTF.CLI_ID,
lecalculestlesuivant:
(quantit*montant*remiseen%)remiseenfrancs
lescolonnes"remises"pouvantavoirdesvaleursNULL
ilfautlesremplacerparunzrol'aidedelafonctionCOALESCE
SUM(LIF_QTE*LIF_MONTANT*((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))ASCA
FROMT_FACTUREF
INNERJOINT_LIGNE_FACTUREL
ONF.FAC_ID=L.FAC_ID
WHEREEXTRACT(YEARFROMF.FAC_DATE)=2000
GROUPBYC.CLI_ID

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

Slectionnez
CLI_IDCA

114510.6
3712488.799999999999
3913327.4
4014785.200000000001
5213890.799999999999
6114168.799999999999
8714992.4

4/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
HAVINGSUM(LIF_QTE*LIF_MONTANT*((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))<15000

Lesclients1,37,39,40,52,61,87tantbienlespersonnesvisesparlapromotion.
Maispoussonsnotreraisonnement...Imaginonsunepersonneayanttclienteen1999etpasen2000.Pourcelarajoutonsleslignes
suivantesdansnotrejeudedonnes:

Slectionnez
INSERTINTOT_CLIENT(CLI_ID,CLI_NOM)VALUES(101,'DUGUDU')
INSERTINTOT_FACTURE(FAC_ID,CLI_ID,FAC_DATE,FAC_PMT_DATE)VALUES(2375,101,'25/03/1999','15/04/1999')
INSERTINTOT_LIGNE_FACTURE(LIF_ID,FAC_ID,LIF_QTE,LIF_MONTANT,LIF_TAUX_TVA)VALUES(16791,2375,1,320,18.6)

L'excutiondelarequtedel'exemple10,nousdlivrelemmersultat,alorsquenousaimerionsrcuprerleclient101...Quelleerreur
avonsnouscommise?
Lefaitestquenousavonsnouveaufaitl'hypothsedumondeclos!(voirlapageLeSQLdeAZ,3emepartie,leparagraphe2.4)Ilfaut
imprativementremonterjusqu'latabledesclientsetraliserdesjointuresexternessurlestablesdesfacturesetdeslignesdefacture:
Exemple12

Slectionnez
SELECTC.CLI_ID,
SUM(LIF_QTE*LIF_MONTANT*

((1COALESCE(LIF_REMISE_POURCENT/100,0)))

COALESCE(LIF_REMISE_MONTANT,0))
ASCA
FROMT_CLIENTC
LEFTOUTERJOINT_FACTUREF
ONC.CLI_ID=F.CLI_ID
LEFTOUTERJOINT_LIGNE_FACTUREL
ONF.FAC_ID=L.FAC_ID
WHEREEXTRACT(YEARFROMF.FAC_DATE)=2000
GROUPBYC.CLI_ID
HAVINGSUM(LIF_QTE*LIF_MONTANT*

((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))<15000

Slectionnez
CLI_IDCA

114510.6
3712488.799999999999
3913327.4
4014785.200000000001
5213890.799999999999
6114168.799999999999
8714992.4

Oretpouraussibizarrequecelapuisseparatre,cetterequtenenousdonnetoujourspasleclient101...Pourquoi?Ilpersisteenfaitdeux
raisonscela:
1. nousavonssupposquelecalculduCAretournaitunevaleur...
2. nousavonsfiltrsurl'anne2000,aprsavoireffectulajointure.
Pourcontrerlecasn1,nousnedevonspasoublierquelesNULLsepropagentdanslescalculsetquelemarqueurNULLnepeuttre
compareaucunevaleur.IlfautdoncraliserlefitreHAVINGenretenantl'expressionsiellevautmoinsde15000maisaussisiellevaut
NULL.
Pourcontrerlecasn2,etc'estbeaucoupplussubtil,ilfautincluredanslaconditiondejointureentrelestablesT_CLIENTetT_FACTURE
l'expressionsituedanslaclauseWHERE.
Larequteainsicorrige,devient:
Exemple13

Slectionnez
SELECTC.CLI_ID,
SUM(LIF_QTE*LIF_MONTANT*

((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))ASCA
FROMT_CLIENTC
LEFTOUTERJOINT_FACTUREF
ONC.CLI_ID=F.CLI_ID
ANDEXTRACT(YEARFROMF.FAC_DATE)=2000
LEFTOUTERJOINT_LIGNE_FACTUREL
ONF.FAC_ID=L.FAC_ID
GROUPBYC.CLI_ID
HAVINGSUM(LIF_QTE*LIF_MONTANT*

((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))<15000
ORSUM(LIF_QTE*LIF_MONTANT*

((1COALESCE(LIF_REMISE_POURCENT/100,0)))
COALESCE(LIF_REMISE_MONTANT,0))ISNULL

Slectionnez
CLI_IDCA

114510.6
3712488.799999999999
3913327.4
4014785.200000000001
5213890.799999999999
6114168.799999999999
8714992.4
101NULL

NouspourrionsainsipasserencoreplusieurscasenrevuetantlemlangedesclausesWHEREetHAVINGassociesauxjointuresexternes
peutdevenirpassionnant,maiscesiten'apaspourbutdevousposerdespiges,maispluttdevousfairetoucherdudoigtlaproblmatique
decetypederequteetlelogiqueensemblistesousjacente.
Danslasuitedusiteetnotammentlorsquevousaborderezlessousrequtes,denouveauxexemplesutilisantlaclauseHAVINGetle
groupage,sontprsents.
3.Lesoprateursensemblistes

Voustrouverezdescomplmentsd'informationsurlesujetauxpages180187del'ouvrage"SQL",collection"LaRfrence",CampusPress
diteur.
C'estunedespartieslesplussimplesdel'ordreSELECT.Alafoisparsasyntaxemaisaussiparsacomprhensionfacile.Ils'agit,niplusni
moinsquederaliserdesoprationssurlesensemblesreprsentspardestablesoudesextraitsdetable.Lesoprationsensemblistesdu
SQLsontl'union,l'intersectionetlediffrence.

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

5/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes

3.1.L'UNION

Pourfaireuneunion,ilsuffitdedisposerdedeuxensemblesdedonnescompatiblesetd'utiliserlemotclefUNION.Lasyntaxeestalors:

Slectionnez
SELECT...
UNION
SELECT...

BienentenduilestindispensablequelesdeuxordresSELECT:
produisentunmmenombredecolonnes
quelestypesdedonnesdechaquepairesordonnesdecolonnessoientdemmetype(oud'untypequivalent)

3.2.L'INTERSECTION

Ladmarcheestlammepourfaireuneintersection,quepourlemcanismedel'union.LasyntaxeutilisantlemotclefINTERSECT:

Slectionnez
SELECT...
INTERSECT
SELECT...

Aveclesmmescontraintesd'ordresyntaxique.

3.3.LADIFFRENCE

Ladiffrencededeuxensembless'obtientdelammemanire,enutilisantlemotclefEXCEPT:

Slectionnez
SELECT...
EXCEPT
SELECT...

3.4.ConsidrationsdiversessurlesoprationsensemblistesduSQL
3.4.1.LemotclefALLpeutqualifierl'oprateurensembliste
ALLrcupreratouslesdoublonsdesensemblesconsidrs.
ATTENTION:l'oprateurpardfautopreleddoublonnagecontrairementlaclauseSELECTdel'ordreSELECT.
Ainsilorsquel'onvautiliserunetelleconstructionpourdesoprationscomptablercuprantdessommesfinanciresenutilisantl'oprateur
UNION,ondevraimprativementutiliserlemotclefALLsinonlessommesidentiquesdisparatrons.

3.4.2.Onpeutrestreindrel'intersectioncertainescolonnesenutilisantlefiltreCORRESPONDINGBY
Ainsionpourrarcuprerdanslersultatplusdecolonnesquecellesquioprentlavritableintersection.

3.4.3.LesoprateursUNIONetINTERSECTsontrflexifs,maisEXCEPTnel'estpas
Ainsil'ordredesrequtesdeslectionn'apasd'importancepourlesoprationsd'unionetd'intersection,maispourladiffrencecetordreest
essentieletnedonnepaslemmersultatencasdepermutation(c'estlapropredelasoustractionetdeladivision).

3.4.4.OnpeututiliserlaclauseORDERBY
LaclauseORDERBYdoittrelaclausefinale,carilnepeutyenavoirqu'une.

3.4.5.LenomdescolonnesdursultatestceluidupremierdesordresSELECTcomposantlaglobalitdela
requte
AutrementditsilesnomsdescolonnessontdiffrentsentrelesdiversordresSELECTs'enchainantavecdesoprateursensemblistes,ceuxqui
ontprpondrancesontceuxdescolonnesdelapremirerequteSELECT.

3.4.6.Mispartl'union,lesoprationsensemblistesd'intersectionetdediffrencepeuventtreconstruites
partirderequtesdebase
Exemples:
L'intersectionpeuttretabliepar:

Slectionnez
SELECTt1.col1,t1.col2FROMt1
INTERSECT
SELECTt2.col1,t2.col2FROMt2

Slectionnez

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

6/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
SELECTDISTINCTt1.col1,t1.col2
FROMt1
INNERJOINt2
ONt1.col1=t2.col1ANDt1.col2=t2.col2

Slectionnez
SELECTDISTINCTt1.col1,t1.col2
FROMt1
WHEREEXISTS(SELECT*
FROMt2
WHEREt1.col1=t2.col1ANDt1.col2=t2.col2)

Ladiffrencepeuttretabliepar:

Slectionnez
SELECTt1.col1,t1.col2FROMt1
EXCEPT
SELECTt2.col1,t2.col2FROMt2

Slectionnez
SELECTDISTINCTt1.col1,t1.col2
FROMt1
WHERENOTEXISTS(SELECT*
FROMt2
WHEREt1.col1=t2.col1ANDt1.col2=t2.col2)

Slectionnez
SELECTDISTINCTt1.col1,t1.col2
FROMt1
LEFTOUTERJOINt2
ONt1.col1=t2.col1ANDt1.col2=t2.col2
GROUPBYt1.col1,t1.col2
HAVINGCOUNT(t2.*)=0
t2.*tantn'importequellecolonnedet2

3.5.Quelquesexemples
Pourprsenterdesexemplessignificatifs,voicilejeudetestquenousallonsutiliser:

Slectionnez
CREATETABLET_OBJET
(OBJ_NOMCHAR(16),
OBJ_PRIXDECIMAL(16,2))
CREATETABLET_MACHINE
(MAC_NOMVARCHAR(20),
MAC_PRIXFLOAT(16),
MAC_REFCHAR(8))
INSERTINTOT_OBJET(OBJ_NOM,OBJ_PRIX)VALUES('MOTO',43528)
INSERTINTOT_OBJET(OBJ_NOM,OBJ_PRIX)VALUES('ASSIETTE',26.5)
INSERTINTOT_OBJET(OBJ_NOM,OBJ_PRIX)VALUES('LIVRE',128)
INSERTINTOT_OBJET(OBJ_NOM,OBJ_PRIX)VALUES('TABLE',5600)
INSERTINTOT_OBJET(OBJ_NOM,OBJ_PRIX)VALUES('PERCEUSE',259.99)
INSERTINTOT_MACHINE(MAC_NOM,MAC_PRIX,MAC_REF)VALUES('AVION',NULL,'A320')
INSERTINTOT_MACHINE(MAC_NOM,MAC_PRIX,MAC_REF)VALUES('VENTILATEUR',250,'VTL1200')
INSERTINTOT_MACHINE(MAC_NOM,MAC_PRIX,MAC_REF)VALUES('MOTO',43528,'YAMR1')
INSERTINTOT_MACHINE(MAC_NOM,MAC_PRIX,MAC_REF)VALUES('RVEIL',128,'LIPSTAR')
INSERTINTOT_MACHINE(MAC_NOM,MAC_PRIX,MAC_REF)VALUES('PERCEUSE',260,'BD450A')

3.5.1.Exempled'UNION
Commenonsparlabasiqueuniondesnomsdesobjetsetmachinesdenosdeuxtables:
Exemple14

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

7/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes

Slectionnez

Slectionnez
SELECTOBJ_NOM
FROMT_OBJET
UNION
SELECTMAC_NOM
FROMT_MACHINE

OBJ_NOM

AVION
RVEIL
VENTILATEUR
LIVRE
MOTO
ASSIETTE
PERCEUSE
TABLE

Remarquonsquelamoto,commelapereusenefigurentqu'uneseulefoisdanslersultat.Cedfautpeuttrecorrigparl'emploidumot
clefALL:
Exemple15

Slectionnez

Slectionnez
SELECTOBJ_NOM
FROMT_OBJET
UNIONALL
SELECTMAC_NOM
FROMT_MACHINE

OBJ_NOM

MOTO
ASSIETTE
LIVRE
TABLE
PERCEUSE
AVION
VENTILATEUR
MOTO
RVEIL
PERCEUSE

Voicisymbolisparundessin,leprincipedel'uniontelquedcritdanslesdeuxrequtesprcdentes:

uniondel'ensembledesnoms(OBJ_NOM+MAC_NOM)destablesOBJETetMACHINE

3.5.2.ExempledeDIFFRENCE
Ladiffrencedel'ensembledesnomsdesobjetsparrapportceluidesnomsdemachine,nousdonnera:
Exemple16

Slectionnez

Slectionnez

SELECTOBJ_NOM
FROMT_OBJET
EXCEPT
SELECTMAC_NOM
FROMT_MACHINE

OBJ_NOM

ASSIETTE
LIVRE
TABLE

Ellepeutaussitreexprimeenl'absenced'oprateurEXCEPT,par:
Exemple17

Slectionnez
SELECTOBJ_NOM
FROMT_OBJET
WHEREOBJ_NOMNOTIN(SELECTMAC_NOM
FROMT_MACHINE)

Slectionnez
OBJ_NOM

ASSIETTE
LIVRE
TABLE

Ouencore:
Exemple18

Slectionnez

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

Slectionnez

8/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
SELECTO.OBJ_NOM
FROMT_OBJETO
LEFTOUTERJOINT_MACHINEM
ONO.OBJ_NOM=M.MAC_NOM
GROUPBYO.OBJ_NOM
HAVINGCOUNT(M.MAC_NOM)=0

OBJ_NOM

ASSIETTE
LIVRE
TABLE

VoicilediagrammedeVenncorrespondantladiffrencetellequelesrequtesquenousvenons,l'exprime:

diffrenceentrelesnomsdesobjetsetceuxdesmachines

3.5.3.Exempled'INTERSECTION
Quandl'intersection,cellecin'estpasplusdifficile:
Exemple19

Slectionnez
SELECTOBJ_NOM
FROMT_OBJET
INTERSECT
SELECTMAC_NOM
FROMT_MACHINE

Slectionnez
OBJ_NOM

MOTO
PERCEUSE

Quel'onpeutexprimerparl'quivalencelogique:
Exemple20

Slectionnez

Slectionnez

SELECTOBJ_NOM
FROMT_OBJETO
JOINT_MACHINEM
ONO.OBJ_NOM=M.MAC_NOM

OBJ_NOM

MOTO
PERCEUSE

Ouencore:
Exemple21

Slectionnez

Slectionnez

SELECTOBJ_NOM
FROMT_OBJETO
WHEREOBJ_NOMIN(SELECTMAC_NOM
FROMT_MACHINE)

OBJ_NOM

MOTO
PERCEUSE

Etparundessinreprennantlesclbrespatates,leprincipedel'intersectiontelqu'exprimdcritdanslesrequtescidessus:

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

9/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
intersectiondel'ensembledesnoms(OBJ_NOM+MAC_NOM)destablesOBJETetMACHINE
Unpetitdernierexempleseraconsacrl'intersectionaveccorrespondance.Pourcelanousavonsbesoindemodifiernosdeuxtables(ouau
moinsl'uned'entreelles)defaonacequelesnomsdescolonnesdestablessoientidentiques.
Parexemple,notrenouveaujeudedonnespourraittre:

Slectionnez
CREATETABLET_OBJET2
(NOMCHAR(16),
PRIXDECIMAL(16,2))
CREATETABLET_MACHINE2
(NOMVARCHAR(20),
PRIXFLOAT(16),
REFCHAR(8))
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('MOTO',43528)
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('ASSIETTE',26.5)
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('LIVRE',128)
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('TABLE',5600)
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('PERCEUSE',259.99)
INSERTINTOT_OBJET2(NOM,PRIX)VALUES('ORDINATEUR',7000)
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('AVION',NULL,'A320')
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('VENTILATEUR',250,'VTL1200')
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('MOTO',43528,'YAMR1')
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('RVEIL',128,'LIPSTAR')
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('PERCEUSE',260,'BD450A')
INSERTINTOT_MACHINE2(NOM,PRIX,REF)VALUES('ORDINATEUR',7000,'PCPII1G')

Dslors,larequtesuivante:
Exemple22

Slectionnez

Slectionnez

SELECT*
FROMT_OBJET
INTERSECTCORRESPONDING
SELECT*
FROMT_MACHINE

NOMPRIX

MOTO43528
ORDINATEUR7000

LemotclefCORRESPONDINGsecomporteunpeulamanireduNATURALJOINetdesonmotclefUSING,c'estdirequ'enleprcisant,
SQLvachercherlacorrepondancedescolonnesparleurposition,nomettype.
Onpeutenoutreprcisersurquellescolonneslacorrespondancevaporter,l'aidedumotclefBY:
Exemple23

Slectionnez

Slectionnez

SELECT*
FROMT_OBJET
INTERSECTCORRESPONDINGBY(NOM)
SELECT*
FROMT_MACHINE

NOM

MOTO
ORDINATEUR
PERCEUSE

Anoterquel'usagedumotclefCORRESPONDING[BY(listedecolonne)]estacceptdansl'intersectioncommedansl'union.Cependant,rare
sontlesmoteursSQLal'accepter!
4.Rsum
Voicilesdiffrencesentrelesmoteursdesbasesdedonnes:

Paradox

Access

Sybase

SQLServer

Oracle

GROUPBY

Oui

Oui

Oui

Oui

Oui

HAVING

Oui

Oui

Oui

Oui

Oui

UNION

Oui

Oui

Oui

Oui

Oui

INTERSECT

Non

Non

Non

Non

EXCEPT

Non

Non

Non

Non

MINUS

CORRESPONDINGBY

Non

Non

Non

Non

Non

Livres
SQLdveloppement
SQLlecoursderfrencesurlelangageSQL
Avantd'aborderleSQL
Dfinitions
SGBDRfichierouclient/serveur?
Labasededonnesexemple(gestiond'unhtel)
ModlisationMERISE
MotsrservsduSQL
LeSQLdeAZ
Lesfondements
Lesimple(?)SELECT
Lesjointures,oucommentinterrogerplusieurstables
Groupages,ensemblesetsousensembles
Lessousrequtes
Insrer,modifier,supprimer
Crationdesbases

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

10/11

16/2/2015

LeSQLdeAZgroupage,sousensemblesetoprateursensemblistes
Grerlesprivilges("droits")
TouteslesfonctionsdeSQL
LestechniquesdesSGBDR
LeserreurlesplusfrquentesenSQL
LespetitspapiersdeSQLPro
ConfrenceBorland2003
L'hritagedesdonnes
Donnesetnormes
Modlisationparmtadonnes
OptimisezvotreSGBDRetvosrequtesSQL
Letemps,samesure,sescalculs
QBE,lelangagedeZLOOF
Desimagesdansmabase
Lajointuremanquante
Clefsautoincrmentes
L'indexationtextuelle
L'artdes"Soundex"
Uneseulecolonne,plusieursdonnes
Ladivisionrelationnelle,mytheouralit?
Gestiond'arborescenceenSQL
L'avenirdeSQL
Mthodesetstandards
Lesdoublons
SQLServer
Eviterlescurseurs
UnaperudeTRANSACTSQLV2000
SQLServer2000etlescollations
ScurisationdesaccsauxbasesdedonnesSQLServer
DesUDFpourSQLServer
SQLServeretlefichierdelog...
Paradox
Devieuxarticlespublisentre1995et1999dansladfunterevuePointDBF

Copyright2003FrdricBrouard.Aucunereproduction,mmepartielle,nepeuttrefaitedecesiteetdel'ensembledesoncontenu:textes,documents,images,etc.sansl'autorisationexpresse
del'auteur.Sinonvousencourezselonlaloijusqu'troisansdeprisonetjusqu'300000dedommagesetintrts.

ResponsablebnvoledelarubriqueSGBD&SQL:FrancisWalterContacterparemail

Developpez.com
Nouscontacter
Participez
Informationslgales

Services
ForumSGBD&SQL
Blogs
Hbergement

Partenaires

PlanetHoster

Copyright20002015www.developpez.com

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

11/11

S-ar putea să vă placă și