Documente Academic
Documente Profesional
Documente Cultură
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