13.07.2015 Views

Select multi-tables - Site de Bertrand LIAUDET

Select multi-tables - Site de Bertrand LIAUDET

Select multi-tables - Site de Bertrand LIAUDET

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Institut Supérieur d’Informatique Appliquée27 Rue <strong>de</strong> Fontarabie75 020 ParisTél : 01 56 98 21 30www.insia.orgINSIABASES DE DONNEES RELATIONNELLEAlgèbre relationnelle et SQL2 : <strong>Select</strong> <strong>multi</strong>-<strong>tables</strong>B. <strong>LIAUDET</strong>INSIA – Algèbre Relationnelle et SQL - 2 - page 1/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


SOMMAIRESOMMAIRE 2SQL : INTERROGATION DE LA BD – MULTI-TABLES 30. Les opérations s’appliquant à plusieurs <strong>tables</strong> 31. Les jointures naturelles 32. Les jointures artificielles 113. Les requêtes imbriquées 124. Opérations ensemblistes : <strong>tables</strong> ayant les mêmes attributs 185. Equivalence entre les opérations 206. Vue 277. Produits cartésiens et jointures en SQL 2 308. Jointures externes 339. CONNECT BY PRIOR : gestion <strong>de</strong>s arborescences 40ELEMENTS THEORIQUES DE L’ALGEBRE RELATIONNELLE 441. Modèle relationnel 442. Algèbre relationnelle 47Edition : août 2011Evolutions prévues : intégrer le DDL MySQL – Intégrer les usages <strong>de</strong>s calculettes – Intégrer le DDL et SQLspécifiques ORACLE et PostgreSQLINSIA – Algèbre Relationnelle et SQL - 2 - page 2/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


JointureDéfinitionOn peut considérer la jointure comme le concept central <strong>de</strong> l'algèbre relationnelle et donc<strong>de</strong>s bases <strong>de</strong> données relationnelles en général. Comprendre ce qu'est une jointure, c'estprobablement comprendre ce qu'est une base <strong>de</strong> données relationnelle.La jointure <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> c'est leur produit cartésien et la restriction consistant à comparer unattribut <strong>de</strong> la première table à un attribut <strong>de</strong> la <strong>de</strong>uxième table.Joinure = Prooduit cartésien + Restriction <strong>de</strong> jointureRestriction <strong>de</strong> jointure = restriction mettant en jeu <strong>de</strong>ux <strong>tables</strong>.Syntaxe Algèbre relationnelJOIN (table_1, table_2; formule <strong>de</strong> restriction)Syntaxe SQL<strong>Select</strong> *from table_1, table_2where table_1.attribut_1 opérateur table_2.attribut_2;La clause where d'une jointure peut faire intervenir n'importe quel opérateur <strong>de</strong> l'algèbrebooléen. En général, la jointure utilise l'opérateur "=".Les 2 espèces <strong>de</strong> jointureLa jointure naturelleLa jointure artificielleINSIA – Algèbre Relationnelle et SQL - 2 - page 5/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


La jointure naturelleDéfinitionLa jointure naturelle est la jointure qui permet <strong>de</strong> regrouper <strong>de</strong>ux <strong>tables</strong> ayant un attribut encommun particulier : celui <strong>de</strong> la première table est une clé étrangère, celui <strong>de</strong> la <strong>de</strong>uxième est laclé primaire pour sa table, clé correspondant à la clé étrangère <strong>de</strong> la première table.La comparaison entre les <strong>de</strong>ux attributs est une égalité : opérateur "="Syntaxe SQL<strong>Select</strong> *from table_1, table_2where table_1.clé_étrangère = table_2.clé_primaire ;ou encore avec NT2 clé primaire <strong>de</strong> la table_2 :<strong>Select</strong> *from table_1, table_2where table_1.NT2 = table_2.NT2;T1 X T2 Clé 1 • • • # Clé 2 Clé 2 • • •Tuple 1 1 X XTuple 2 2 Y YTuple N N Y YRestriction <strong>de</strong> jointure naturelleLa restriction :where table_1.NT2 = table_2.NT2est appelée “restriction <strong>de</strong> jointure naturelle”.‣ Restriction spécifiqueLes restrictions spécifiques sont les restrictions qui ne sont pas <strong>de</strong>s restrictions <strong>de</strong> jointures.Ce sont les restrictions propres à la question.ExemplesLes ingénieurs : where job = « ingénieur »Du département 10 : where ND = 10Syntaxe Algèbre relationnelJN (table_1, table_2)INSIA – Algèbre Relationnelle et SQL - 2 - page 6/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Table maître et table jointeLa table pour laquelle l’attribut <strong>de</strong> jointure est une clé étrangère est appelée : table maître (outable enfant).La table pour laquelle l’attribut <strong>de</strong> jointure est une clé primaire est appelée : table jointe (outable parent, ou table esclave).Nombre <strong>de</strong> tuplesSi la première table contient TM tuples, la jointure naturelle est une table qui contient :‣ Cas où la clé étrangère est « not NULL »Entre 0 et TM tuplesSi la clé étrangère <strong>de</strong> la jointure est « not NULL », il n’y a pas <strong>de</strong> restriction dans la table maîtreet la jointure naturelle est une table qui contient :Nombre d’attributsMême règle que pour le produit cartésien.Signification : sur-informer une tableTM tuplesLa jointure naturelle permet <strong>de</strong> "sur-informer" la clé étrangère <strong>de</strong> la première table : c’est-àdire<strong>de</strong> faire entrer dans la première table tous les attributs correspondant à la clé étrangère etqu’on trouve dans la <strong>de</strong>uxième table.Clé primaireLa clé primaire d’une jointure naturelle est constituée par la clé primaire <strong>de</strong> la table maître.Graphe <strong>de</strong> la questionExemplesCP = CP_TMLe graphe <strong>de</strong> la question représente les <strong>tables</strong> et les attributs en jeu pour une requête donnée.On l’abor<strong>de</strong>ra dans les exemples.‣ Exemple 1la jointure entre la table employes et la table <strong>de</strong>partements s'écrira :<strong>Select</strong> *from employes E, <strong>de</strong>partments Dwhere E.ND = D.ND ;La table résultant <strong>de</strong> la jointure contient autant <strong>de</strong> tuples que la table employés : ce sont tous lesemployés auxquels on a concaténé le tuple <strong>de</strong> la table <strong>de</strong>partements qui leur correspond.RemarqueDans la restriction <strong>de</strong> jointure, on précise la table d'origine <strong>de</strong> l'attribut (ND) car dans la tablerésultant du produit cartésien <strong>de</strong> employes et <strong>de</strong>partements, il y a <strong>de</strong>ux fois l'attribut ND. Pourpréciser duquel on parle, on précise sa table d'origine.INSIA – Algèbre Relationnelle et SQL - 2 - page 7/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Graphe <strong>de</strong> la questionEmpS(*)DeptS signifie : « select » ou « sortie »* signifie : tous les attributs.La flèche entre Emp et Dept est un lien <strong>de</strong> jointure naturelle : elle montre l’attribut commun :ND, clé primaire <strong>de</strong> Dept, clé étrangère <strong>de</strong> Emp.S(*)On peut mettre le nom <strong>de</strong> l’attribut sur la flèche :S(*)EmpDeptNDS(*)‣ Exemple 2tous les employés appelés 'ALLEN' et le lieu et le numéro <strong>de</strong> département où ils travaillent<strong>Select</strong> NE, nom, E.ND, villefrom employes E, <strong>de</strong>partments Dwhere E.ND = D.NDand nom = 'ALLEN' ;Graphe <strong>de</strong> la questionEmpW(nom)S(NE, nom) DeptS signifie : « select » ou « sortie »W signifie : « where » ou « entrée »S(ND,ville)Remarque 1Comme pour toute restriction-projection primaire, on projette, pour éviter d'avoir <strong>de</strong>s tuples endoubles, la clé primaire <strong>de</strong> la table résultant <strong>de</strong> la jointure, c'est-à-dire la clé primaire <strong>de</strong> la tablecontenant la clé étrangère <strong>de</strong> jointure.Remarque 2Il vaut mieux considérer que la première restriction, c'est la restriction <strong>de</strong> jointure (le wheredans l'exemple). La <strong>de</strong>uxième restriction (le and dans l'exemple) c'est la restriction spécifique<strong>de</strong> la question.INSIA – Algèbre Relationnelle et SQL - 2 - page 8/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Remarque 3Dans la projection, on précise la table d'origine <strong>de</strong> ND car il y a <strong>de</strong>ux attributs ND dans la tablerésultant du produit cartésien. On aurait pu tout aussi bien choisir départements.ND plutôt queemployésND puisque la condition <strong>de</strong> jointure n'a conservé que <strong>de</strong>s valeurs i<strong>de</strong>ntiques pour ces<strong>de</strong>ux attributs.INSIA – Algèbre Relationnelle et SQL - 2 - page 9/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Jointure naturelle réflexives : jointure d’une table avec elle-mêmeDéfinitionSyntaxeLes jointures naturelles réflexives concernent les <strong>tables</strong> qui contiennent une clé étrangère quifait référence à la clé primaire <strong>de</strong> la même table.Dans ce cas, il va falloir renommer les <strong>tables</strong> pour pouvoir les distinguer :<strong>Select</strong> *from table_1 synonyme1, table_2 synonyme2where synonyme1.attribut_1 = synonyme2.attribut_2;ExempleTous les employés et leurs supérieurs hiérarchiques :<strong>Select</strong> E.empno, E.nom, Echef.empno, Echef.nomfrom employes E, employes Echefwhere E.NEchef = Echef.NE;RemarqueDans le cas <strong>de</strong> la jointure <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> i<strong>de</strong>ntiques, tous les attributs <strong>de</strong> la table résultant duproduit cartésien sont en double. Il faut donc forcément préciser pour chaque attribut <strong>de</strong>projection sa table d'origine.Graphe <strong>de</strong> la questionEmpS(NE, nom) EmpNEchefS signifie : « select » ou « sortie »On précise le nom <strong>de</strong> la clé étrangère réflexive.S(NE, nom)Jointure <strong>de</strong> plus <strong>de</strong> <strong>de</strong>ux <strong>tables</strong>On peut faire <strong>de</strong>s jointures sur autant <strong>de</strong> <strong>tables</strong> que l’on veut.Il y a alors autant <strong>de</strong> restrictions qu’il y a <strong>de</strong> <strong>tables</strong> moins une.INSIA – Algèbre Relationnelle et SQL - 2 - page 10/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


