Académique Documents
Professionnel Documents
Culture Documents
LeSQLdeAZleSELECTsurplusieurstables
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:3epartielesjointures
DansleprcdentarticlenousavonscommencerdcortiquerlesimpleSELECT.Dansleprsent,nousallonsnousconsacrerauxjointures
entretables.Touteslesjointuressoustouteslescoutres!
Autrementditcommentfairedesrequtesportantsurplusieurstables.
Articlelu346871fois.
L'auteur
SQLPro
L'article
Publile22avril2004Misjourle12juillet2008
I.Prambule
ePub,AzwetMobi
Lastructuredelabasededonnesexemple,ainsiqu'uneversiondesprincipalesbasesutilisessontdisponiblesdanslapage"Labasede
Lienssociaux
donnesexemple"
II.Lesjointuresoucommentfairedesrequtessurplusieurstables
Voustrouverezdescomplmentsd'informationsurlesujetauxpages129152del'ouvrage"SQL",collection"LaRfrence",CampusPress
diteur.
Lesjointurespermettentd'exploiterpleinementlemodlerelationneldestablesd'unebasededonnes.
Ellesontfaitespourmettreenrelationdeux(ouplus)tablesconcourantrechercherlarponsedesinterrogations.Unejointurepermet
doncdecombinerlescolonnesdeplusieurstables.
Ilexisteenfaitdiffrentesnaturesdejointuresquenousexpliciteronsplusendtail.Retenezcependantquelaplupartdesjointuresentre
tabless'effectuentenimposantl'galitdesvaleursd'unecolonned'unetableunecolonned'uneautretable.Onparlealorsdejointure
naturelleouquijointure.Maisontrouveaussidesjointuresd'unetablesurellemme.Onparlealorsd'autojointure.
Demme,ilarrivequel'ondoiveprocderdesjointuresexterne,c'estdirejoindreunetableuneautre,mmesilavaleurdeliaisonest
absentedansunetableoul'autre.Enfin,dansquelquescas,onpeutprocderdesjointureshtrognes,c'estdirequel'onremplacele
critred'galitparuncritred'ingalitoudediffrence.
Nousverronsaumoinsuncasdecetteespce.
Unejointureentretablespeuttremiseenoeuvre,soitl'aidedeslmentsdesyntaxeSQLquenousavonsdjvu,soitl'aided'une
clausespcifiqueduSQL,laclauseJOIN.Nousallonscommencerparvoircommentl'aideduSQLdebasenouspouvonsexprimerune
jointure.
IIA.Premiersessaisdejointure
RappeldelasyntaxeduSELECT:
Slectionnez
SELECT[DISTINCTouALL]*ouliste_de_colonnesFROMnom_des_tables_ou_des_vues
C'esticileplurieldelapartieFROMquichangetout!
Tchonsdoncdercuprerlesndestlphonesassocisauxclients.
Exemple1:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENT,T_TELEPHONE
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
DUPONT0611867889
DUPONT0241588952
DUPONT0151585250
DUPONT0154114321
DUPONT0655414295
DUPONT0148989221
DUPONT0144225621
...
Cetterequtenepossdepasdecritredejointureentreunetableetl'autre.Danscecas,lecompilateurSQLcalculeleproduitcartsiendes
deuxensembles,c'estdirequ'chaquelignedelapremiretable,ilaccolel'ensembledeslignesdelasecondelamanired'une
"multiplicationdespetitspains"!
Nousverronsqu'ilexisteuneautremanire,normalisecettefois,degnrerceproduitcartsien.Maiscetterequteestproscrire.
Dansnotreexempleellegnre17400lignes!
Ilfautdoncdfinirabsolumentuncritredejointure.
http://sqlpro.developpez.com/cours/sqlaz/jointures/
1/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
Danslecasprsent,cecritreestlacorrespondanceentrelescolonnescontenantlarfrencedel'identifiantduclient(CLI_ID).
Exemple2:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENT,T_TELEPHONE
WHERECLI_ID=CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
DUPONT0611867889
DUPONT0241588952
DUPONT0151585250
DUPONT0154114321
DUPONT0655414295
DUPONT0148989221
DUPONT0144225621
...
Nousn'avonspasfaitmieux,carnousavonscruneclausetoujoursvraie,unpeulamanirede1=1!
Enfaitilnousmanqueuneprcision:ils'agitdedterminerdequellestablesproviennentlescolonnesCLI_IDdedroiteetdegauche.Celase
prcisel'aided'unenotationpointeendonnantlenomdelatable.
Ilestdoncncessaired'indiqueraucompilateurlaprovenancedechacunedescolonnesCLI_IDetdoncd'oprerunedistinctionentrel'uneet
l'autrecolonne.
Ainsi,chaquecolonnedevratreprcdedunomdelatable,suivid'unpoint.
Exemple3:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENT,T_TELEPHONE
WHERET_CLIENT.CLI_ID=T_TELEPHONE.CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOUVIER0655414295
MARTIN0148989221
MARTIN0144225621
...
Ontombeici174enregistrementsdanslatable!
Maisilexisteuneautrefaondefaire,plussimpleencore.Onutiliselatechniquedu"surnommage",c'estdirequel'onattribueunsurnom
chacunedestablesprsentedanslapartieFROMduSELECT:
Exemple4:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC,T_TELEPHONET
WHEREC.CLI_ID=T.CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOUVIER0655414295
MARTIN0148989221
MARTIN0144225621
...
Ici,latableT_CLIENTatsurnomme"C"etlatableT_TELEPHONE"T".
Bienentendu,etcommedanslesrequtesmonotabulairesonpeutposerdesconditionssupplmentairesdefiltragedanslaclauseWHERE.
Cherchonsparexemplelesclientsdontlesnumrosdetlphonecorrespondentunfax:
Exemple5:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC,T_TELEPHONET
WHEREC.CLI_ID=T.CLI_ID
ANDTYP_CODE='FAX'
http://sqlpro.developpez.com/cours/sqlaz/jointures/
CLI_NOMTEL_NUMERO
DUPONT0144285250
MARTIN0144225621
DUHAMEL0154114389
DUPONT0559457242
MARTIN0147662955
DUBOIS0466629564
DREYFUS0492191858
DUHAMEL0155609381
PHILIPPE0148448619
DAUMIER0148281795
...
2/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
Lefaitdeplacercommecritredejointureentrelestables,l'oprateurlogique"gal"donnecequel'onapelleune"quijointure".
Commevouspouvezleconstater,lenomduclient"BOUVIER"n'apparatpas.Iln'apast"oubli"parletraitementdelarequte,maisle
numrodefaxdececlientn'estpasprsentdanslatableT_TELEPHONE.OrlemoteurSQLrecherchelesvaleursdelajointurepargalit.
Commel'ID_CLIde"BOUVIER"n'estpasprsentdanslatableT_TELEPHONE,ilnepeuteffectuerlajointureetignoredonccetteligne.Nous
verronscommentrparercettelacunelorsquenousparleronsdesjointuresexternes.
OnpeutaussiutiliserlessurnomsdanslapartiequisuitimmdiatementlemotclefSELECT.Ainsil'exemple4,peutaussis'crire:
Exemple6:
Slectionnez
Slectionnez
SELECTC.CLI_ID,C.CLI_NOM,T.TEL_NUMERO
FROMT_CLIENTC,T_TELEPHONET
WHEREC.CLI_ID=T.CLI_ID
ANDT.TYP_CODE='FAX'
CLI_IDCLI_NOMTEL_NUMERO
1DUPONT0144285250
10MARTIN0144225621
8DUHAMEL0154114389
1DUPONT0559457242
2MARTIN0147662955
4DUBOIS0466629564
5DREYFUS0492191858
8DUHAMEL0155609381
13PHILIPPE0148448619
15DAUMIER0148281795
...
C'estparticulirementpratiquelorsquel'onveutrcuprerunecolonnequiseretrouvedanslesdeuxtables,cequiestsouventlecasdela
(oules)colonne(s)decleftrangrequipermetjustementd'assurerlajointure.
Pourjoindreplusieurstables,onpeututiliserlemmeprocessusdemanirerptitive...
Exemple7:
Slectionnez
SELECTC.CLI_ID,C.CLI_NOM,T.TEL_NUMERO,E.EML_ADRESSE,A.ADR_VILLE
FROMT_CLIENTC,T_TELEPHONET,T_ADRESSEA,T_EMAILE
WHEREC.CLI_ID=T.CLI_ID
ANDC.CLI_ID=A.CLI_ID
ANDC.CLI_ID=E.CLI_ID
Slectionnez
CLI_IDCLI_NOMTEL_NUMEROEML_ADRESSEADR_VILLE
1DUPONT0145425663alain.dupont@wanadoo.frVERSAILLES
1DUPONT0559457242alain.dupont@wanadoo.frVERSAILLES
1DUPONT0559457224alain.dupont@wanadoo.frVERSAILLES
1DUPONT0144285250alain.dupont@wanadoo.frVERSAILLES
1DUPONT0144285252alain.dupont@wanadoo.frVERSAILLES
2MARTIN0147662929mmartin@transports_martin_fils.frVERGNOLLESCEDEX452
2MARTIN0147662955mmartin@transports_martin_fils.frVERGNOLLESCEDEX452
2MARTIN0147662929plongeur@aol.comVERGNOLLESCEDEX452
2MARTIN0147662955plongeur@aol.comVERGNOLLESCEDEX452
5DREYFUS0492191858pdreyfus@clubinternet.frPARIS
...
Demmequenousl'avonsvudansl'exemple2.4,nesontvisibleiciqueleslignesclientsayantlafois,aumoinsuneadresse,unemailet
aumoinsunnumrodetlphone.Sinousavionsvouluunelistecompltedesclientsavectouteslescoordonnesdisponibles,nousaurions
dufaireunerequteexternesurlestables.
IIB.Diffrentstypedejointures(naturelles,qui,nonequi,auto,externes,
htrognes,croiseetunion)
Lorsquenoustudionslemodlerelationneldenotrebasededonnesexemplenousavonsvuquelemodlephysiquedesdonnes,rpercute
lesclefsdestablesmatresentantqueclefstrangresdestablespourlesquellesunejointureestncessaire.Enutilisantlajointureentre
clefsprimairesetclefssecondairesbasesurl'galitdesvaleursdescolonnesnousexcutonscequelesprofessionnelsduSQLappelleune
jointurenaturelle.
Ilestaussipossibledefairedesquijointuresquinesontpasnaturelles,soitparaccident(uneerreur!),soitparncessit.
Ilestaussipossibledefairedesnonquijointures,c'estdiredesjointuresbasesuruncritrediffrentdel'galit,maisaussidesauto
jointures,c'estdiredejoindrelatablesurellemme.Lecasleplusdlicatcomprendreestceluidesjointuresexternes,c'estdire
exigerquelersultatcomprennetoutesleslignesdestables(oud'aumoinsunedestablesdelajointure),mmes'iln'yapas
correspondancedeslignesentrelesdiffrentestablesmiseenoeuvredanslajointure.
Lajointured'unionconsisteajoutertouteslesdonnesdesdeuxtablesconditionqu'ellessoientcompatiblesdansleursstructures.
Lajointurecroisepermetdefaireleproduitcartsiendestables.
Enfinonpeuteffectuerdesrequteshtrognes,c'estdiredejoindreunetabled'unebasededonnes,uneouplusieursautresbasede
donnesventuellementmmesurdesserveursdiffrents,voiremmesurdesserveursdediffrentstypes(parexemplejoindreunetable
T_CLIENTdelabaseBD_COMMANDEd'unserveurOraclelatableT_PROSPECTdelabaseBD_COMMERCIALd'unserveurSybase!).
Danslamesuredupossible,utiliseztoujoursunoprateurdejointurenormalisSql2(motclefJOIN).
Eneffet:
LesjointuresfaitesdanslaclauseWHERE(anciennesyntaxede1986!)nepermettentpasdefaireladistinctiondeprimeabordentre
cequirelvedufiltrageetcequirelvedelajointure.
IlestprioriabsurdedevouloirfiltrerdansleWHERE(cequirestreintlesdonnesdursultat)etdevouloir"largir"cersultatpar
unejointuredanslammeclauseWHEREdefiltrage.
LalisibilitdesrequtesestplusgrandeenutilisantlasyntaxebasedeJOIN,enisolantcequiestdufiltrageetdelajointure,mais
aussienisolantavecclartchaqueconditiondejointuresentrechaquecouplesdetable.
L'optimisationd'excutiondelarequteestsouventpluspointuedufaitdel'utilisationduJOIN.
Lorsquel'onutilisel'anciennesyntaxeetquel'onsupprimelaclauseWHEREdesfinsdetests,lemoteurSQLraliseleproduit
cartsiensdestablescequirevientlaplupartdutempsmettregenouxleserveur!
http://sqlpro.developpez.com/cours/sqlaz/jointures/
3/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
III.Syntaxenormalisedesjointures
Voustrouverezdescomplmentsd'informationsurlesujetauxpages136152del'ouvrage"SQL",collection"LaRfrence",CampusPress
diteur.
Lesjointuresnormalisess'exprimentl'aidedumotclefJOINdanslaclauseFROM.Suivantlanaturedelajointure,ondevraprcisersur
quelscritressebaselajointure.
Voiciuntableaursumantlesdiffrentstypesdejointuresnormalises:
Slectionnez
Jointure
SELECT...
interne
FROM<tablegauche>
[INNER]JOIN<tabledroite>
ON<conditiondejointure>
Slectionnez
Jointure
SELECT...
externe
FROM<tablegauche>
LEFT|RIGHT|FULLOUTERJOIN<tabledroite>
ONconditiondejointure
Slectionnez
Jointure
SELECT...
naturelle
FROM<tablegauche>
NATURALJOIN<tabledroite>
[USING<nomsdecolonnes>]
Slectionnez
Jointure
croise SELECT...
FROM<tablegauche>
CROSSJOIN<tabledroite>
Slectionnez
Jointure
d'union SELECT...
FROM<tablegauche>
UNIONJOIN<tabledroite>
Nousallonsdcrireendtailtoutescesjointures.
IIIA.Oprateurdejointurenaturelle
IlexisteunoprateurnormalispoureffectuenSQLlajointurenaturelledestables:
Slectionnez
SELECT[DISTINCTouALL]*oulistedecolonnes
FROMtable1NATURALJOINtable2[USING(colonne1[,colonne2...])]
L'oprateurNATURALJOINpermetd'viterdeprciserlescolonnesconcernesparlajointure.
Danscecas,lecompilateurSQLvarechercherdansles2tables,lescolonnesdontlenomestidentique.Bienentendu,letypededonnesdoit
trelemme!
NOTA:onveilleraauniveaudelamodlisationetnotammentauniveauduMPD(ModlePhysiquedeDonnes)quelesnomsdescolonnesde
clefsenrelationavecd'autrestablesparl'intermdiairesdesclefstrangressoientstrictementidentiques.
Exemple8:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTNATURALJOINT_TELEPHONE
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOUVIER0655414295
MARTIN0148989221
MARTIN0144225621
...
MaiscettesyntaxeestrarementaccepteparlesmoteursSQLactuels!
http://sqlpro.developpez.com/cours/sqlaz/jointures/
4/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
LapartieoptionnelleUSINGpermetderestreindrelescolonnesconcernes,lorsqueplusieurscolonnesserventdfinirlajointurenaturelle.
AinsilacommandeSQL:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENT
NATURALJOINT_TELEPHONE
USING(CLI_ID)
RevientaummequelacommandeSQLdel'exemple8.
IIIB.Lesjointuresinternes
Commeils'agitdelapluscommunedesjointuresc'estcellequis'exercepardfautsionneprcisepasletypedejointure.Aprslemotclef
ONondoitprciserlecritredejointure.
Reprenonsnotreexemplededpart:
Exemple9:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENT
INNERJOINT_TELEPHONE
ONT_CLIENT.CLI_ID=T_TELEPHONE.CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOUVIER0655414295
MARTIN0148989221
MARTIN0144225621
...
Ouenutilisantlesurnommage:
Exemple10:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
INNERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOUVIER0655414295
MARTIN0148989221
MARTIN0144225621
...
Pluspratiquecrireetaussilisiblesinonplus!
NOTA:lemotclefINNERestfacultatif.Pardfautl'absencedeprcisiondelanaturedelajointurelafaits'excuterenjointureinterne.
Ainsionpeutreformulerlerequtecidessusen:
Exemple11:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
JOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
CLI_NOMTEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOYER0655414295
MARTIN0148989221
MARTIN0144225621
...
IIIC.Lesjointuresexternes
Lesjointuresexternessontextrmementpratiquespourrapatrierlemaximumd'informationsdisponible,mmesideslignesdetablenesont
pasrenseignesentrelesdiffrentestablesjointes.
Procdonsl'aided'unexemplepourmieuxcomprendreladiffrenceentreunejointureinterneetunejointureexterne.Nousavonsvu
http://sqlpro.developpez.com/cours/sqlaz/jointures/
5/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
l'exemple9queseullesclientsdotsd'unnumrodetlphonetaientrpertorisdanslarponse.Ainsi,leclient"BOUVIER"taitabsent.
Exemple12:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
INNERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
CLI_NOMTEL_NUMERO
DUPONT0144285250
MARTIN0144225621
DUHAMEL0154114389
DUPONT0559457242
MARTIN0147662955
DUBOIS0466629564
DREYFUS0492191858
DUHAMEL0155609381
PHILIPPE0148448619
DAUMIER0148281795
...
Quefautilmodifierdanslarequtepourobteniruneligne"BOUVIER"avecaucunerfrencedetlphoneassociedanslarponse?
Ilsuffitenfaitd'oprerl'aided'unejointureexterne:
Exemple13:
Slectionnez
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
LEFTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'ORTYP_CODEISNULL
CLI_NOMTEL_NUMERO
DUPONT0144285250
DUPONT0559457242
MARTIN0147662955
BOUVIERNULL
DUBOIS0466629564
DREYFUS0492191858
FAURENULL
LACOMBENULL
DUHAMEL0154114389
DUHAMEL0155609381
...
ouencore:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
LEFTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_IDANDTYP_CODEISNULL
Lasyntaxedelajointureexterneestlasuivante:
Slectionnez
SELECT...
FROM<tablegauche>
LEFT|RIGHT|FULLOUTERJOIN<tabledroite1>
ON<conditiondejointure>
[LEFT|RIGHT|FULLOUTERJOIN<tabledroite2>
ON<conditiondejointure2>]
...
LesmotsclefsLEFT,RIGHTetFULLindiquentlamaniredontlemoteurderequtedoiteffectuerlajointureexterne.Ilfontrfrencela
tablesituegauche(LEFT)dumotclefJOINoulatablesituedroite(RIGHT)decemmemotclef.LemotFULLindiquequela
jointureexterneestbilatrale.
Slectionnez
SELECTcolonnes
FROMTGaucheLEFTOUTERJOINTDroiteONconditiondejointure
Onrecherchetouteslesvaleurssatisfaisantlaconditiondejointureprcisedansprdicat,puisonrajoutetoutesleslignesdelatable
TGauchequin'ontpastprisesencompteautitredelasatisfactionducritre.
Slectionnez
SELECTcolonnes
FROMTGaucheRIGHTOUTERJOINTDroiteONconditiondejointure
Onrecherchetouteslesvaleurssatisfaisantlaconditiondejointureprcisedansprdicat,puisonrajoutetoutesleslignesdelatable
TDroitequin'ontpastprisesencompteautitredelasatisfactionducritre.
Slectionnez
SELECTcolonnes
FROMTGaucheFULLOUTERJOINTDroiteONconditiondejointure
Onrecherchetouteslesvaleurssatisfaisantlaconditiondejointureprcisedansprdicat,puisonrajoutetoutesleslignesdelatable
TGaucheetTDroitequin'ontpastprisesencompteautitredelasatisfactionducritre.
http://sqlpro.developpez.com/cours/sqlaz/jointures/
6/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
NOTA:ilexistedesquivalencesentrediffrentesexpressionslogiquesbasedejointuresexternes.Lesprincipalessont:
lajointureexternedroitepeuttreobtenueparunejointureexternegauchedanslaquelleoninversel'ordredestables.
lajointureexternebilatralepeuttreobtenueparlacombinaisondedeuxjointuresexternesunilatralesavecl'oprateurensemblistes
UNION.
Remplacementd'unejointureexternedroiteparunejointureexternegauche.
L'quivalentlogiquede:
Exemple14:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
RIGHTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
est:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_TELEPHONET
LEFTOUTERJOINT_CLIENTC
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
Remplacementd'unFULLOUTERJOINavecjointuresexternesgaucheetdroite:
L'quivalentlogiquede...
Exemple15:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
FULLOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
est:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
LEFTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
UNION
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
RIGTHOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
Remplacementd'unFULLOUTERJOINavecjointuresexternesgaucheuniquement:
L'quivalentlogiquede...
Exemple16:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
FULLOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
est:
Slectionnez
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
LEFTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
UNION
SELECTCLI_NOM,TEL_NUMERO
FROMT_TELEPHONET
LEFTOUTERJOINT_CLIENTC
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
IIID.Diffrenceentrejointureexterneetjointureinterne
Pourbiencomprendreladistinctionentrelesjointuresinternesetexternes,nousdevonsconsacrerquelquesinstantsaborderdesproblmes
delogiqueensemblistesousunoeilpragmatique.
http://sqlpro.developpez.com/cours/sqlaz/jointures/
7/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
IIID1.L'hypothsedumondeclos
Lesjointuresexternessontextrmementpratiquespourrapatrierlemaximumd'informationsdisponible,mmesideslignesdetablenesont
pasrenseignesentrelesdiffrentestablesjointes.
Sanslesavoir,nousfaisonsassezsystmatiquementl'hypothsedumondeclos.c'estdirequenousconsidronsquel'absence
d'information,n'estpasuneinformation.Sivousdemandezunesecrtairedevouscommuniquerlescoordonnesdesclientsquisont
domicilisParis,ellevousdonneraunelisteofigureraautantdefoislenom"Paris"qu'ilyadeclientsdanslaliste,etceciparatbien
normal!Saufque,commel'auraitfaittoutunchacun,votresecrtaireafaitl'hypothsedumondeclossanslesavoirenprsumantqueles
clientspourlesquelsl'adressen'estpasrenseignenesontpasdomicilisPARIS!
C'estcelal'hypothsedumondeclos:considrerquel'absenced'informationdoittresynonymedecritredediscrimination...Lajointure
externepermetdecontrerl'hypothsedumondeclosenconsidrantqu'encasd'absencedejointureentreunetableetl'autre,onne
supprimeparpourautantl'information.
IIID2.Mcanismeenjeu
Lorsqu'uneligned'unetablefigurantdansunejointuren'apasdecorrespondancedanslesautrestables,lecritred'quijointuren'estpas
satisfaitetlaligneestrejete.C'estlajointureinterne.Aucontraire,lajointureexternepermetdefairefigurerdanslersultatleslignes
satisfaisantlaconditiond'quijointureainsiquecellesn'ayantpasdecorrespondances.
Ainsi,sijeveuxcontactertousmesclients,quelquesoitlemodedecontactquejeveuxutiliserdanslecadred'unecampagnepublicitaire,j'ai
intrtobtenirunerponsecontenanttouslesclients,mmeceuxquin'ontpasdetlphone,d'emailoud'adresse.
Exemple17:
Slectionnez
SELECTCLI_ID,CLI_NOM,TYP_CODE||':'||TEL_NUMEROASTEL_CONTACT,EML_ADRESSE,ADR_VILLE
FROMT_CLIENTC
LEFTOUTERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
LEFTOUTERJOINT_EMAILE
ONC.CLI_ID=E.CLI_ID
LEFTOUTERJOINT_ADRESSEA
ONC.CLI_ID=A.CLI_ID
Slectionnez
CLI_IDCLI_NOMTEL_CONTACTEML_ADRESSEADR_VILLE
1DUPONT0145425663alain.dupont@wanadoo.frVERSAILLES
1DUPONT0559457242alain.dupont@wanadoo.frVERSAILLES
1DUPONT0559457224alain.dupont@wanadoo.frVERSAILLES
1DUPONT0144285250alain.dupont@wanadoo.frVERSAILLES
1DUPONT0144285252alain.dupont@wanadoo.frVERSAILLES
2MARTIN0147662929mmartin@transports_martin_fils.frVERGNOLLESCEDEX452
2MARTIN0147662955mmartin@transports_martin_fils.frVERGNOLLESCEDEX452
2MARTIN0147662929plongeur@aol.comVERGNOLLESCEDEX452
2MARTIN0147662955plongeur@aol.comVERGNOLLESCEDEX452
3BOUVIERGSM:0611867889NULLMONTMAIZIN
...
NOTA:SurcertainsmoteursSQLlajointurebilatraleexterne(FULLOUTERJOIN)s'exprime:
Slectionnez
SELECTcolonnes
FROMTGaucheFULLJOINTDroiteONconditiondejointure
D'anciennessyntaxespermettentdefairedesjointuresexternesunilatrale.Parexemple,iln'estpasrarederencontrerlessyntaxes
suivantes:
Slectionnez
SELECTcolonnes
FROMtable_1t1,table_2t2
WHEREt1.id1*=t2.id2
ouencore:
Slectionnez
SELECTcolonnes
FROMtable_1t1,table_2t2
WHEREt1.id1(+)=t2.id2
EllessontbienvidemmentproscriresilasyntaxeSQL2estdisponible!
IIID3.Discussionsurlajointureexterne
Lajointureexterneestrarementbiencomprisedupremiercoup.Sijevousproposedelirecettediscussionquiaetlieusurunforum
Internet,c'estparcequellepermetdemieuxlacomprendre.
Slectionnez
http://sqlpro.developpez.com/cours/sqlaz/jointures/
8/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
Objet:OptimisationJointure
Date:26Dec200211:54:07+0100
De:LaurentMoreau
Bonjouratous,
JemeposeunepetitequestiondesyntaxeSQLsurlesjointures.
EtcommeFrdricvasurementmerpondre,jeprendunexempledesonsite.
Yatilunesyntaxemeilleurequel'autre(siouipourquoi)?
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
INNERJOINT_TELEPHONET
ONC.CLI_ID=T.CLI_ID
WHERETYP_CODE='FAX'
SELECTCLI_NOM,TEL_NUMERO
FROMT_CLIENTC
INNERJOINT_TELEPHONET
ON(C.CLI_ID=T.CLI_IDANDT.TYP_CODE='FAX')
Merci,
Slectionnez
Date:26Dec200214:20:390800
De:MedBouchenafa
Auniveauperformance,iln'yaaucunediffrence,l'optimiseurde
SQL/Servercontruitlemmeplan
Parcontre,auniveauconceptuelilestinteressantdediffrenciercequi
appartientlajointureetcequiappartientlalimitationdujeude
rsultat
Celafacilitelamaintenanceetlalecturedusource
[...]
Slectionnez
Date:26Dec200216:31:14+0100
De:FrdricBROUARD
Pourcomprendeladiffrenceentreleprdicatdelaclausedejointure
etleprdicatdufiltreWHERE,jevousproposelepetittestsuivant:
testdejointure
CREATETABLETEST_JOIN1
(COL1INT,
COL2CHAR(2))
CREATETABLETEST_JOIN2
(COL1INT,
COL2CHAR(2))
INSERTINTOTEST_JOIN1VALUES(101,'AA')
INSERTINTOTEST_JOIN1VALUES(102,'AA')
INSERTINTOTEST_JOIN1VALUES(103,'BB')
INSERTINTOTEST_JOIN2VALUES(101,'AA')
INSERTINTOTEST_JOIN2VALUES(102,'AA')
INSERTINTOTEST_JOIN2VALUES(201,'BB')
quivalente???Enapparenceseulement!
SELECTTJ1.COL1,TJ1.COL2
FROMTEST_JOIN1TJ1
JOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1
WHERETJ1.COL2='AA'
SELECTTJ1.COL1,TJ1.COL2
FROMTEST_JOIN1TJ1
JOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1ANDTJ1.COL2='AA'
d'accord...mmersultat!!!
changeonslelieninterneenlienexterne...
SELECTTJ1.COL1,TJ1.COL2
FROMTEST_JOIN1TJ1
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1
WHERETJ1.COL2='AA'
SELECTTJ1.COL1,TJ1.COL2
FROMTEST_JOIN1TJ1
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1ANDTJ1.COL2='AA'
pasd'acord!!!rsultatdiffrend...
POURQUOI???
jevouslaissemditerlachose!
Slectionnez
Date:26Dec200216:55:13+0100
De:LionelPnuchot
SalutFred,
Tupeuxalorsm'expliquerpourquoicetterequterenvoielemmersultatquetadernire?
SELECTTJ1.COL1,TJ1.COL2
FROMTEST_JOIN1TJ1
http://sqlpro.developpez.com/cours/sqlaz/jointures/
9/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1ANDTJ1.COL2='taratata'and1=0
Cordialement
Slectionnez
Date:27Dec200210:17:10+0100
De:FrdricBROUARD
LaclauseWHEREestunfiltred'limination.Ilsupposequeles
diffrentestablessontdjjointesenuneseuleetparcoure
l'ensembledesrsultatslarecherchedeslignescorrespondantaux
critresdonns.
EnrevanchelaclauseJOINsecomportediffremment.ElleagitAVANT
quelajointuresoiteffective.
Danslecadred'unejointureINTERNElecomportementestsimilaire
celuid'uneclauseWHERE.
Danslecasd'unejointureexterneilfautdcomposerlalogiqueen
plusieurstapes:
1)valuationdeslmentsduprdicat
2)applicationdelajointure:lignesjointeen1)
+lignessanscorrespondance
ReprennonslaclausedejointuredelarequtedonneparLaurent:
TJ1.COL1=TJ2.COL1ANDTJ1.COL2='taratata'and1=0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
prdicatdejointureprdicatshorsjointure
11=0=>aucunelignen'estrcupre
doncaucunelignedeTEST_JOIN1n'adecorrespondanceavecTEST_JOIN2
conclusion:toutesleslignesdeTEST_JOIN1serontreprisesdufait
delajointureexterne
2TJ1.COL2='taratata'=>encoreunefoisaucunelignen'estrcupre
doncaucunelignedeTEST_JOIN1n'adecorrespondanceavecTEST_JOIN2
conclusion:toutesleslignesdeTEST_JOIN1serontreprisesdufait
delajointureexterne
3TJ1.COL1=TJ2.COL1=>2lignessontencorrespondanceavecTEST_JOIN2
conclusion,cesdeuxlignesserontrcupresdufaitdelajointure
externeetla3emeligneaussipuisqu'ellen'aaucunecorrespondance
???
Pourcomprendreladiffrence,ilsuffitdedemandervoirlescolonnes
delatableTEST_JOIN2danslesdiffrentscas:
SELECTTJ1.COL1,TJ1.COL2,TJ2.COL1,TJ2.COL2
FROMTEST_JOIN1TJ1
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1ANDTJ1.COL2='AA'
COL1COL2COL1COL2
101AA101AA
102AA102AA
103BBNULLNULL
SELECTTJ1.COL1,TJ1.COL2,TJ2.COL1,TJ2.COL2
FROMTEST_JOIN1TJ1
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1
WHERETJ1.COL2='AA'
COL1COL2COL1COL2
101AA101AA
102AA102AA
SELECTTJ1.COL1,TJ1.COL2,TJ2.COL1,TJ2.COL2
FROMTEST_JOIN1TJ1
LEFTOUTERJOINTEST_JOIN2TJ2
ONTJ1.COL1=TJ2.COL1ANDTJ1.COL2='taratata'and1=0
COL1COL2COL1COL2
101AANULLNULL
102AANULLNULL
103BBNULLNULL
etvoil!
IIIE.Lajointurecroise
Lajointurecroisen'estautrequeleproduitcartsiendedeuxtables.Rappelonsqueleproduitcartsiendedeuxensemblesn'estautrequela
multiplicationgnralise.Danslecasdestables,c'estlefaitd'associerchacunedeslignesdelapremiretable,toutesleslignesdela
seconde.Ainsi,silapremiretablecompte267lignesetlaseconde1214,onseretrouveavecunrsultatcontenant324138lignes.Bien
entendu,s'iln'yaaucundoublondanslestables,toutesleslignesdursultatserontaussiuniques.
Lajointurecroisepeuts'crirededeuxmaniresdiffrentes:
l'aidedel'oprateurnormalis:
Slectionnez
http://sqlpro.developpez.com/cours/sqlaz/jointures/
10/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
SELECTcolonnes
FROMtable_1CROSSJOINtable_2
oul'aided'uneclauseFROMsimplifie:
Slectionnez
SELECTcolonnes
FROMtable_1,table_2
Cequiestcertainementl'expressionlaplusminimalistedetouslesordresSELECTduSQL!
Nousvoudrionssavoirsinotretabledestarifsdechambre(TJ_TRF_CHB)estcomplte,c'estdiresil'onabientoutesleschambres
(T_CHAMBRE)pourtouteslesdatesdedbutdetarif(T_TARIF):
Exemple18:
Slectionnez
Slectionnez
SELECTCHB_ID,TRF_DATE_DEBUT,0ASTRF_CHB_PRIX
FROMT_TARIF,T_CHAMBRE
ORDERBYCHB_ID,TRF_DATE_DEBUT
CHB_IDTRF_DATE_DEBUTTRF_CHB_PRIX
1199901010,00
1199909010,00
1200001010,00
1200009010,00
1200101010,00
2199901010,00
2199909010,00
2200001010,00
2200009010,00
2200101010,00
...
Encomparantrapidementlecontenudesdeuxtablesonpeuts'assurerquetouslestarifsontbientrenseigns.
Aveclasyntaxenormalise,cetterequtes'crit:
Exemple19:
Slectionnez
Slectionnez
SELECTCHB_ID,TRF_DATE_DEBUT,0ASTRF_CHB_PRIX
FROMT_TARIFCROSSJOINT_CHAMBRE
ORDERBYCHB_ID,TRF_DATE_DEBUT
CHB_IDTRF_DATE_DEBUTTRF_CHB_PRIX
1199901010,00
1199909010,00
1200001010,00
1200009010,00
1200101010,00
2199901010,00
2199909010,00
2200001010,00
2200009010,00
2200101010,00
...
etdonnelemmersultat!
IIIF.Lajointured'union
Lajointured'union,permetdefairel'uniondedeuxtablesdestructuresquelconque.Elles'exprimequ'l'aidedel'oprateurnormalisSQL2
suivant:
Slectionnez
SELECTcolonnes
FROMtable_1UNIONJOINtable_2
Effectuonsparexemplelajointured'unionentrelestablesT_TITRE("M.","Mme.","Melle.")etT_TYPE("FAX","GSM","TEL"):
Exemple20:
Slectionnez
Slectionnez
SELECT*
FROMT_TITREUNIONJOINT_TYPE
TIT_CODETIT_LIBELLETYP_CODETYP_LIBELLE
M.MonsieurNULLNULL
Melle.MademoiselleNULLNULL
Mme.MadameNULLNULL
NULLNULLFAXTlcopie
NULLNULLGSMTlphoneportable
NULLNULLTELTlphonefixe
Enfaitc'estcommesil'onavaitlistlapremiretable,puislasecondeenvitanttoutecolonnecommuneetcomplterlesespacesvidesdes
valeursNULL.
MaiscettejointureesttrsrarementimplantedanslesmoteursSQL.
http://sqlpro.developpez.com/cours/sqlaz/jointures/
11/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
NOTA:sil'oprateurUNIONJOINn'estpasprsentdansvotremoteur,vouspouvezlefabriquercommesuit,carelle(l'union)peuttre
facilementremplaceparunautreordreSQLpresqueaussisimple:
Slectionnez
SELECT*
FROM<tablegauche>
FULLOUTERJOIN<tabledroite>
ON<critre>
Olacondition<critre>estn'importequelprdicatvalanttoujoursfauxcomme"1=2".
Endehorsdufaitdelinariserdestableshtrognes,ilestfranchementpermisdedouterdel'utilitd'unteloprateur.
IV.Naturedesconditionsdejointures
Nousallonsmaintenantanalyserlesdiffrentesjointuresbasessurlanaturedesconditionspourbienlesdistinguer.
IVA.quijointure
L'quijointureconsisteoprerunejointureavecuneconditiond'galit.Cetteconditiond'galitdanslajointurepeutnepasporter
ncessairementsurlesclefs(primairesettrangres).
Recherchonsparexemplelesclientsdontlenomestceluid'unevillecontenudanslatabledesadresses:
Exemple21:
Slectionnez
Slectionnez
SELECTDISTINCTC.CLI_ID,C.CLI_NOM,A.ADR_VILLE
FROMT_CLIENTC
JOINT_ADRESSEA
ONC.CLI_NOM=A.ADR_VILLE
CLI_IDCLI_NOMADR_VILLE
92PARISPARIS
...
Nousavonsdoncbienralisunequijointure,maisellen'estpasnaturelleparcequ'ellenereposepassurlesclefsdestables.
Bienentendu,ilexisteunoprateurnormalisSQL2permettantdetraiterlecasdel'quijointure:
Slectionnez
SELECT[DISTINCTouALL]*oulistedecolonnes
FROMtable1[INNER]JOINtable2ONconditiondejointure
LemotclefINNERn'tantpasobligatoire,maisvoulants'opposerauxmotclefsOUTER,UNIONetCROSS.
Ainsi,larequteprcdente,s'critl'aidedecettesyntaxe:
Exemple22:
Slectionnez
Slectionnez
SELECTDISTINCTC.CLI_ID,C.CLI_NOM,A.ADR_VILLE
FROMT_CLIENTC
INNERJOINT_ADRESSEA
ONC.CLI_NOM=A.ADR_VILLE
CLI_IDCLI_NOMADR_VILLE
92PARISPARIS
...
IVB.Nonquijointure
Ils'agitld'utilisern'importequelleconditiondejointureentredeuxtables,exceptelastrictegalit.Cepeuventtrelesconditions
suivantes:
>
suprieur
>=
suprieurougal
<
infrieur
<=
infrieurougal
<>
diffrentde
IN
dansunensemble
LIKE
correspondance
partielle
BETWEEN...AND
entredeuxvaleurs
...
EXISTS
dansunetable
Enrglegnraleoutrouvedesnonquijointuresdanslecadredecomparaisonstemporellesoudemesuresphysiques.Parexempleon
pourraitrechercherunepicemcaniquedansunstockquisoitdemmenatureoudemmefonctionqu'unepicedonne,maispluslgre.
Nousvoulonsobtenirlesfacturesquionttmisesavantqueleprixdespetitsdjeunersn'atteigne6.
Exemple23:
Slectionnez
Slectionnez
SELECTF.*
http://sqlpro.developpez.com/cours/sqlaz/jointures/
FAC_IDCLI_IDPMT_CODEFAC_DATEFAC_PMT_DATE
11CB1999013119990214
31CHQ1999022819990312
51CB1999033119990423
12/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
FROMT_FACTUREF
INNERJOINT_TARIFT
ONF.FAC_DATE<T.TRF_DATE_DEBUT
WHERETRF_PETIT_DEJEUNE>=6
71CHQ1999043019990514
91CHQ1999053119990614
111CB1999063019990714
131CHQ1999073119990812
151CB1999083119990923
252CB1999013119990223
272CHQ1999022819990318
...
NOTA:pourrcuprertouteslescolonnesd'unetable,onpeututiliserl'oprateur*suffixparlenomdetable,commenousl'avonsfaitici
pourlatabledesfactures.
Sinotretabledestarifsavaittorganisepartranches,commececi:
Slectionnez
TRF_DATE_DEBUTTRF_DATE_FINTRF_TAUX_TAXESTRF_PETIT_DEJEUNE
199901011999083118,606,00E
199909011999123120,607,00E
200001012000083120,608,00E
200009012000123120,609,00E
200101012001123120,6010,00E
alors,rcuprerletarifdeschambrespourchacunedesdatesduplanningdevientunexercicetrssimple:
Exemple24:
Slectionnez
Slectionnez
SELECTCPC.CHB_ID,CPC.PLN_JOUR,TC.TRF_CHB_PRIX
FROMTJ_CHB_PLN_CLICPC
INNERJOINT_TARIFT
ONCPC.PLN_JOURBETWEENT.TRF_DATE_DEBUTANDT.TRF_DATE_FIN
INNERJOINTJ_TRF_CHBTC
ONT.TRF_DATE_DEBUT=TC.TRF_DATE_DEBUT
ANDCPC.CHB_ID=TC.CHB_ID
CHB_IDPLN_JOURTRF_CHB_PRIX
12000012240,00E
12000012840,00E
11999010233,50E
11999010333,50E
11999010533,50E
11999010733,50E
11999010933,50E
11999011033,50E
11999011133,50E
11999011333,50E
...
Nousavonsdoncnouveauunexempleremarquabledenonequijointure.
ConstatonsquelacolonneTRF_DATE_FINdecettenouvelleversiondelatabledestarifsimpliqueuneredondancedel'information.Eneffet,
cettedatedefinestdductibledeladatededbutdelalignequicontientladateimmdiatementpostrieureavecunjourdemoins.Deplus
leproblmeinduitparcetteorganisationdesdonnesfaitqu'ilfautobligatoirementdfinirunedatedefindestarifs,mmedanslefutur,
sinoncertainestarificationsnepourronttretabliesparcetterequte.
Ilnes'agitdoncpasd'unemodlisationcorrecte!
IVC.Autojointure
Leproblmeconsistejoindreunetableellemme.Ilestassezfrquentquel'onaitbesoindetellesautojointurescarellepermettent
notammentdemodliserdesstructuresdedonnescomplexescommedesarbres.Voiciquelquesexemplesderelationncessitantuneauto
jointuredetables:
dansunetabledesemployes,connatrelesuprieurhirarchiquedetoutemploy
dansunetabledenomenclaturesavoirquelssontlescomposantsncessaireslaralisationd'unmodule,oulesmodulesncessaires
laralisationd'unappareil
dansunetabledepersonnes,retrouverl'autremoitid'uncouplemari.
Lareprsentationd'unetellejointuredanslemodlededonnes,sefaitparlerajoutd'unecolonnecontenantunepseudocleftrangre
basesurleclefdelatable.
Danscecas,unesyntaxepossiblepourl'autojointureestlasuvante:
Slectionnez
SELECT[DISTINCTouALL]*oulistedecolonnes
FROMlaTablet1
INNERJOINlaTablet2
ONt1.laClef=t2.laPseudoClefEtrangre
C'estl'exempletypiqueoul'utilisationdesurnomspourlestablesestobligatoire,sinonilyarisquedeconfusionpourlemoteurSQL.
Pourdonnerunexempleconcretnosproposnousallonsmodliserlefaitqu'unechambrepuissecommuniqueravecuneautre(parune
porte).Dslors,lechallengeestdetrouverquellessontleschambresquicommuniquententreellesparexemplepourraliserunesortede
suite.Pourcefaire,nousallonsajouternotretabledeschambresunecolonnedecleftrangrebasesurlaclefdelatable.
Danscecas,cettecolonnedoitobligatoirementaccepterdesvaleursnulles!
Voicil'ordreSQLpourrajouterlacolonneCHB_COMMUNIQUEdanslatableT_CHAMBRE:
Slectionnez
ALTERTABLET_CHAMBREADDCHB_COMMUNIQUEINTEGER
Alimentonsldequelquesvaleursexemplesenconsidrantquela7communiqueavecla9etla12avecla14:
Slectionnez
http://sqlpro.developpez.com/cours/sqlaz/jointures/
13/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
UPDATET_CHAMBRESETCHB_COMMUNIQUE=9WHERECHB_ID=7
UPDATET_CHAMBRESETCHB_COMMUNIQUE=7WHERECHB_ID=9
UPDATET_CHAMBRESETCHB_COMMUNIQUE=12WHERECHB_ID=14
UPDATET_CHAMBRESETCHB_COMMUNIQUE=14WHERECHB_ID=12
Pourformulerlarecherchedechambrescommuniquantes,ilsuffitdefairelarequtesuivante:
Exemple25:
Slectionnez
SELECTDISTINCTc1.CHB_ID,c1.CHB_COMMUNIQUE
FROMT_CHAMBREc1
INNERJOINT_CHAMBREc2
ONc1.CHB_ID=c2.CHB_COMMUNIQUE
Slectionnez
CHB_IDCHB_COMMUNIQUE
79
97
1214
1412
olatableT_CHAMBREfiguredeuxfoisparl'entremisededeuxsurnommagesdiffrentsc1etc2.
Notonsquecetteprsentationn'estpaspratiquecarelleddoublelenombredecouplesdechambrescommuniquantes,donnantl'impression
qu'ilya4couplesdechambrescommuniquantescequiestfaux.Ilmanquejusteunpetitquelquechosepourquecetterequtesoitparfaite.
Ilsuffiteneffetdeneretenirlessolutionsquepourdesidentifiantsinfrieursousuprieurd'unetableparrapportl'autre:
Exemple26:
Slectionnez
SELECTDISTINCTc1.CHB_ID,c1.CHB_COMMUNIQUE
FROMT_CHAMBREc1
INNERJOINT_CHAMBREc2
ONc1.CHB_ID=c2.CHB_COMMUNIQUE
ANDc1.CHB_ID<=c2.CHB_ID
Slectionnez
CHB_IDCHB_COMMUNIQUE
79
1214
IVD.Lajointurehtrogne
Unejointurehtrogneconsistejoindredansunemmerequte,destablesprovenantdebasesdedonnesdiffrentes,voiredeserveurs
dedonnesdiffrents.Unteltypedejointuren'estpossibleque:
entredeuxbasesd'unmmeserveur:quesileSQLduserveurlepermet(parexempledeuxbasesOracle,deuxbasesSQLServer,
etc.)
entredeuxbasesdedeuxserveursdiffrents:qu'enpassantparunoutiltiersdetype"middleware"(parexempleuneentreunebase
OracleetunebaseSybase).L'undesraresmiddlewareafairecetypedejointureestleBDE(BorlandDatabaseEngine)d'Inprise.
Danscesdeuxcas,ilfautbienvrifierlacompatibilitdestypescarilsepeutquedesrsultatssurprenantsapparaissentnotammentdansle
traitementdesnombrerels.
Poureffectuerdetellesrequtes,lasyntaxeesttoujoursspcifiqueaumoteuremploy.AvecleBDEleniveaudeSQLestSQL2,cantonn
auxfonctionsdebase.
Voiciunexemplederequteentredeuxserveurl'aideduBDE:
Exemple27:
Slectionnez
Slectionnez
SELECTC.CLI_NOM,T.TEL_NUMERO
FROM":ORACLE_CLIBD:T_CLIENT"C,":SYBASE_TELBD:T_TELEPHONE"T
WHEREC.CLI_ID=T.CLI_ID
NOM_CLITEL_NUMERO
DUPONT0145425663
DUPONT0144285252
DUPONT0144285250
BOUVIER0611867889
DUBOIS0241588952
DREYFUS0151585250
DUHAMEL0154114321
BOYER0655414295
MARTIN0148989221
MARTIN0144225621
...
EnfaitleBDEsesertd'aliaspermettantdedfinirlafoisleserveuretlabaseconcern.Icilesaliassont:":ORACLE_CLIBD:"et
":SYBASE_TELBD:".
V.Rcapitulatifdesjointuresnormalises
VA.Terminologieetsyntaxedesjointures
Jointurenaturelle:lajointures'effectuesurlescolonnescommunes,c'estdirecellesdemmenomettype:
Slectionnez
SELECTcolonnes
FROMtable1NATURALJOINtable2[USINGcol1,col2...]
[WHEREprdicat]...
LemotclefUSINGpermetderestreindrelescolonnescommunesprendreenconsidration.
Jointureinterne:lajointures'effectueentrelestablessurlescolonnesprcisesdanslaconditiondejointure:
http://sqlpro.developpez.com/cours/sqlaz/jointures/
14/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
Slectionnez
SELECTcolonnes
FROMtable1t1[INNER]JOINtable2t2ONcondition
[WHEREprdicat]...
Jointureexterne:lajointurepermetdercuprerleslignesdestablescorrespondantaucritredejointure,maisaussicellepour
lesquellesiln'existepasdecorrespondances.
Slectionnez
SELECTcolonnes
FROMtable1t1[RIGHTOUTER|LEFTOUTER|FULLOUTER]JOINtable2t2ONcondition
[WHEREprdicat]...
RIGHTOUTER:latabledroitedel'expressionclef"RIGHTOUTER"renvoiedeslignessanscorrespondanceaveclatable
gauche.
LEFTOUTER:latablegauchedel'expressionclef"LEFTOUTER"renvoiedeslignessanscorrespondanceaveclatabledroite.
FULLOUTER:lesdeuxtablesrenvoientdeslignessanscorrespondanceentreelles.
Jointurecroise:lajointureeffectueleproduitcartsien(la"multiplication")desdeuxtables.
Iln'yapasdecondition.
Slectionnez
SELECTcolonnes
FROMtable1t1CROSSJOINtable2t2
[WHEREprdicat]...
Jointured'union:lajointureconcatnelestablessansaucunecorrespondancesdecolonnes.
Slectionnez
SELECTcolonnes
FROMtable1UNIONJOINtable2
Iln'yapasdecritredejointure.
SivotreSGBDRn'implmentepaslajointureexternedroite,inversezl'ordredestablesetfaireunejointureexternegauchelorsquecelaest
possible.
VB.Arbredejointure
Lajointuredemultipletablespeutsereprsentersouslaformed'unarbre.Cetarbrepossdedoncuneracine,c'estlatableprincipale,celle
d'ol'onveutquel'informationparte.Ellepossdeaussidesfeuilles,c'estdiredestablesd'entits.Lestablessituesentrelaracineetles
feuilles,sontsouventdestablesdejointure,possdantenprincipedeuxcleftrangres.Dansleprincipetoutetabledejointuredevraittre
unnoeuddel'arbre.
Lareprsentationarborescented'unejointureestunexcellentmoyenpourvisualisersilaclausedejointuredevotrerequteestpriori
correcte.Eneffet,unerfrencecirculairedanslaclausedejointurenepeutpastrereprsentesouslaformed'unarbreetilyafort
parierquelarequtesoitincorrecte.
Voiciparexemplelarequtequi"metplat",labasehotel:
Slectionnez
SELECT*
FROMT_CLIENTCLIleclient(racinedel'arbre)
JOINT_ADRESSEADRadresse,tabled'entit(feuilledel'arbre)
ONCLI.CLI_ID=ADR.CLI_ID
JOINT_TITRETITtitre,tabled'entit(feuilledel'arbre)
ONCLI.TIT_CODE=TIT.TIT_CODE
JOINT_EMAILEMLmail,tabled'entit(feuilledel'arbre)
ONCLI.CLI_ID=EML.CLI_ID
JOINT_TELEPHONETELtlphone,tabled'entitservantdejointure(noeuddansl'arbre)
ONCLI.CLI_ID=TEL.CLI_ID
JOINT_TYPETYPtypedetlphone,tabled'entit(feuilledel'arbre)
ONTEL.TYP_CODE=TYP.TYP_CODE
JOINTJ_CHB_PLN_CLICPCtabledejointure(noeuddansl'arbre)
ONCLI.CLI_ID=CPC.CLI_ID
JOINT_PLANNINGPLNdateduplanning,tabled'entit(feuilledel'arbre)
ONCPC.PLN_JOUR=PLN.PLN_JOUR
JOINT_CHAMBRECHBchambre,tabled'entitservantdejointure(noeuddansl'arbre)
ONCPC.CHB_ID=CHB.CHB_ID
JOINTJ_TRF_CHBTCtabledejointure(noeuddansl'arbre)
ONCHB.CHB_ID=TC.CHB_ID
JOINT_TARIFTRFtarif,tabled'entit(feuilledel'arbre)
ONTC.TRF_DATE_DEBUT=TRF.TRF_DATE_DEBUT
JOINT_FACTUREFACfacture,tabled'entitservantdejointure
ONCLI.CLI_ID=FAC.CLI_ID
JOINT_LIGNE_FACTURELIFlignedefacture,tabled'entit(feuilledel'arbre)
ONFAC.FAC_ID=LIF.FAC_ID
JOINT_MODE_PAIEMENTPMTmodedepaiement,tabled'entit(feuilledel'arbre)
ONFAC.PMT_CODE=PMT.PMT_CODE
Correctementindentondistinguedjlastructurearborescente.Onpeutlamettreenvidenceensupprimanttoutcequin'estpasunnom
detable:
Slectionnez
T_CLIENTCLIleclient(racinedel'arbre)
T_ADRESSEADRadresse,tabled'entit(feuilledel'arbre)
T_TITRETITtitre,tabled'entit(feuilledel'arbre)
T_EMAILEMLmail,tabled'entit(feuilledel'arbre)
http://sqlpro.developpez.com/cours/sqlaz/jointures/
15/16
16/2/2015
LeSQLdeAZleSELECTsurplusieurstables
T_TELEPHONETELtlphone,tabled'entitservantdejointure(noeuddansl'arbre)
T_TYPETYPtypedetlphone,tabled'entit(feuilledel'arbre)
TJ_CHB_PLN_CLICPCtabledejointure(noeuddansl'arbre)
T_PLANNINGPLNdateduplanning,tabled'entit(feuilledel'arbre)
T_CHAMBRECHBchambre,tabled'entitservantdejointure(noeuddansl'arbre)
TJ_TRF_CHBTCtabledejointure(noeuddansl'arbre)
T_TARIFTRFtarif,tabled'entit(feuilledel'arbre)
T_FACTUREFACfacture,tabled'entitservantdejointure
T_LIGNE_FACTURELIFlignedefacture,tabled'entit(feuilledel'arbre)
T_MODE_PAIEMENTPMTmodedepaiement,tabled'entit(feuilledel'arbre)
Parcetteindentation,ilestfaciledereprerlesjointuresentrelestables.
VI.Noteimportante
Lesjointuresnesontpaslaseulemaniredemettreenrealtiondiffrentestablesauseind'unemmerequteSQL.Onpeutaussijoindre
plusieurstablesl'aidedessousrequtesainsiqu'l'aidedesoprateursensemblistesquenousallonsvoirauxdeuxprochainschapitres.
VII.Rsum
Voicilesdiffrencesentrelesmoteursdesbasesdedonnes:
Paradox
Access
PostGreSQL
Sybase
SQLServer7
Oracle8
DB2(400)
INNERJOIN
Oui
Oui
Oui
Oui
Oui
Non(1)
Oui
OUTERJOIN
LEFT,RIGHT,
FULL
LEFT,RIGHT
LEFT,RIGHT,FULL
LEFT,RIGHT,
FULL
LEFT,RIGHT,
FULL
Non(1)
LEFT(4)
UNIONJOIN
Non(2)
Non
Non
Non(2)
Non(2)
Non(1)(2)
Non
CROSSJOIN
Non(3)
Non(3)
Oui
Non(3)
Oui
Non(1)(3)
Oui
(1)OracleneconnattoujourspasleJOIN(afaitquandmmeplusdedixansderetardpourcetditeurpionnierquisembles'endormirsur
seslauriers).Ilfautdoncutiliserunesyntaxepropritaire.Exception:laversion9supporteenfinlesjointuresnormalises.
(2)PossibleavecunFULLOUTERJOIN
(3)Possibleavecl'anciennesyntaxesansprcisiondecritreWHERE
(4)deplusIBMDB2(400)disposed'untrsintressant"exceptionjoin"equivalent:
Slectionnez
SELECT*
FROMtablegauche
LEFTOUTERJOINtabledroite
ONrfrencesdejointure
WHEREtabledroite.clefISNULL
DonnesconcernantDB2400aimablementcommuniquesparkerigan.
Copyright2004FrdricBrouard.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/jointures/
16/16