You are on page 1of 9

Les jointures

INNER JOIN, LEFT, RIGHT et FULL OUTER JOIN


Souvent, dans une base de donnes, les donnes sont reparties entre plusieurs tables. On peut trs bien imaginer une table contenant une cl trangre vers une autre table. A ce moment l, comment faire pour rcuprer les informations de cette table et de la table vers laquelle pointe la cl trangre en une seule requte ? Si vous ne voyez pas ce que je veux dire, vous allez tout de suite comprendre. Imaginez ce schma de base de donnes.

Nous allons partir du fait que ces tables contiennent dj les donnes suivantes : VOITURES

COULEURS

PERSONNES

PERSONNE_VOITURE

Nous allons voir maintenant des techniques permettant en une requte de rcuprer des donnes qu'il serait impossible de rcuprer facilement avec un SELECT.

Jointure interne
Nous allons donc voir ici la plus simple jointure qu'il existe : la jointure interne. Imaginez un formulaire de recherche. Dans un champ, on rentre un identifiant et partir de cet identifiant, la personne dont l'identifiant correspond la valeur de ce champ sera rcupr et ses informations seront affiches. Seulement, nous voulons galement savoir quelle voiture il possde ainsi que la couleur de celle-ci. Avec juste un SELECT, cela serait trs compliqu (il faudrait utiliser IN par exemple avec des SELECT imbriqus).