2. Les jointures artificiellesDéfinitionJointure en généralLa jointure <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> c'est leur produit cartésien et la restriction consistant à comparerun attribut <strong>de</strong> la première table à un attribut <strong>de</strong> la <strong>de</strong>uxième table.<strong>Select</strong> *from table_1, table_2where table_1.attribut_1 opérateur table_2.attribut_2;Jointure naturelleDans une jointure naturelle, la restriction concerne un attribut clé primaire et un attribut cléétrangère y faisant référence.La comparaison entre les <strong>de</strong>ux attributs est une égalité : opérateur "="Cette restriction peut être appelée restriction <strong>de</strong> jointure naturelle.Jointure artificielleExempleLa jointure artificielle est une jointure dont la restriction n’est PAS une restriction <strong>de</strong> jointurenaturelle : soit elle met en jeu d’autres opérateurs que celui d’égalité, soit elle met en jeu uncouple d’attribut qui n’est pas clé-étrangère et clé-primaire correspondante.Tous les employés ayant le même job que JONES :<strong>Select</strong> distinct e1.NE, e1.nom, e2.jobfrom emp e1, emp e2where e1.job = e2.job-- restriction <strong>de</strong> jointureartificielleand e2.ename = 'JONES' -- restriction spécifique 1and e1.ename 'JONES' -- restriction spécifique 2ExplicationsChaque employé est croisé avec tous les employés (produit cartésien).On ne s’intéresse qu’aux employés <strong>de</strong> e2 qui s’appelle JONES (restriction spécifique 1)La restriction <strong>de</strong> jointure artificielle est faite sur job : on ne gar<strong>de</strong> que les employés <strong>de</strong> e1 quiont le même job que les JONES.On supprime JONES <strong>de</strong> la liste <strong>de</strong>s employés <strong>de</strong> e1 (pour éviter d’avoir JONES dans laréponse).Pour finir, on projette les employés <strong>de</strong> e1.On met un distinct pour le cas où il y ait plusieurs JONES.INSIA – Algèbre Relationnelle et SQL - 2 - page 11/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


3. Les requêtes imbriquéesPrésentationGénéralitésDans une requête imbriquée, on trouve un ou plusieurs select utilisés dans le select principal (lepremier <strong>de</strong> la requête).On distingue entre le select imbriquant (ou principal) et le ou les select imbriqués.On peut avoir autant <strong>de</strong> niveau d’imbrication qu’on veut.2 types <strong>de</strong> select imbriquésLes select imbriqués dans le « from » : le select imbriqué remplace une table.Les select imbriqués dans le « where » : le select remplace une valeur ou une liste <strong>de</strong>valeurs possibles dans une restriction.2 types <strong>de</strong> select imbriqués dans le whereDeux types <strong>de</strong> select imbriqué imbriqué dans le where selon la restriction effectuée :Comparaison <strong>de</strong> chaque tuple du select imbriqué aux tuples du select principal : ALL etANY.Test <strong>de</strong> la cardinalité vi<strong>de</strong> ou pas <strong>de</strong> la table résultat du select imbriqué : EXISTS et NOTEXISTS.Bilan : 3 catégories <strong>de</strong> requêtes imbriqués1. Le select imbriqué dans from qui remplace une table.2. Le select imbriqué dans le where avec comparaison entre le select principal et le selectimbriqué : ALL et ANY3. Les requêtes imbriquées avec test <strong>de</strong> la cardinalité vi<strong>de</strong> ou pas du select imbriqué : EXISTSet NOT EXISTSINSIA – Algèbre Relationnelle et SQL - 2 - page 12/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


<strong>Select</strong> imbriqué dans le fromToute table d’un select peut être remplacée par un autre select.‣ Exemple : nombre moyen d’employés par département<strong>Select</strong> avg(nb)from (<strong>Select</strong> count(*) nbfrom empgroup by nd ) tnb;‣ Remarques syntaxiquesLe select imbriqué est mis entre parenthèses.Le select imbriqué est obligatoirement renommé (« tnb » dans notre exemple).Les attributs projetés dans le select imbriqué sont obligatoirement renommés quand il s’agit<strong>de</strong> fonction <strong>de</strong> groupe.INSIA – Algèbre Relationnelle et SQL - 2 - page 13/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


<strong>Select</strong> imbriqué dans le where : ALL et ANYPrésentationSyntaxeLe select imbrique dans le where avec opérateur ALL ou ANY consiste en une comparaison<strong>de</strong> chaque tuple du select principal avec les tuples du select imbriqué.La syntaxe générale est la suivante :<strong>Select</strong> * from tablewhere liste 1 d'attributs opérateur(<strong>Select</strong> liste 2 d'attributs from ... );‣ L'opérateurc’est un opérateur <strong>de</strong> comparaison booléen classique : =, !=, >, >=,


<strong>Select</strong> NE, nom, job from empwhere job in (<strong>Select</strong> job from empwhere ND = 10);Cas où on peut se passer <strong>de</strong> ANY et <strong>de</strong> ALLSi le <strong>de</strong>uxième select fournit un seul tuple, on peut se passer <strong>de</strong> l’opérateur spécial. On peutpar exemple écrire "=" à la place <strong>de</strong> "= any".C’est le cas particulièrement quand le select imbriqué renvoie une fonction <strong>de</strong> groupe ou quandune restriction s’est faite sur une valeur <strong>de</strong> la clé primaire.INSIA – Algèbre Relationnelle et SQL - 2 - page 15/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


