Sie sind auf Seite 1von 15

ROYAUME DU MAROC

Office de la Formation Professionnelle et de la Promotion du Travail

SQL - Sous Ensemble LMD Les oprations de jointure

DIRECTION RECHERCHE ET INGENIERIE DE FORMATION SECTEUR NTIC

SQL - Sous Ensemble LMD Les oprations de jointure

Sommaire
1. 2. Introduction ____________________________________________________________ 2 Requtes intgrant plusieurs tables _________________________________________ 3
2.1. 2.2. La mthode ensembliste ___________________________________________________ 3 La mthode prdicative____________________________________________________ 8

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 1 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

1. Introduction
Ce support a pour but de vous prsenter les diffrents types de jointure, les oprations de jointure et dune manire gnrale, le travail avec des donnes issues de plusieurs tables. Seront traits dans ce document :
Les oprateurs ensemblistes La mthode des prdicats Les diffrentes natures de jointure (equi-jointure, jointure droite, gauche et totale)

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 2 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

2. Requtes intgrant plusieurs tables


Nous allons aborder ici la mise en uvre de requtes portant sur plusieurs tables. Deux mthodes sont notre disposition, la mthode ensembliste et la mthode prdicative. Ces deux mthodes ralisent des jointures. La jointure consiste rechercher entre deux tables ayant un attribut commun (mme type et mme domaine de dfinition) tous les tuples (toutes les lignes) pour lesquels ces attributs ont la mme valeur.
la mthode ensembliste ralise lintersection de deux ensembles et sexprime sous forme de requtes imbriques. la mthode prdicative vrifie lgalit de deux attributs et sexprime sous la forme dune seule slection conditionnelle.

2.1.

La mthode ensembliste

Schma de construction : SELECT liste dattributs FROM table1 WHERE attribut de jointure IN (SELECT attribut de jointure FROM table2 WHERE condition) La requte lintrieur des parenthses est dite requte interne ou sousrequte. Elle est value en premier, constituant ainsi un premier ensemble dont on ralisera lintersection (IN) avec lensemble issu de lvaluation de la requte externe. Les attributs slectionns, et retenus dans le jeu de rsultat, sont ncessairement issus de la requte externe. Il sagit donc dune mthode assez restrictive. Dun manire gnrale, lexcution des requtes construites selon la mthode ensembliste demande plus de ressources au systme. Elles peuvent toutefois tre plus faciles raliser et bien adaptes certains cas de figure. Exemple : Liste des pilotes assurant un vol au dpart de Paris SELECT PIL# as "Code Pilote",NOM FROM PILOTE WHERE PIL# IN (SELECT PILOTE FROM VOL WHERE Villedepart = 'Paris');

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 3 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

Figure 1 : Illustration de la mthode ensembliste

Autre exemple : Traitement du sauf (ngation NOT) ou diffrence. Liste des pilotes qui ne sont pas affects des vols. SELECT PIL# as "Code Pilote",NOM FROM PILOTE WHERE PIL# NOT IN (SELECT PILOTE FROM VOL)
Lattribut de jointure est une valeur scalaire et ne peut donc tre une valeur vectorielle. Ainsi, vous ne pouvez pas crire une requte sous la forme qui suit :

SELECT PIL# as "Code Pilote",NOM FROM PILOTE WHERE (PIL#,VILLE) NOT IN (SELECT PILOTE,VILLEDEPART FROM VOL) On ne pourra pas non plus crire la requte suivante : SELECT PIL# as "Code Pilote",NOM,VILLEDEPART FROM PILOTE WHERE PIL# IN (SELECT PILOTE FROM VOL) Car lattribut VILLEDEPART nappartient pas la table sur laquelle porte la requte externe. Vous obtenez un message derreur : Serveur : Msg 207, Niveau 16, tat 3, Ligne 1 'VILLEDEPART' : nom de colonne incorrect. On peut par contre joindre un attribut avec un attribut qui rsulte dune opration rcapitulative. Nous pouvons ainsi obtenir la liste des avions dont la capacit en passagers est gale la capacit maximum. SELECT AV#,MARQUE,TYPEAVION,CAPACITE FROM AVION WHERE CAPACITE IN (SELECT MAX(CAPACITE) FROM AVION)

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 4 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