Tout d'abord, comment fonctionne une jointure interne ? En fait, tout part d'une requte SELECT. Grce celle-ci, nous allons rcuprer les informations de la personne. Juste les informations se trouvant dans la table PERSONNES. Une fois ces infos rcupres, nous allons JOINDRE ce rsultat une table de la base de donnes. Nous devons spcifier grce quel critre la jointure sera effectue. Gnralement, cela se fait base de cl primaire/trangre. Par exemple, ici, nous allons joindre la partie de la table PERSONNE_VOITURE pour laquelle le champ PERSONNE_ID de cette table correspond au champ ID_PERSONNE de la table PERSONNE. Etant donn qu'une seule occurrence de cette valeur est prsente, il n'y aura que la ligne correspondant dans la table PERSONNE_VOITURE qui sera joint. Tout d'abord, voici la syntaxe d'une jointure interne. Nous l'expliquerons sur base de l'exemple : 1. INNER JOIN table 2. [ON champ1=champ2 [{AND | OR} champ3=champ4,... ]]
INNER JOIN table [ON champ1=champ2 [{AND | O

Voyons comment se servir de cela grce un exemple. Imaginez donc tout d'abord une simple requte permettant de retrouver une personne sur base de son identifiant. La requte serait donc la suivante : 1. SELECT ID_PERSONNE, NOM, PRENOM, AGE 2. FROM PERSONNES 3. WHERE ID_PERSONNE = 3
SELECT ID_PERSONNE, NOM, P FROM PERSONNES WHERE ID_PERSONNE = 3

Nous allons imaginer pour l'instant que la personne recherche sera celle dont l'identifiant correspond 3. Voici donc le rsultat renvoy par cette requte :

Jusque l, tout est normal. Nous allons maintenant joindre la table PERSONNE_VOITURE sans condition pour voir un petit peu ce que cela fait. Tapez donc : 1. SELECT ID_PERSONNE, NOM, PRENOM, AGE, PERSONNE_ID, VOITURE_ID, COULEUR_ID

2. FROM PERSONNES 3. INNER JOIN PERSONNE_VOITURE 4. WHERE ID_PERSONNE = 3


SELECT ID_PERSONNE, NOM, P FROM PERSONNES INNER JOIN PERSONNE_VOITUR WHERE ID_PERSONNE = 3

Le rsultat renvoy par cette requte est le suivant :

Ce rsultat est logique. Comme vous le voyez, nous commenons par slectionner plus de champs. En effet, tant donn que nous joignons la table PERSONNE_VOITURE la requte, les champs de cette table pourront tre indiqus dans la liste des champs slectionner par le SELECT. Comme vous le voyez, la requte reste la mme l'exception de l'INNER JOIN. Mais si la requte reste la mme, pourquoi y a-t-il 4 rsultats au lieu de 1 ? La rponse est simple. La table PERSONNE_VOITURE contient 4 enregistrements et la requte sans le INNER JOIN renvoie 1 seul rsultat. Pour afficher le rsultat de ces deux requtes ensemble, il y aura 4 rsultats. Si nous disons que le SELECT sans l'INNER JOIN est la requte S et que l'INNER JOIN est la requte I, le rsultat renvoy est le suivant : Enregistrement de S suivi du premier enregistrement de I Enregistrement de S suivi du deuxime enregistrement de I Enregistrement de S suivi du troisime enregistrement de I Enregistrement de S suivi du quatrime enregistrement de I Les rsultats sont donc combins entre eux pour qu'ils apparaissent tous. Bien videmment ici, tout ne nous intresse pas. Regardez par exemple la premire ligne. Le champ PERSONNE_ID vaut 2 et non 3, c'est donc un enregistrement qui concerne la personne 2, cet enregistrement n'a donc rien faire dans le rsultat. Il est nanmoins prsent car nous n'avons pas stipul de condition la jointure. Ce type de condition s'indique grce au mot cl ON juste aprs la jointure.

Tapez par exemple cette requte :

1. SELECT ID_PERSONNE, NOM, PRENOM, AGE, PERSONNE_ID, VOITURE_ID, COULEUR_ID 2. FROM PERSONNES 3. INNER JOIN PERSONNE_VOITURE 4. ON ID_PERSONNE = PERSONNE_ID 5. WHERE ID_PERSONNE = 3
SELECT ID_PERSONNE, NOM, P FROM PERSONNES INNER JOIN PERSONNE_VOITUR ON ID_PERSONNE = PERSONNE

Le ON fonctionne comme le WHERE, il est donc possible de prciser plusieurs conditions spares par des AND ou OR. Ici, nous joignons encore une fois la table PERSONNE_VOITURE la slection, mais nous ne joignons que les enregistrements o le champ ID_PERSONNE de la table PERSONNES est le mme que le champ PERSONNE_ID de la table PERSONNE_VOITURE. Ainsi, tous les enregistrements joints concernent la personne ayant l'identifiant 3. La preuve :

Nous avanons bien, mais ce n'est pas fini. Effectivement, maintenant que nous avons l'identifiant des voitures que la personne possde ainsi que l'identifiant de leur couleur, il serait plus agrable de rcuprer leur intitul. Il suffit simplement de faire deux autres INNER JOIN. Voyons d'abord celui pour la voiture : 1. SELECT ID_PERSONNE, NOM, PRENOM, AGE, PERSONNE_ID, MARQUE, CO ULEUR_ID 2. FROM PERSONNES 3. INNER JOIN PERSONNE_VOITURE 4. ON ID_PERSONNE = PERSONNE_ID 5. INNER JOIN VOITURES 6. ON ID_VOITURE = VOITURE_ID 7. WHERE ID_PERSONNE = 3

SELECT ID_PERSONNE, NOM, P FROM PERSONNES INNER JOIN PERSONNE_VOITUR ON ID_PERSONNE = PERSONNE

Le rsultat renvoy par cette requte est le suivant :

Comme vous le voyez, cette fois, c'est la marque de la voiture et non plus l'identifiant qui apparat. C'est ralis trs simplement. On commence par joindre la table VOITURES au rsultat obtenu prcdemment mais comme nous ne voulons que les voitures appartenant la personne en question, on pose une condition grce au ON qui ne joindra aux lignes du rsultat que les liens dont l'identifiant rcupr dans la table PERSONNE_VOITURE sera le mme que dans le champ ID_VOITURE de la table VOITURES. Modifions maintenant une dernire fois la requte pour rcuprer uniquement les champs qui nous intresse mais galement pour rcuprer l'intitul de la couleur de la voiture : 1. SELECT NOM, PRENOM, AGE, MARQUE, COULEUR 2. FROM PERSONNES 3. INNER JOIN PERSONNE_VOITURE 4. ON ID_PERSONNE = PERSONNE_ID 5. INNER JOIN VOITURES 6. ON ID_VOITURE = VOITURE_ID 7. INNER JOIN COULEURS 8. ON ID_COULEUR = COULEUR_ID 9. WHERE ID_PERSONNE = 3
SELECT NOM, PRENOM, AGE, M FROM PERSONNES INNER JOIN PERSONNE_VOITUR ON ID_PERSONNE = PERSONNE

L'excution de cette requte produirait le rsultat suivant :

C'est ce qu'on voulait. La premire diffrence avec cette requte et les prcdentes est le fait que nous ne slectionnons plus que les champs qui nous intressent. Inutile de slectionner le champ PERSONNE_ID vu qu'on le connait car c'est sur cela que porte la condition aprs le WHERE. Ensuite, nous avons nouveau joint une nouvelle table. Cette fois, c'est COULEURS que nous joignons et encore une fois nous joignons cette table selon une condition comme quoi le champ ID_COULEUR de cette table doit tre gal au champ COULEUR_ID rcupr de la table PERSONNE_VOITURE. Vous allez voir que les jointures internes sont bien mais souffrent d'un problme que les jointures externes peuvent facilement rgler. Vous allez voir cela tout de suite.

Jointures externes
Considrez la requte tablie prcdemment : 1. SELECT NOM, PRENOM, AGE, MARQUE, COULEUR 2. FROM PERSONNES 3. INNER JOIN PERSONNE_VOITURE 4. ON ID_PERSONNE = PERSONNE_ID 5. INNER JOIN VOITURES 6. ON ID_VOITURE = VOITURE_ID 7. INNER JOIN COULEURS 8. ON ID_COULEUR = COULEUR_ID 9. WHERE ID_PERSONNE = 3
SELECT NOM, PRENOM, AGE, M FROM PERSONNES INNER JOIN PERSONNE_VOITUR ON ID_PERSONNE = PERSONNE

Nous avons vu qu'elle fonctionnait trs bien avec la personne dont l'identifiant valait 3. Essayez maintenant d'excuter cette requte avec l'identifiant 1. Si vous le faites, vous verrez qu'aucun rsultat n'est renvoy. C'est trange car mme si la personne 1 ne possde pas de voiture, cette personne existe. C'est en fait une raction normale. Effectivement, lorsque les INNER JOIN sont valus, les tables sont jointes et ce, gnralement sous condition. Si une condition n'est pas respecte, donc quaucune ligne de la table distante ne peut tre jointe, aucun rsultat ne sera renvoy.

Ici, quand la premire jointure va tre excute, donc celle qui joint PERSONNES PERSONNE_VOITURE, aucune ligne ne pourra tre jointe. Effectivement, aucune ligne de la table PERSONNE_VOITURE ne contient d'enregistrement avec le champ PERSONNE_ID valant 1. Aucune ligne ne sera donc jointe et aucune ligne ne sera renvoye en rsultat. Sachez qu'il existe trois types de jointures externes. Les gauches, les compltes et les droites. La diffrence n'est pas norme. Dans le cas des jointures externe gauche, on rajoute les lignes de la table de gauche qui n'ont pas t prises en compte. Dans le cas d'une jointure droite, ce sont les lignes de la table de droite qui n'ont pas t prises en compte qui sont rajoutes. Enfin, les jointures externes compltes ajoutent les lignes de la table qui n'ont pas t prises en compte de gauche et de celle de droite. La table de gauche est celle qui apparat dans la requte SQL AVANT le mot cl de jointure, tandis que celle de droite est celle qui apparat APRES le mot cl de jointure. La syntaxe d'une jointure externe est la suivante : 1. LEFT | RIGHT | FULL OUTER JOIN table_droite 2. ON condition
LEFT | RIGHT | FULL OUTER JOIN ON condition

Vous devez choisir entre LEFT (gauche), FULL (complte) ou RIGHT (droite). Le mot cl OUTER n'est pas obligatoire mais bon, nous vous conseillons de le mettre pour la clart de votre requte. Nous allons maintenant modifier la requte prcdente pour voir un petit peu le fonctionnement des jointures externes. Remplacez donc tout les INNER par des LEFT OUTER pour donner ceci : 1. SELECT NOM, PRENOM, AGE, MARQUE, COULEUR 2. FROM PERSONNES 3. LEFT OUTER JOIN PERSONNE_VOITURE 4. ON ID_PERSONNE = PERSONNE_ID 5. LEFT OUTER JOIN VOITURES 6. ON ID_VOITURE = VOITURE_ID 7. LEFT OUTER JOIN COULEURS 8. ON ID_COULEUR = COULEUR_ID 9. WHERE ID_PERSONNE = 3
SELECT NOM, PRENOM, AGE, M FROM PERSONNES LEFT OUTER JOIN PERSONNE_V ON ID_PERSONNE = PERSONNE

L'excution de cette requte donnera :

Nous avons maintenant rcuprer une ligne avec des valeurs nulles. Ce rsultat est logique. En effet, la premire jointure joint la table PERSONNES et PERSONNE_VOITURE, mais la table PERSONNE_VOITURE ne contient aucun enregistrement avec le champ PERSONNE_ID contenant 1, une jointure interne chouerait donc. La jointure externe, elle, va joindre une ligne de rsultat contenant NULL comme valeur pour PERSONNE_ID et VOITURE_ID. Les deux jointures externes suivantes vont procder de la mme faon car elles vont essayer de joindre des tables dans lesquelles des champs vaudront NULL. En effet, VOITURE_ID valant NULL aprs la premire jointure, la requte va essayer de joindre la table VOITURES avec la ligne qui contient NULL dans le champ ID_VOITURE. Il n'existe pas d'enregistrement de ce type. C'est donc la valeur NULL qui sera jointe. Il en ira de mme avec la table COULEURS. Nous pourrions voir dans ce cours un tas d'autres exemples, mais une bonne comprhension du SQL passe par la rptition. En effet, vous devez faire et refaire plein de commandes diffrentes et analyser les rsultats pour bien comprendre les comportements des mots cl que vous utilisez. Je vous conseille donc de faire le plus de jointures possibles pour bien comprendre leur fonctionnement car c'est vraiment trs importante et utile.

You might also like