<strong>Select</strong> imbriqué dans le where : EXISTS et NOT EXISTSPrésentationSyntaxeLe select imbrique dans le where avec opérateur EXISTS et NOT EXISTS consiste, pourchaque tuple du select principal, à tester si la cardinalité du select imbriqué est vi<strong>de</strong> oupas.La syntaxe générale est la suivante :<strong>Select</strong> * from tablewhere opérateur (select ...);L'opérateur peut prendre <strong>de</strong>ux valeurs : EXISTS ou NOT EXISTS.En général, le select imbriqué utilise un attribut du select principal qui rend variable sonrésultat en fonction du tuple en cours du select principal.Opérateur EXISTSLes tuples du select principal sont sélectionnés si le select imbriqué produit au moins un tuple.‣ Exemple : tous les employés travaillant dans un département qui contient au moins un'ANALYST' (c'est un métier) :<strong>Select</strong> NE, nom, ND, job from empwhere exists (<strong>Select</strong> * from emp e1where job = 'ANALYST'and e1.ND = emp.ND);‣ ExplicationOn regar<strong>de</strong> s’il existe un ANALYST dont le département est égal à celui du tuple en cours. Sioui, on gar<strong>de</strong> le tuple en cours.‣ RemarqueDans le cas d’un select imbriqué dans le where avec EXISTS, on a forcément une restriction <strong>de</strong>jointure artificielle dans le select imbriqué, sinon le résultat du select imbriqué serait constant etle test EXISTS donnerait soit toujours vrai, soit toujours faux, donc on obtiendrait finalementsoit la conservation <strong>de</strong> tous les tuples du select imbriquant, soit l’élimination <strong>de</strong> tous les tuplesdu select imbriquant.Opérateur NOT EXISTSLes tuples du select principal sont sélectionnés si le select imbriqué ne produit aucun tuples.INSIA – Algèbre Relationnelle et SQL - 2 - page 16/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre IN et EXISTS et entre NOT IN et NOT EXISTSA la place <strong>de</strong> l’exemple précé<strong>de</strong>nt avec un EXISTS , on pourrait écrire avec un IN:<strong>Select</strong> NE, nom, ND, job from emp ewhere ND in (<strong>Select</strong> ND from empwhere = 'ANALYST');Différences entre le IN et le EXISTSLa différence entre le IN et le EXISTS concerne la gestion <strong>de</strong>s valeurs NULL.Quand on utilise un IN, si le select imbriqué renvoie une valeur NULL, le IN vaudra toujoursFAUX.INSIA – Algèbre Relationnelle et SQL - 2 - page 17/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


4. Opérations ensemblistes : <strong>tables</strong> ayant les mêmes attributsPrincipe général <strong>de</strong>s opérations ensemblistesLes opérations ensemblistes s’appliquent à <strong>de</strong>ux <strong>tables</strong> qui ont les mêmes attributs (où plusprécisément <strong>de</strong>s attributs <strong>de</strong> mêmes types).Les opérations ensemblistes sur ces <strong>de</strong>ux <strong>tables</strong> consistent soit regrouper tous les tuples(UNION), soit extraire les tuples en commun (INTERSECTION), soit prendre les tuples d'unetable qui ne sont pas dans l'autre (DIFFERENCE).Remarque :Pour que ces opérations soient significatives, il ne suffit pas que les attributs aient le mêmetype, encore faut-il qu'ils aient la même signification. Dans le cas le plus général, ils seronti<strong>de</strong>ntiques.UnionL'union <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> ayant <strong>de</strong>s attributs <strong>de</strong> mêmes types est une table constituée <strong>de</strong>s attributs<strong>de</strong> la première table et <strong>de</strong> tous les tuples <strong>de</strong>s <strong>de</strong>ux <strong>tables</strong> <strong>de</strong> départ. La syntaxe est la suivante :<strong>Select</strong> liste_1 d'attributs from table_1unionselect liste_2 d'attributs from table 2;‣ Les listes d’attributsElles doivent avoir la même forme dans le where du select principal et dans la projection duselect imbriqué : même nombre d’attributs et même type pour les attributs. Habituellement, cesont les mêmes attributs dans les <strong>de</strong>ux select.‣ Les <strong>tables</strong> <strong>de</strong>s selectLes <strong>de</strong>ux <strong>tables</strong> <strong>de</strong> départ (table_1 et table_2) peuvent avoir <strong>de</strong>s attributs différents. Ce sont les<strong>tables</strong> projetées qui doivent avoir <strong>de</strong>s attributs <strong>de</strong> mêmes types pour pouvoir être unies.‣ Suppression <strong>de</strong>s doublonsLes éventuels doublons sont éliminés automatiquement par l’UNION, comme par toutes lesopérations ensemblistes.‣ Ordre <strong>de</strong>s tuplesLes tuples apparaissent dans l’ordre du premier select suivi par ceux du <strong>de</strong>uxième select.Toutefois, le premier select ne peut pas contenir <strong>de</strong> ORDER BYOn peut trier le résultat final en mettant un ORDER BY à la fin du <strong>de</strong>uxième select.INSIA – Algèbre Relationnelle et SQL - 2 - page 18/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


DifférenceLa différence <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> ayant <strong>de</strong>s attributs <strong>de</strong> mêmes types est une table constituée <strong>de</strong>sattributs <strong>de</strong> la première table et <strong>de</strong>s tuples <strong>de</strong> la première table n'appartenant pas à la <strong>de</strong>uxième :Exemple<strong>Select</strong> liste_1 d'attributs from table_1minusselect liste_2 d'attributs from table 2;Tous les numéros <strong>de</strong>s départements vi<strong>de</strong>s <strong>de</strong> la société (c'est-à-dire les numéros <strong>de</strong>s départementsdans lesquels aucun employé ne travaille) :<strong>Select</strong> <strong>de</strong>ptno from <strong>de</strong>ptminusselect distinct <strong>de</strong>ptno from emp;On soustrait <strong>de</strong> la table <strong>de</strong>s numéros <strong>de</strong> tous les départements la table <strong>de</strong>s numéros <strong>de</strong>sdépartements non vi<strong>de</strong>s (ceux dans lesquels travaille au moins un employé).IntersectionL'intersection <strong>de</strong> <strong>de</strong>ux <strong>tables</strong> ayant <strong>de</strong>s attributs <strong>de</strong> mêmes types est une table constituée <strong>de</strong>sattributs <strong>de</strong> la première table et <strong>de</strong>s tuples <strong>de</strong> la première table appartenant aussi à la <strong>de</strong>uxième :<strong>Select</strong> liste_1 d'attributs from table_1intersectselect liste_2 d'attributs from table_2;INSIA – Algèbre Relationnelle et SQL - 2 - page 19/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