Figure 2 : Liste des avions dont la capacit est gale la capacit maximum

Si nous souhaitons prciser quil sagit en fait des avions qui ont la capacit maximum du type, nous modifierons instinctivement la requte comme suit, afin de calculer le maximum selon le type : SELECT AV#,MARQUE,TYPEAVION,CAPACITE FROM AVION WHERE CAPACITE IN (SELECT MAX(CAPACITE) FROM AVION GROUP BY MARQUE,TYPEAVION) Ce qui donne pour rsultat (extrait) :

Ce qui est faux, car un Airbus A320 se trouve tre retenu car sa capacit vaut la capacit maximum des avions de type Caravelle ! En fait, pour obtenir un rsultat exact, il nous faut corrler les lignes de la requte externe avec celles de la requte interne. Tous les SGBDR ne sont pas en capacit de raliser ce type doprations. Elles sont utiliser avec parcimonie dans la mesure du possible car trs coteuses en matire de ressources et donc de temps de traitement. En fait, la requte interne se trouve value pour chaque ligne de la requte externe ! Dans lexemple suivant, vous remarquerez lutilisation dun alias pour distinguer deux occurrences dun mme table.

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 5 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Requtes corrles SELECT AV#,MARQUE,TYPEAVION,CAPACITE FROM AVION as "AV1" WHERE CAPACITE IN (SELECT MAX(CAPACITE) FROM AVION WHERE MARQUE = AV1.MARQUE AND TYPEAVION = AV1.TYPEAVION GROUP BY MARQUE,TYPEAVION) Le rsultat est alors correct et lavion 100 limin du jeu de rsultats.

Figure 3 : Exemple de requte corrle

Comparaison dune valeur avec lensemble des valeurs dun attribut dune requte interne. On peut utiliser les oprateurs SOME, ANY, ou ALL pour comparer la valeur dune expression avec les valeurs dun attribut dune requte interne. Exemple : Liste des avions dont la capacit est suprieure toute capacit des avions de marque Boeing. SELECT AV#,MARQUE,TYPEAVION,CAPACITE FROM AVION WHERE CAPACITE > ALL (SELECT CAPACITE FROM AVION WHERE MARQUE='Boeing') La liste de valeurs gnre par la requte interne est {250, 300, 400}

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 6 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Le rsultat est le suivant :

Figure 4 : Comparer une valeur un ensemble avec ALL

En modifiant la requte et en remplaant ALL par ANY ou SOME, nous obtenons la liste de tous les avions dont la capacit est > 200.

Figure 5 : Comparer une valeur un ensemble avec SOME ou ANY

Utilisation de EXISTS. EXISTS peut tre utilis pour raliser des intersections ou des diffrences entre deux requtes. Ce nest pas la meilleure forme dutilisation, car elle fait appel des requtes corrles et peut scrire plus simplement. Je donne donc ici un seul exemple dutilisation. Nous verrons dautres exemples de mise en uvre plus judicieux par la suite dans la partie Programmation du SGBDR. Liste des pilotes qui habitent la ville de dpart dun vol. Lvaluation de EXISTS renvoie un boolen porteur de la valeur vrai ou faux.

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 7 - 15

SQL - Sous Ensemble LMD Les oprations de jointure SELECT PIL#,NOM FROM PILOTE WHERE EXISTS ( SELECT VILLEDEPART FROM VOL WHERE VILLEDEPART = PILOTE.VILLE)

Figure 6 : Illustration de l'oprateur EXISTS

