Vous êtes sur la page 1sur 16

16/2/2015

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=&gt;aucunelignen'estrcupre
doncaucunelignedeTEST_JOIN1n'adecorrespondanceavecTEST_JOIN2
conclusion:toutesleslignesdeTEST_JOIN1serontreprisesdufait
delajointureexterne
2TJ1.COL2='taratata'=&gt;encoreunefoisaucunelignen'estrcupre
doncaucunelignedeTEST_JOIN1n'adecorrespondanceavecTEST_JOIN2
conclusion:toutesleslignesdeTEST_JOIN1serontreprisesdufait
delajointureexterne
3TJ1.COL1=TJ2.COL1=&gt;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

Vous aimerez peut-être aussi