5. Equivalence entre les opérationsPrésentationDe nombreux casIl existe <strong>de</strong> nombreuses équivalences entre différentes opérations <strong>de</strong> l’algèbre relationnelle. Onne va pas les présenter toutes, mais présenter seulement les plus significatives.Raisons <strong>de</strong> choisir une métho<strong>de</strong> plutôt qu’une autreIl y a <strong>de</strong>ux raisons pour choisir une métho<strong>de</strong> plutôt qu’une autre :L’optimisation d’exécution : une métho<strong>de</strong> s’exécute plus vite que l’autre. On peut définir<strong>de</strong>s préférences théoriques pour une métho<strong>de</strong> plutôt que pour une autre. Toutefois, on peutaussi vérifier concrètement, en fonction du SGBD, si une telle métho<strong>de</strong> est effectivementplus efficace que telle autre. La comman<strong>de</strong> EXPLAIN permet ce genre d’analyse.L’optimisation <strong>de</strong> maintenance : une métho<strong>de</strong> est plus facile à maintenir (c’est-à-dire plusfacile à comprendre) que l’autre. Cette raison est subjective : ça dépendra <strong>de</strong>s usages <strong>de</strong>l’entreprise.INSIA – Algèbre Relationnelle et SQL - 2 - page 20/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre jointure naturelle et select imbriqué dans le whereOn peut très souvent transformer jointures naturelles en select imbriqués dans le where.Exemple : tous les employés travaillant à Paris avec leurs n° et leurs nomsVersion avec jointure naturelle :<strong>Select</strong> NE, nom,from emp e, <strong>de</strong>pt dwhere e.ND = d.NDand d.ville = „PARIS‟;équivaut à :Version avec select imbriqué dans le where avec IN<strong>Select</strong> NE, nom, job from empwhere ND = any (<strong>Select</strong> ND from <strong>de</strong>ptwhere ville = „PARIS‟;);équivaut à :Version avec select imbriqué dans le where avec EXISTS<strong>Select</strong> NE, nom, job from emp ewhere EXISTS (<strong>Select</strong> ND from <strong>de</strong>pt dwhere ville = „PARIS‟and e.ND = d.ND);Cas où la transformation est impossibleSi on veut projeter <strong>de</strong>s attributs <strong>de</strong> la table imbriquée (ici : « <strong>de</strong>pt »), il faut forcément passerpar une jointure naturelle.Du bon usage‣ Optimisation d’exécutionOn choisira toujours la jointure naturelle.‣ Optimisation <strong>de</strong> maintenanceOn choisira toujours la jointure naturelle.INSIA – Algèbre Relationnelle et SQL - 2 - page 21/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre jointure artificielle et select imbriqué dans le whereOn peut très souvent transformer les select imbriqués en jointure artificielle.Exemple : tous les employés ayant le même job que les employés du département 10RemarqueVersion avec select imbriqué dans le where avec IN<strong>Select</strong> NE, nom, job from empwhere job = any (<strong>Select</strong> job from empwhere ND = 10)and ND != 10 ;équivaut à :Version avec jointure artificielle :<strong>Select</strong> empno, ename, jobfrom emp e1, emp e2where e1.job = e2.joband e2.ND = 10and e1.ND != 10 ;équivaut à :Version avec select imbriqué dans le where avec EXISTS<strong>Select</strong> NE, nom, job from emp e1where EXISTS (<strong>Select</strong> job from emp e2where ND = 10and e1.job = e2.job)and ND != 10 ;On ajoute « and ND != 10 » pour éviter <strong>de</strong> projeter les employés du département 10 qui ontévi<strong>de</strong>mment le même job que les employés du département 10.Cas où la transformation est impossibleSi on veut projeter <strong>de</strong>s attributs <strong>de</strong> la table imbriquée (ici : « <strong>de</strong>pt »), il faut forcément passerpar une jointure naturelle.Quand on a un NOT IN ou un NOT EXISTS, si le select imbriqué renvoie plusieurs tuples, onne peut pas transformer la requête imbriquée en jointure artificielle. On pourra les transformeren opérations ensemblistes ou en jointures externes.Du bon usage‣ Optimisation d’exécutionOn choisira la jointure artificielle.INSIA – Algèbre Relationnelle et SQL - 2 - page 22/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


‣ Optimisation <strong>de</strong> maintenanceLa jointure artificielle étant un peu compliquée à comprendre, l’optimisation <strong>de</strong> la maintenancepeut conduire à préférer le select imbriqué à la jointure artificielle.La clause EXISTS est un peu compliquée à comprendre. L’optimisation <strong>de</strong> la maintenance peutdonc aussi conduire à préférer la clause IN à la clause EXISTS.INSIA – Algèbre Relationnelle et SQL - 2 - page 23/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre select imbriqué dans le FROM et select imbriqué dans le WHEREQuand le select imbriqué porte sur un résultat statistique, on ne peut pas la transformer enjointure.Par contre on peut transformer un select imbriqué dans le where en un select imbriqué dans lefrom.Exemple : tous les employés gagnants plus que la moyenneVersion avec select imbriqué dans le where :<strong>Select</strong> NE, nom, salfrom empwhere sal > (<strong>Select</strong> avg(sal) from emp);équivaut à :Version avec select imbriqué dans le from :<strong>Select</strong> NE, nom, sal, moysalfrom emp, (<strong>Select</strong> avg(sal) as moysal from emp) tmoywhere sal > moysal;Cas où la transformation est impossibleSi on veut projeter <strong>de</strong>s attributs statistiques <strong>de</strong> la table imbriquée (ici : « avg(sal) »), il fautforcément passer par un select imbriqué dans le from.Du bon usage‣ Optimisation d’exécutionLes <strong>de</strong>ux métho<strong>de</strong>s sont équivalentes théoriquement.‣ Optimisation <strong>de</strong> maintenanceLe select imbriqué dans le from est un peu compliquée à comprendre On choisira donc le selectimbriqué dans le where <strong>de</strong> préférence à un select imbriqué dans le from pour <strong>de</strong>s questionsd’optimisation <strong>de</strong> maintenance.INSIA – Algèbre Relationnelle et SQL - 2 - page 24/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre INTERSECT et select imbriqué dans le where avec INPrincipeVersion avec intersect :<strong>Select</strong> listeAtt1 from table1intersect<strong>Select</strong> listeAtt1 from table2équivaut à :Version avec select imbriqué dans le where et IN<strong>Select</strong> listeAtt1 from table1Where listeAtt1 in (<strong>Select</strong> listeAtt1 from table2);Du bon usage‣ Optimisation d’exécutionLes <strong>de</strong>ux métho<strong>de</strong>s sont équivalentes théoriquement.‣ Optimisation <strong>de</strong> maintenanceL’usage du select imbriqué étant plus courant que celui <strong>de</strong> l’intersect, et MySQL par exemplene proposant pas l’opérateur « INTERSECT », on choisira le select imbriqué dans le where <strong>de</strong>préférence à un « intersect » <strong>de</strong>s questions d’optimisation <strong>de</strong> maintenance.INSIA – Algèbre Relationnelle et SQL - 2 - page 25/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Equivalence entre MINUS et select imbriqué dans le where avec NOT INtous les numéros <strong>de</strong>s départements vi<strong>de</strong>s <strong>de</strong> la sociétéRemarqueOn cherche tous les numéros <strong>de</strong>s départements dans lesquels aucun employé ne travaille.Version avec minus :<strong>Select</strong> <strong>de</strong>ptno from <strong>de</strong>ptminusselect distinct <strong>de</strong>ptno from emp;équivaut à :Version avec select imbriqué dans le where et NOT IN<strong>Select</strong> ND from <strong>de</strong>ptWhere ND not in (select ND from emp);On a vu dans le paragraphe sur les équivalences entre jointure artificielle et select imbriquésque le « NOT IN » ne peut pas être transformé en jointure artificielleDu bon usage‣ Optimisation d’exécutionLes <strong>de</strong>ux métho<strong>de</strong>s sont équivalentes théoriquement.‣ Optimisation <strong>de</strong> maintenanceL’usage du select imbriqué étant plus courant que celui du minus, et MySQL par exemple neproposant pas l’opérateur « MINUS », on choisira le select imbriqué dans le where <strong>de</strong>préférence à un « MINUS » <strong>de</strong>s questions d’optimisation <strong>de</strong> maintenance.INSIA – Algèbre Relationnelle et SQL - 2 - page 26/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