Remarque : Cette requte serait mieux crite ainsi : SELECT PIL#,NOM FROM PILOTE WHERE VILLE IN ( SELECT VILLEDEPART FROM VOL) Utilisation de EXCEPT et INTERSECT. EXCEPT et INTERSECT sont de nouveaux oprateurs permettant de trouver des enregistrements communs deux jeux de donnes ou de retrouver des enregistrement figurant dans un jeu de donnes et pas dans lautre. Ces oprateurs obissent aux mmes rgles que UNION, les jeux denregistrement doivent tre de structure identique (mme nombre de colonnes, mmes types voire mme longueur).

2.2.

La mthode prdicative

La requte comporte une seule instruction SELECT qui traite plusieurs tables dont la liste apparat dans la clause FROM. La traduction de la jointure se fait par une quation de jointure (galit entre 2 attributs) exprime au niveau de la clause FROM. Il existe quatre natures de jointure qui sont respectivement exprimes par les mots cls INNER, RIGHT OUTER, LEFT OUTER ou FULL OUTER dont nous verrons les diffrents cas dusage dans les exemples suivants. Important : La mthode prdicative permet de rapporter dans le jeu de rsultats les valeurs des attributs des diffrentes tables dfinies dans la clause FROM. Document
M17 - Les operations de jointure.doc

OFPPT @

Millsime
septembre 10

Page 8 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Cette mthode est en gnral prfrable la mthode ensembliste car plus performante.

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 9 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Premier exemple de jointure interne (INNER JOIN) Liste des avions affects des vols avec la mention de la ville de dpart du vol . Nous avons besoin dutiliser les tables VOL et AVION et de dterminer lattribut commun aux deux tables sur lequel portera la jointure. Ici le code de lavion, nomm AV# dans AVION et AVION dans VOL. SELECT AV#,MARQUE,TYPEAVION,VILLEDEPART FROM AVION INNER JOIN VOL ON AVION.AV# = VOL.AVION La clause INNER JOIN, jointure interne, ne retient que les lignes des deux tables pour lesquelles l'expression exprime au niveau de ON se vrifie.

Figure 7 : Expression de la jointure INNER JOIN

Si nous voulons la liste de tous les avions avec, pour ceux qui volent, des informations sur les villes de dpart, nous crierons : SELECT AV#,MARQUE,TYPEAVION,VILLEDEPART FROM AVION LEFT OUTER JOIN VOL ON AVION.AV# = VOL.AVION Pour les avions qui ne sont pas en service, lattribut VILLEDEPART aura la valeur NULL Le rsultat nous prouve quune requte de type LEFT OUTER renvoie la liste des lignes pour lesquelles la jointure avec galit est respecte, complte par les lignes de la table de gauche sans correspondance dans la table de droite.

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 10 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Rsultat dune jointure externe gauche

Figure 8 : Illustration de LEFT OUTER JOIN

Complments sur la dfinition des jointures INNER Spcifie toutes les paires correspondantes de lignes renvoyes. Supprime les lignes n'ayant pas de correspondance entre les deux tables. Ceci est l'option par dfaut si aucun type de jointure n'est spcifi. FULL [OUTER] : Peu usite Prcise qu'une ligne de la table de gauche ou de droite, qui ne correspond pas la condition de jointures, est comprise dans l'ensemble de rsultats et que les colonnes de sortie sans correspondance dans l'autre table ont des valeurs nulles. Ceci est fourni en plus de toutes les lignes renvoyes par INNER JOIN. LEFT [OUTER] Spcifie que toutes les lignes de la table de gauche ne respectant pas la condition de jointure sont comprises dans l'ensemble de rsultats, et que les colonnes de sortie de l'autre table sans correspondance ont des valeurs NULL. RIGHT [OUTER] : Spcifie que toutes les lignes de la table de droite ne respectant pas la condition de jointure sont comprises dans l'ensemble de rsultats, et que les colonnes de sortie correspondant l'autre table ont des valeurs NULL. JOIN Indique que l'opration de jointure spcifie doit avoir lieu entre les tables ou vues donnes. ON <condition de recherche> Indique la condition sur laquelle se base la jointure Auto-jointure Lauto-jointure est la jointure entre une table et elle-mme, pour slectionner des enregistrements correspondant dautres de la mme table. Il est ncessaire de recourir alors des alias pour dfinir la table dj utilise. Document
M17 - Les operations de jointure.doc

OFPPT @

Millsime
septembre 10

Page 11 - 15

SQL - Sous Ensemble LMD Les oprations de jointure Exemple dauto-jointure : Liste des avions de mme capacit SELECT AVION.AV#, AVION.MARQUE, AVION.TYPEAVION, AVION.CAPACITE, AV2.AV#, AV2.MARQUE, AV2.TYPEAVION, AV2.CAPACITE FROM AVION INNER JOIN AVION AS "AV2" ON AVION.CAPACITE = AV2.CAPACITE WHERE AVION.AV# > AV2.AV# A noter : Lexpression de la clause WHERE pour liminer les paires de lignes figurant plusieurs fois. Notez de plus le prfixe systmatique du nom des colonnes (attributs) par le nom de la table afin dviter une erreur lie au caractre ambigu du nom. En effet le serveur ne sait pas dans quelle table (ou occurrence dune table) il doit extraire la valeur dun attribut si celui-ci existe dans plusieurs tables (occurrences) sous le mme nom. Utilisation du mot cl DISTINCT Les jointures peuvent rapporter des lignes figurant plusieurs fois dans le jeu de rsultat. Vous pouvez utiliser DISTINCT pour ne conserver quun seul exemplaire des lignes rapportes dans le jeu de rsultat. Exemple de traitement de la diffrence Il faut raliser une jointure gauche et ne retenir que les lments de la table de gauche (LEFT OUTER) ou de droite (RICHT OUTER) ayant des valeurs nulles. Nous introduisons ici la fonction IS NULL permettant dvaluer un attribut de valeur nulle. Liste des avions non affects des vols SELECT AV#,MARQUE,TYPEAVION FROM AVION LEFT OUTER JOIN VOL ON AVION.AV# = VOL.AVION WHERE VOL.AVION IS NULL Exemple de requtes portant sur 3 tables jointes 2 2 Liste des vols avec informations sur pilotes et avions SELECT VOL#, VILLEARRIVEE, VILLEDEPART, AV#,MARQUE, TYPEAVION, PIL#, NOM FROM AVION INNER JOIN VOL ON AVION.AV# = VOL.AVION INNER JOIN PILOTE ON VOL.PILOTE = PILOTE.PIL# HEUREDEPART,

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 12 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

Figure 9 : Illustration de jointure de 3 tables 2 2

Exemple de 2 ensembles issus de 2 jointures 2 2 non dpendantes Dune part des pilotes volant sur des airbus (1er ensemble) Dautre part des pilotes habitant dans une ville qui est le point de dpart dun vol. SELECT VOL.VOL#,VOL.VILLEDEPART,AV#,MARQUE,TYPEAVION,PILOTE.NOM FROM AVION INNER JOIN VOL ON AVION.AV# = VOL.AVION, PILOTE INNER JOIN VOL as VOL2 ON PILOTE.VILLE = VOL2.VILLEDEPART WHERE AVION.MARQUE = 'Boeing' AND AVION.LOCALISATION = PILOTE.VILLE Les 2 ensembles de jointures sont spars par une virgule. Si une table est utilise plusieurs fois, il convient de lui donner un alias.

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 13 - 15

SQL - Sous Ensemble LMD Les oprations de jointure

Pour approfondir le sujet.


Vous trouverez des lments complmentaires sur le site de Microsoft qui comporte un portail consacr SQL Version 2005 et les premiers lments sur la prochaine version venir 2008 Consultez les publications de Frdric Brouard qui reste un expert de rfrence en ce qui concerne SQL et les bases de donnes relationnelles.

Sources de rfrence
Vincent Bost formateur AFPA Brive Frdric Brouard

OFPPT @

Document
M17 - Les operations de jointure.doc

Millsime
septembre 10

Page 14 - 15

Das könnte Ihnen auch gefallen