6. VuePrésentationUne comman<strong>de</strong> select peut être conservée dans un objet <strong>de</strong> la BD appelé "vue".On peut ensuite utiliser cet objet <strong>de</strong> type « vue » comme une table. On peut faire <strong>de</strong>sSELECT et, sous certaines conditions, on peut ajouter, modifier ou supprimer <strong>de</strong>s tuplesdans une vue et par conséquent dans la ou les <strong>tables</strong> associées à la vue.Le « contenu » d’une vue n’a pas d’existence physique : il est recalculé à chaque utilisation<strong>de</strong> la vue qui se comporte donc comme un select.Une vue peut être considérée comme une fonction sans paramètres formels retournant unetable.Gestion <strong>de</strong>s vuesCreate viewLa syntaxe <strong>de</strong> la création d'une vue est la suivante :CREATE VIEW nom_vue ASselect …Drop viewLa syntaxe <strong>de</strong> la suppression d'une vue est la suivante :DROP VIEW nom_vue ;Les 2 usages <strong>de</strong>s vues1 : décomposer les requêtes en sous-requêtesExempleUne vue remplacer n’importe quelle table dans un select.Les vues permettent ainsi <strong>de</strong> décomposer l’écriture <strong>de</strong>s requêtes complexes.Tous les employés travaillant dans un département qui contient au moins un 'ANALYST' (c'estun métier).On commence par créer la vue correspondant à la requête : « tous les départements contenantau moins un ANALYST (cf. exemple précé<strong>de</strong>nt) :CREATE or REPLACE VIEW <strong>de</strong>ptAvecAnalyste as<strong>Select</strong> distinct nd from empwhere job = 'ANALYST'or<strong>de</strong>r by nd;Ensuite on traite la requête principale en exploitant la nouvelle vue :<strong>Select</strong> ne, nom from empwhere nd in (select nd from <strong>de</strong>ptAvecAnalyste);INSIA – Algèbre Relationnelle et SQL - 2 - page 27/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


ou :<strong>Select</strong> distinct e.ne, e.nom from emp e, <strong>de</strong>ptAvecAnalyste dwhere e.nd =d.nd;2 : Faciliter et sécuriser l’accès aux données par les utilisateursExempleOn peut créer <strong>de</strong>s vues et ne donner <strong>de</strong>s droits d’accès que sur ces vues : ça favorise lasécurisation et ça facilite l’accès, les vues étant orientées « usage ».La vue permet aussi <strong>de</strong> restreindre l’accès aux tuples.Pour que cet usage soit pertinent, il faut pouvoir appliquer les opérations du DML (INSERT,UPDATE, DELETE) à une vue.On veut limiter les droits d’accès <strong>de</strong> toto@localhost à la consultation du n°, du nom et du job<strong>de</strong>s employés <strong>de</strong>s départements 10 et 20 (table emp, BD emp<strong>de</strong>pt) :Create view vueEmp as<strong>Select</strong> ne, nom, jobFrom emp where nd in (10, 20);Grant SELECT on emp<strong>de</strong>pt.vueEmp to toto@localhost;Les vues modifiablesINSERT, UPDATE et REPLACE dans une vueVue mono-tableOn peut faire <strong>de</strong>s INSERT, <strong>de</strong>s UPDATE et <strong>de</strong>s REPLACE dans une vue mono-table : ilspasseront dans la table correspondante, à condition que toutes les contraintes d’intégrité soientcorrectement prises en compte.Vue <strong>multi</strong>-tableOn peut faire <strong>de</strong>s INSERT, un UPDATE ou un REPLACE dans une vue <strong>multi</strong>-table à conditionque toutes les contraintes d’intégrité <strong>de</strong> la table correspondante soient correctement prises encompte.Mais on ne peut créer, modifier ou remplacer qu’un seul tuple à la fois.DELETE dans une vueVue mono-tableOn peut faire <strong>de</strong>s DELETE dans une vue mono-table : ils passeront dans la tablecorrespondante, à condition que toutes les contraintes d’intégrité soient correctement prises encompte.Vue <strong>multi</strong>-tableOn peut pas faire <strong>de</strong> DELETE dans une vue <strong>multi</strong>-table.INSIA – Algèbre Relationnelle et SQL - 2 - page 28/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Opération qui ren<strong>de</strong>nt une vue non modifiableGroup by,Les Fonction <strong>de</strong> groupe : count(), sum(), etc.Distinct,Union (car il intègre un distinct)Les attributs calculésJointure externeL’utilisation d’un « rownum » : ORACLEExemplesUPDATE emp3000SET <strong>de</strong>ptno=10WHERE SAL > 3500;// modification effectuéeUPDATE emp3000SET sal=4000optionWHERE <strong>de</strong>ptno > 10;// ça ne passera pas du fait du checkDELETE FROM emp3000WHERE sal < 3000;option// ça ne passera pas du fait du checkINSIA – Algèbre Relationnelle et SQL - 2 - page 29/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


7. Produits cartésiens et jointures en SQL 2Les produits cartésiensSyntaxe classique :<strong>Select</strong> *from emp, <strong>de</strong>pt ;Le from peut être remplacé par :‣ JOIN<strong>Select</strong> *from emp join <strong>de</strong>pt ;ou‣ CROSS JOIN<strong>Select</strong> *from emp cross join <strong>de</strong>pt ;ou‣ INNER JOIN<strong>Select</strong> *from emp inner join <strong>de</strong>pt ;Les jointures naturellesSyntaxe classique :<strong>Select</strong> e.NE, e.nom, d.villefrom emp e, <strong>de</strong>pt dwhere e.nd = d.ndwhere ville = “PARIS”;Le from peut être remplacé par :‣ JOINfrom emp e join <strong>de</strong>pt dou‣ CROSS JOINfrom emp e cross join <strong>de</strong>pt dou‣ INNER JOINfrom emp e inner join <strong>de</strong>pt dINSIA – Algèbre Relationnelle et SQL - 2 - page 30/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Le where peut être remplacé par :‣ ON<strong>Select</strong> e.NE, e.nom, d.villefrom emp e join <strong>de</strong>pt don e.nd = d.ndwhere ville = ”PARIS”;ou‣ USING<strong>Select</strong> e.NE, e.nom, d.villefrom emp e join <strong>de</strong>pt dusing ndwhere ville = ”PARIS”;Le from et le where peuvent être remplacés par :‣ NATURAL JOIN<strong>Select</strong> NE, nom, villefrom emp e natural join <strong>de</strong>pt dwhere ville = ”PARIS”;Le natural join fait <strong>de</strong>s restrictions <strong>de</strong> jointure avec tous les attributs <strong>de</strong> même nom <strong>de</strong>s <strong>de</strong>ux<strong>tables</strong> proposées. Donc avec le ND <strong>de</strong> emp et le ND <strong>de</strong> <strong>de</strong>pt, ce qui conduit bien à une jointurenaturelle.Le problème du « natural join »Présentation du problèmeQuand on fait un « natural join », on en général une jointure entre la clé étrangère d’unepremière table et la clé primaire d’une <strong>de</strong>uxième table, à condition qu’elles aient le même nom.Mais si <strong>de</strong>ux autres attributs ont le même nom, il y aura aussi une jointure sur ces <strong>de</strong>uxattributs.Par exemple, si on a un attribut « nom » dans la table <strong>de</strong>s employés et un attribut « nom » dansla table <strong>de</strong>s départements, la « natural join » conduira à une restriction du type :Where emp.nd = <strong>de</strong>pt.ndAnd emp.nom = <strong>de</strong>pt.nom ===>> BUG !Cause du problèmeLe problème vient du fait que la jointure est faite à partir d’un nom d’attribut i<strong>de</strong>ntique entre<strong>de</strong>ux <strong>tables</strong>, ce qui est une considération conventionnelle et pas mathématique.En réalité, le « natural join » est mal fait : il <strong>de</strong>vrait faire la jointure automatiquement entre laune clé étrangère et la clé primaire référencée correspondante.INSIA – Algèbre Relationnelle et SQL - 2 - page 31/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Du bon usage‣ Optimisation d’exécutionUn « natural join » est équivalent à un ON ou un USING ou une jointure en SQL 1.‣ Optimisation <strong>de</strong> maintenanceOn évitera systématiquement le « natural join » qui peut conduire à <strong>de</strong>s erreurs enmaintenance : en effet, si on ajoute un attribut dans une table et qu’il existe déjà un attribut <strong>de</strong>même nom dans une autre table et qu’il existe déjà <strong>de</strong>s « natural join » entre les <strong>de</strong>ux <strong>tables</strong>,alors on aura <strong>de</strong>s erreurs sur ces « natural join ».Exemples avec plusieurs <strong>tables</strong>On veut tous les livres actuellement empruntés d’un adhérent avec la date d’emprunt <strong>de</strong> ceslivresSyntaxe classique :<strong>Select</strong> e.nl, l.editeur, a.na, a.nom, e.datempfrom emprunter e, adherents a, livres lwhere e.na = a.naand e.nl = l.nland e.dateretour is null ;Avec <strong>de</strong>s join<strong>Select</strong> datemp, nl, editeur, na, nomfrom emprunter ejoin adherents a on (e.na=a.na)join livres using(nl)where e.dateretour is null;ou<strong>Select</strong> datemp, nl, editeur, na, nomfrom emprunter ejoin adherents a on (e.na=a.na and e.dateretour is null)join livres using(nl);On peut mettre indifféremment les restrictions spécifiques dans le on ou dans le where. Demême pour les restrictions <strong>de</strong> jointure. L’intérêt <strong>de</strong> cette possibilité apparaîtra avec les jointuresexternes.INSIA – Algèbre Relationnelle et SQL - 2 - page 32/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


8. Jointures externesToutes les possibilités syntaxiques qu’on vient d’abor<strong>de</strong>r n’apportent rien <strong>de</strong> plus par rapport àla syntaxe standard du SQL 1.L’intérêt <strong>de</strong> cette syntaxe est d’ouvrir à la notion <strong>de</strong> jointure externe : outer join (par oppositionà inner join).Présentation <strong>de</strong> la jointure externeDéfinitionUne jointure externe est une jointure qui permet <strong>de</strong> rajouter au résultat <strong>de</strong> la jointure les tupleséliminés d’une <strong>de</strong>s <strong>de</strong>ux <strong>tables</strong> <strong>de</strong> la jointure.Jointure à gauche et jointure à droiteSelon que l’on rajoute les tuples <strong>de</strong> la première table ou <strong>de</strong> la <strong>de</strong>uxième (première ou <strong>de</strong>uxièmedans l’ordre <strong>de</strong> déclaration), on parlera <strong>de</strong> jointure externe à gauche (première table, à gauchedu join) ou à droite (<strong>de</strong>uxième table, à droite du join).Syntaxe <strong>de</strong> la jointure externe à gaucheAprès la jointure, on rajoute les tuples <strong>de</strong> la première table (celle <strong>de</strong> gauche) :<strong>Select</strong> *from t1 left outer join t2on t1.att = t2.att;ou encore, le « outer » étant facultatif :<strong>Select</strong> *from t1 left join t2on t1.att = t2.att;Syntaxe <strong>de</strong> la jointure externe à droiteAprès la jointure, on rajoute les tuples <strong>de</strong> la <strong>de</strong>uxième table (celle <strong>de</strong> doite) :<strong>Select</strong> *from t1 right outer join t2on t1.att = t2.att;ou encore, le « outer » étant facultatif :<strong>Select</strong> *from t1 right outer join t2on t1.att = t2.att;Non commutativité <strong>de</strong> la jointure externeA la différence <strong>de</strong> la jointure interne et du produit cartésien, la jointure externe n’est pascommutative :<strong>Select</strong> *from t1 right join t2on t1.att = t2.att;INSIA – Algèbre Relationnelle et SQL - 2 - page 33/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


n’est pas équivalent à :<strong>Select</strong> *from t1 right join t2on t1.att = t2.att;Semi-commutativité <strong>de</strong> la jointure externeLe « right join » est équivalent au « left join » si on inverse l’ordre <strong>de</strong>s <strong>tables</strong>.<strong>Select</strong> *from t1 right join t2on t1.att = t2.att;est équivalent à :<strong>Select</strong> *from t2 left join t1on t1.att = t2.att;Remarque syntaxique<strong>Select</strong> *from t1 outer join t2 // BUG !!! il faut préciser gauche oudroiteon t1.att = t2.att;La requête précé<strong>de</strong>nte ne veut rien dire! Il faut nécessairement préciser right ou left pour que larequête soit correcte.Ordre <strong>de</strong>s opérations élémentaires dans une jointure externe<strong>Select</strong> *from t1 right join t2on t1.att = t2.attwhere tx.attx = valeur ;L’ordre <strong>de</strong> traitements <strong>de</strong>s opérations élémentaires est le suivant :1) produit cartésien : from2) restriction <strong>de</strong> jointure : on3) jointure externe (ajout <strong>de</strong>s tuples éliminés) : right (ou left)4) restriction spécifique : whereOn comprend ici qu’on pourra mettre <strong>de</strong>s restrictions spécifiques dans le ON pour permettreLes 3 principaux usages <strong>de</strong> la jointure externeLa jointure externe a trois usages principaux :Le premier usage concerne <strong>de</strong>s jointures naturelles avec une table maître et une tablejointe. Il consiste à rajouter les tuples éliminés <strong>de</strong> la table maître et à s’intéresser à tousles tuples <strong>de</strong> la table maître.Le <strong>de</strong>uxième usage concerne <strong>de</strong>s jointures naturelles avec une table maître et une tablejointe. Il consiste à rajouter les tuples éliminés <strong>de</strong> la table jointe et à s’intéresseruniquement au tuples éliminés <strong>de</strong> la table jointe. C’est une soustraction ensembliste.Le troisième concerne les jointures artificielles. Il reprend le second dans le sens ou ils’agit d’une soustraction ensembliste, mais à partir d’une jointure artificielle et avecjointure externe à gauche.INSIA – Algèbre Relationnelle et SQL - 2 - page 34/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


1 er usage : s’intéresser à tous les tuples <strong>de</strong> la table maître : left joinFormalisme : jointure externe à gaucheExempleLa forme générale d’une jointure externe à gauche est :<strong>Select</strong> TJ.NTJ, TJ.CS, TM.NTM, TM.CSfrom table_maitre TM left join table_jointe TJon TM.NTJ = TJ.NTJ;Avec CS : clé significative.En mettant la table maître en premier, on a une jointure à gauche.Question traitée : Afficher les employés avec leurs supérieurs hiérarchiques et les employéssans supérieurs hiérarchique :<strong>Select</strong> e.ne, e.nom, echef.ne, echef.nomfrom emp e left join emp echefon e.nechef = echef.ne ;Résultats :+------+--------+------+-------+| ne | nom | ne | nom |+------+--------+------+-------+| 7369 | SMITH | 7902 | FORD || 7499 | ALLEN | 7698 | BLAKE || 7521 | WARD | 7698 | BLAKE || 7566 | JONES | 7839 | KING || 7654 | MARTIN | 7698 | BLAKE || 7698 | BLAKE | 7839 | KING || 7782 | CLARK | 7839 | KING || 7788 | SCOTT | 7566 | JONES || 7839 | KING | NULL | NULL || 7844 | TURNER | 7698 | BLAKE || 7876 | ADAMS | 7788 | SCOTT || 7900 | JAMES | 7698 | BLAKE || 7902 | FORD | 7566 | JONES || 7934 | MILLER | 7782 | CLARK |+------+--------+------+-------+14 rows in set (0.00 sec)Requête équivalente : UNIONLa jointure externe à gauche classique permet <strong>de</strong> remplacer une union.<strong>Select</strong> e.ne, e.nom, echef.ne, echef.nomfrom emp e join emp echefon e.nechef = echef.neunion<strong>Select</strong> ne, nom, null, null // on ajoute <strong>de</strong>ux attributs à à empfrom empwhere nechef is null;INSIA – Algèbre Relationnelle et SQL - 2 - page 35/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Clé primaireClé primaire = Clé Primaire (Table Maître)On retombe forcément sur la clé primaire <strong>de</strong> la table maître.Nombre <strong>de</strong> tuplesNb Tuples = Nb Tuples (Table Maître)On retombe forcément sur le nombre <strong>de</strong> tuples <strong>de</strong> la table maître.Du bon usageOptimisation d’exécutionLa jointure est théoriquement préférable aux opérateurs ensemblistes classiques, donc à l’union.Optimisation <strong>de</strong> maintenanceLa jointure externe « à gauche » est préférable à l’union qui est compliquée à mettre en œuvre.A noter que l’usage <strong>de</strong> la jointure externe « à gauche » peut être généralisé par défaut pourtoutes les jointures naturelles afin <strong>de</strong> ne pas éliminer les tuples dont la clé étrangère vautNULL.INSIA – Algèbre Relationnelle et SQL - 2 - page 36/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


2 ème usage : s’intéresser aux tuples éliminés <strong>de</strong> la table jointe : right joinFormalisme : jointure externe à droiteExempleLa forme générale d’une jointure externe à droite est :<strong>Select</strong> TJ.*from table_maitresse TM right join table_jointe TJon TM.NTJ = TJ.NTJwhere TM.NTM is NULL;En mettant la table maître en premier, on a une jointure à droite.Question traitée : quels sont les départements vi<strong>de</strong>s :<strong>Select</strong> d.nd, d.nom, d.villefrom emp e right join <strong>de</strong>pt don e.nd = d.ndwhere e.ne is NULL;Résultats :+----+------------+--------+| nd | nomd | ville |+----+------------+--------+| 40 | OPERATIONS | BOSTON |+----+------------+--------+1 row in set (0.01 sec)Requête équivalente : MINUS et INERSECT, NOT IN, NOT EXISTSLa jointure externe à droite classique permet <strong>de</strong> remplacer les opérations ensemblistes MINUSet INTERSECT, et leurs équivalents en NOT IN et NOT EXISTS‣ Version MINUS ( ne marche pas avec MySQL)<strong>Select</strong> *from <strong>de</strong>ptminusselect <strong>de</strong>pt.*from emp e, <strong>de</strong>pt dwhere e.ND = d.ND;‣ Version imbriquée NOT IN<strong>Select</strong> *from <strong>de</strong>ptwhere ND not in (select ND from emp);INSIA – Algèbre Relationnelle et SQL - 2 - page 37/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


‣ Version imbriquée NOT EXISTS<strong>Select</strong> *from <strong>de</strong>ptwhere not exists (select * from empwhere emp.ND = <strong>de</strong>pt.ND);Clé primairePas <strong>de</strong> clé primaire.Nombre <strong>de</strong> tuplesNb Tuples(Table jointe)


3 ème usage : soustraction ensembliste à partir d’une jointure artificielle : left joinExempleQuestion traitée : tous les employés ayant un job différent <strong>de</strong> ceux du département 20<strong>Select</strong> e1.*from emp e1 left join emp e2on e1.job = e2.job and e2.nd=20where e2.ne is NULL;Principe :D’abord, on inverse la question : tous les employés moins ceux qui ont le même job que ceuxdu département 20. C’est une jointure artificielle.On croise tous les employés e1 avec ceux du département 20 (e2) et on gar<strong>de</strong> ceux qui ont unjob i<strong>de</strong>ntique à un employé du département 20La restriction <strong>de</strong> jointure et la restriction spécifique sont faites dans le « on ».Ensuite, on prend le complément du résultat précé<strong>de</strong>nt, ce qui répond à la question. Le « left »rajoute les employés <strong>de</strong> e1 qui ont été éliminés : ceux qui ont un job différent <strong>de</strong> ceux dudépartement 20.Enfin, on restreint à ce seul complément avec le where.Il faut donc faire bien attention à mettre toutes les restrictions souhaités dans le « on » avant quele « left » s’applique et rajoute les tuples éliminés.Requête équivalente : MINUS, NOT IN, NOT EXISTSLa jointure externe à droite classique permet <strong>de</strong> remplacer les opérations ensemblistes MINUSet INTERSECT, et leurs équivalents en NOT IN et NOT EXISTS‣ Version imbriquée NOT IN<strong>Select</strong> *from empwhere job not in (select job from empwhere nd=20);Du bon usageOptimisation d’exécutionLa jointure est théoriquement préférable à la requête imbriquée.Optimisation <strong>de</strong> maintenanceLa jointure externe étant un peu compliquée à comprendre, l’optimisation <strong>de</strong> la maintenancepeut conduire à préférer le select imbriqué à la jointure externe.INSIA – Algèbre Relationnelle et SQL - 2 - page 39/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


9. CONNECT BY PRIOR : gestion <strong>de</strong>s arborescencesPrésentationPrincipesLes <strong>tables</strong> avec <strong>de</strong>s auto-jointures peuvent être considérées comme <strong>de</strong>s structures d’arbres.On part <strong>de</strong> l’arbre suivant qui décrit l’organigramme d’une entreprise.78397698 7782 75667844 7654 7499 7900 7521 7902 77887369 7876On souhaite pouvoir faire plusieurs choses :1. Afficher tous les arbres : chaque nœud est considéré comme une racine.2. Sélectionner un arbre3. Afficher toutes les branches : <strong>de</strong> chaque nœud, on remonte à la racine.4. Sélectionner une branche5. Elaguer <strong>de</strong>s branches6. Elaguer <strong>de</strong>s arbresSolution SQL ServerLe type « HierarchyId » <strong>de</strong> SQL Server permet <strong>de</strong> gérer une structure d’arbre.Solution ORACLEPrincipesORACLE offre une clause : CONNECT BY PRIOR, qui va permettre <strong>de</strong> réaliser facilement lesopérations précé<strong>de</strong>ntes.Chaque nœud est considéré comme une racine.On a donc autant d’arbres que <strong>de</strong> nœuds.Les arbres les plus simples sont constitués d’un seul nœud : une feuille <strong>de</strong> l’arbre d’origine.INSIA – Algèbre Relationnelle et SQL - 2 - page 40/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


ExempleDans notre exemple, on se retrouve avec 13 arbres :78397698 7782 75667844 7654 7499 7900 7521 7902 77887369 78767698 7782 75667844 7654 7499 7900 7521 7902 77887369 78767844 7654 7499 7900 7521 7902 77887369 78767369 7876INSIA – Algèbre Relationnelle et SQL - 2 - page 41/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Première approcheprincipesselect level, empno, mgr // level : niveau <strong>de</strong> l‟enfant dsl‟arbrefrom empconnect by prior empno=mgr; // CONNECT BY PRIOR enfant =parentPrincipe du CONNECT BY PRIOR empno=mgr :CONNECT BY PRIOR enfant = parent« level » est une pseudo-colonne qui donne la « hauteur » <strong>de</strong> l’enfant dans l’arbre.Le nœud <strong>de</strong> départ étant à 1, les feuilles <strong>de</strong> l’arbre d’origine ont toujours la hauteur la plusélevée.résultatsLEVEL EMPNO MGR---------- ---------- ----------1 7902 75662 7369 79021 7788 75662 7876 77881 7654 76981 7499 76981 7900 76981 7521 76981 7844 76981 7876 77881 7698 78392 7654 76982 7499 76982 7900 76982 7521 76982 7844 76981 7782 78391 7566 78392 7902 75663 7369 79022 7788 75663 7876 77881 7369 79021 78392 7698 78393 7654 76983 7499 76983 7900 76983 7521 76983 7844 76982 7782 78392 7566 78393 7902 75664 7369 79023 7788 75664 7876 778836 ligne(s) sélectionnée(s).INSIA – Algèbre Relationnelle et SQL - 2 - page 42/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Présentation en arbresprincipesselect lpad(' ',4*level-4) || empno arbrefrom empconnect by prior empno=mgr;La fonction LPAD (chaine, nb) fabrique une chaine <strong>de</strong> « nb » caractères dont ceux <strong>de</strong> droiteseront constitué par « chaîne ». Ici, elle nous permet <strong>de</strong> décaler l’affichage <strong>de</strong> « empno » enfonction du « level ».Ainsi, on peut voir les 13 racines <strong>de</strong>s 13 arbres possibles.On voit aussi les 8 feuilles (mais qui apparaissent plusieurs fois en tant que feuilles)résultatsARBRE----------------------------------------------------------------79027369778878767654749979007521784478767698765474997900752178447782756679027369778878767369783976987654749979007521784477827566790273697788787636 ligne(s) sélectionnée(s).INSIA – Algèbre Relationnelle et SQL - 2 - page 43/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


ELEMENTS THEORIQUES DE L’ALGEBRERELATIONNELLE1. Modèle relationnelDomaineUn domaine c'est un ensemble <strong>de</strong> valeurs (que peut prendre un prédicat ou attribut). Il est définien intension ou en extension. Il est non vi<strong>de</strong>.Exemples <strong>de</strong> domainel'alphabet, domaine défini en extension;une chaîne <strong>de</strong> 20 caractères, défini en intension (toutes les combinaisons possibles <strong>de</strong> lettresentre 1 et 20 caractères).les entiers, domaine défini en intension;les entiers compris entre 0 et 100, domaine défini en extension;l'ensemble <strong>de</strong> couleurs {bleu, rouge, vert, marron}, domaine défini en extension.Relation (table)Une relation n-aire (ou table) est un sous-ensemble du produit cartésien d'une liste <strong>de</strong> domainesD1, D2, …, Dn.R = sous ensemble <strong>de</strong> D1 x D2 x … x DnUne relation peut être vue comme un tableau à <strong>de</strong>ux dimensions dont les colonnescorrespon<strong>de</strong>nt aux domaines (et donc aux attributs) et les lignes correspon<strong>de</strong>nt aux élémentsindividuels.AttributUn attrbut est une fonction entre une relation et un domaine auquel on ajoute la valeur NULL,cette valeur voulant dire « non défini ».Une relation R définie sur n attributs est notée :Ai : R Di {NULL}R(A1, A2, …, An)Un attribut c'est une colonne d'une relation caractérisée par un nom. L’ordre <strong>de</strong>s colonnes dansla relation n’a pas d’importance.INSIA – Algèbre Relationnelle et SQL - 2 - page 44/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


TupleUn tuple est un n-uplet du produit cartésien d'une liste <strong>de</strong> domaines.Le tuple, c’est une ligne <strong>de</strong> la table. L’ordre <strong>de</strong>s lignes dans la table n’a pas d’importance.Exemple :Un tuple <strong>de</strong> la table <strong>de</strong>s employés, c’est un sext-uplet du produit cartésien entre le domaine <strong>de</strong>sn°, <strong>de</strong>s noms, <strong>de</strong>s fonctions, <strong>de</strong>s dates, <strong>de</strong>s salaires et <strong>de</strong>s commissions.CléDéfinitionLa clé d’une table est un sous-ensemble d'attributs qui détermine tous les autres attributs.Ce sous-ensemble est tel que tous les attributs sont nécessaires pour former la clé.Soit R une relation n-aire : R(A1, A2, …, An)Soit l’ensemble d’attrbuts {Ai..Ak} avec {i, .., k}Soit f la fonction entre R et Di x … x Dk. f : R[1 :n]Di x… x DkL’ensemble d’attrbuts {Ai..Ak} est une clé <strong>de</strong> R si et seulement si :Obligation <strong>de</strong> la cléToute relation possè<strong>de</strong> au moins une clé.x, y R, x != y f(x) != f(y)Donc, il n’y a jamais <strong>de</strong> doubons dans une relation.Clé irréductibleDéf. (clé irréductible) : une clé C sur R est dite irréductible si et seulement si pour tout autreensemble d’attributs D C, D n’est pas une clé.Clé minimaleDéf. (clé minimale) : une clé C sur R est dite minimale s’il n’existe aucune autre clé sur Rimpliquant un moins grand nombre d'attributs.Clé candidateDéf. (clé candidate) : toute clé <strong>de</strong> taille minimale est une clé candidate.Clé primaireDéf. (clé primaire) : la clé unique choisie par le concepteur <strong>de</strong> la base parmi les clés candidatesest clé primaire.Clé étrangèreDéf. (clé étrangère) : une clé étrangère est un attribut qui fait référence à un attribut cléprimaire.INSIA – Algèbre Relationnelle et SQL - 2 - page 45/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Dépendance fonctionnelleUn attribut Y (ou premier groupe d’attributs) dépend fonctionnellement d’un attribut X (ousecond groupe d’attributs), si étant donné une valeur <strong>de</strong> X, il lui correspond une valeur unique<strong>de</strong> Y (et ceci quel que soit l’instant considéré).On dit que X détermine fonctionnellement Y et on note :X - > YConcrètement, les clés d’une relation déterminent fonctionnellement tous les autres attributs <strong>de</strong>la relation.INSIA – Algèbre Relationnelle et SQL - 2 - page 46/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


2. Algèbre relationnellePrésentation2 opérateurs élémentaires unaires2 opérateurs spécifiques : projection et restriction5 opérateurs élémentaires binaires5 opérateurs ensemblistes : union, intersection, différence, division, produit cartésien1 opérateur composé fondamental1 opérateur composé : jointure (composé d’un produit cartésien et d’une restriction)résultatLe résultat <strong>de</strong> l’application d’un opérateur sur une ou plusieurs relations est une relation.Les 2 opérateurs unaires : projection et restrictionProjectionProjeter <strong>de</strong>s attributs d’une relation consiste à ne conserver que ces attributs dans la relationrésultante et donc se séparer <strong>de</strong>s autres.‣ Formulation mathématiqueSoit R une relation n-aire : R(A1, A2, …, An)Soit l’ensemble d’attributs L = {Ai, .. ,Ak} avec {i, .., k}On peut aussi écrire :ou encore :L (R) = R’(Ai, .. ,Ak)[1 :n]Ai..Ak (R) = R’(Ai, .. ,Ak)Proj (R ; Ai, .. ,Ak)INSIA – Algèbre Relationnelle et SQL - 2 - page 47/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


‣ Représentation graphiqueLRSchéma générala ba aa b ca a bA1 A2 A3ExempleA1,A2RRestrictionLa restriction consiste à ne conserver que certains tuples <strong>de</strong> la relation <strong>de</strong> départ.‣ Formulation mathématiqueSoit R est une relation et C une condition, alorsOn peut aussi écrire :C (R) = { x R et C(x) }Rest(R ; C)‣ Représentation graphiqueCRSchéma générala ba aa b ca a bA1 A2 A3ExempleA2=bRINSIA – Algèbre Relationnelle et SQL - 2 - page 48/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


Les 5 opérateurs ensemblistesUnion, intersection, différence‣ Formulation mathématiqueUnion, intersection et différence sont <strong>de</strong>s opérateurs binaires.L’union et l’intersection sont <strong>de</strong>s opérateurs commutatifs, la différence un opérateur noncommutatif.Les relations doivent avoir les mêmes attributs.Soit R1 et R2 <strong>de</strong>ux relations, alorsOn peut aussi écrire :‣ Représentation graphiqueUnion : R1 R2 = { x tel que x R1 ou x R2 }Intersection : R1 R2 = { x tel que x R1 et x R2 }Différence : R1 - R2 = { x tel que x R1 et x R2 }Union(R1, R2)Etc.Avec « o » pour un opérateur parmi l’union, l’intersection ou la différence.Division‣ Formulation mathématiqueLa division est un opérateur binaire non commutatif.Soit B une relation n-aire : B(A1, A2, …, An)Soit A une relation m-aire : A(A1, A2, …, An, An+1, …, Am) avec m > n.A / B est une relation R définie par les attributs (An+1, …, Am)A B = { x R tel que y B, x y A }On peut aussi écrire :Division(A, B)INSIA – Algèbre Relationnelle et SQL - 2 - page 49/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


‣ Représentation graphiqueMême principe que pour l’union, l’intersection et la différence.‣ ExempleProduit cartésienA X / X = AA Y YA‣ Formulation mathématiqueBCLe produit cartésien est un opérateur binaire commutatif.ZXYSoit R1 et R2 <strong>de</strong>ux relations, alorsR1 R2 = { (x, y) tel que x R1 et y R2 }Remarque : le produit cartésien est le seul opérateur qui permet <strong>de</strong> produire une tableregroupant les attributs <strong>de</strong> <strong>de</strong>ux <strong>tables</strong>.On peut aussi écrire :‣ Représentation graphiquePC (R1, R2)Même principe que pour l’union, l’intersection et la différence.‣ ExempleA A X = A A XA B Y A A YZ A A ZA B XA B YA B ZINSIA – Algèbre Relationnelle et SQL - 2 - page 50/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>


L’opérateur composé : la jointureFormulation mathématiqueUne jointure est un produit cartésien associé à une restriction <strong>de</strong> jointure.Soit A une relation : A(A1, A2, …, An)Soit B une relation : B(B1, B2, …, Bm)Une condition <strong>de</strong> jointure entre A et B est une condition qui met en jeu au moins un Ai et unBi.Soit C une condition <strong>de</strong> jointure entre A et B, alorsR1 R2 = C (R1 R2 ) = { (x, y) tel que x R1 et y R2 et C(x,y)}COn peut aussi écrire :J (R1, R2; C)Distinction entre jointure naturelle et jointure artificielleAttention : cette distinction ne correspond pas au modèle relationnel standard.Une jointure naturelle est une jointure dont la condition est <strong>de</strong> la forme :R1.cléEtrangère = R2.cléPrimaireElle produit une relation dont la clé primaire est celle <strong>de</strong> R1.On peut écrire :JN (R1, R2)Une jointure artificielle est une jointure qui n’est pas naturelle.Représentation graphique Une jointure artificielle est une jointure qui n’est pas naturelle.INSIA – Algèbre Relationnelle et SQL - 2 - page 51/51 - <strong>Bertrand</strong> <strong>LIAUDET</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!