Академический Документы
Профессиональный Документы
Культура Документы
181
Nous allons prsenter la philosophie du langage en matire dinterrogation de la base de donnes en vue dexpliquer comment se fait la mise en uvre des oprateurs de lalgbre relationnel dans SQL. Il faut ds lors souligner que notre objectif nest ni de vous enseigner la pratique de SQL, car il y a dautres ouvrages pour a, ni de vous convaincre de lutiliser parce que tout le monde en parle et que presque tous les soit disant SGBD sur PC proposent une interface de type de SQL.
FROM :
WHERE :
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
182
O chaque Ai reprsente un attribut, chaque Ri reprsente une relation et C reprsente une condition ou une qualification. Une telle requte est quivalente lexpression de lalgbre relationnelle suivante : A1 , A2 , ......., An (C (R1 x R2 x ......x Rm)) Ainsi, on peut dire que lvaluation de la requte va consister calculer le produit cartsien entre les relations Ri figurant dans la clause FROM, puis appliquer au rsultat obtenu lopration de slection C de lalgbre relationnelle en utilisant la condition C figurant dans la clause WHERE, et enfin appliquer au rsultat obtenu lopration de projection A1 , A2 , ......., An de lalgbre relationnelle en utilisant la liste des attributs Ai figurant dans la clause SELECT de la requte. Nanmoins, il faut souligner que ce schma dvaluation est trop simpliste car dans la pratique, le SGBD peut tre amen convertir une requte en une autre requte quivalente mais plus performante en terme de temps dexcution et ce en utilisant les proprits des oprateurs de lalgbre relationnelle. Afin de bien illustrer les possibilits de SQL en matire dinterrogation dune base de donnes relationnelle, nous allons nous servir du schma relationnel suivant : EMPLOYES (Num_Emp, Nom_Emp, Fonction, Salaire, Prime, Num_Resp , Num_Dept) DEPARTEMENTS (Num_Dept, Nom_Dept , Ville) La signification des attributs de la relation EMPLOYES est la suivante : Num_Emp Nom_Emp Fonction Salaire Prime Num_Resp Num_Dept : numro de lemploy : nom de lemploy : fonction de lemploy : salaire de lemploy : montant de la prime que peroit lemploy : numro du responsable de lemploy : numro du dpartement dans lequel travaille lemploy
La signification des attributs de la relation DEPARTEMENTS est la suivante : Num_Dept Nom_Dept Ville : numro du dpartement : nom du dpartement : nom de la ville ou se trouve le dpartement
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
183
et nous considrerons les extensions suivantes : Num_Dept 10 20 30 40 Nom_Dept Comptabilit Recherches Ventes Fabrication Ville Batna Batna Alger Oran
Relation DEPARTEMENTS Num_Emp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nom_Emp Ali Rachid Kamel Omar Brahim Farouk Lyes Tahar Malik Louisa Fatma Nadia Ahmed Kader Fonction Ingnieur Vendeur Vendeur Directeur Vendeur Directeur Directeur Analyste Prsident Vendeur Ingnieur Ingnieur Analyste Ingnieur Num-Resp 13 6 6 9 6 9 9 4 6 8 6 4 7 Salaire 800 1600 1250 2975 1250 2850 2450 3000 5000 1500 1100 950 3000 1300 Prime 300 500 1400 Num_Dept 20 30 30 20 30 30 10 20 10 30 20 30 20 10
Relation EMPLOYES Les cases vides traduisent le fait que la valeur de lattribut est indfinie pour lemploy correspondant. Ce sont justement ce que nous avons appel dans le chapitre 3 des valeurs NULL. Une valeur NULL ne signifie pas une valeur gale a zro bien que SQL offre des possibilits pour convertir une valeur NULL en une autre valeur numrique (par exemple en 0 ) dans les expressions de calcul utilisables dans une requte.
184
que parce que les arguments de ces oprations sont supposes tre des relations qui sont des ensembles au sens mathmatique du terme cest dire ne contenant pas de tuples dupliqus. Dans le cas o une relation pouvait contenir un tuple en double, beaucoup de proprits des oprateurs de lalgbre relationnelle seraient remises en cause. Q1: Donner les noms de tous les employs et le salaire de chacun d'eux ? SELECT Nom_Emp , Salaire FROM EMPLOYES Q2: Liste de tous les Dpartements dans lesquels travaille au moins un employ? SELECT DISTINCT FROM Num_Dept EMPLOYES
On a rajout le mot cl DISTINCT car le mme numro de Dpartement peut apparatre plusieurs fois dans le rsultat du fait que plusieurs Employs diffrents peuvent travailler dans un mme dpartement. Q3: Lister tous les tuples de la relation DEPARTEMENTS ? SELECT Num_Dept , Nom_Dept , Ville FROM DEPARTEMENTS On voit que la liste des attributs aprs la clause SELECT inclut tous les attributs de la relation DEPARTEMENTS. Pour simplifier lcriture dune telle requte, SQL permet de les formuler comme suit : SELECT * FROM DEPARTEMENTS ou le SELECT * signifie : " Slectionner tous les attributs de la relation DEPARTEMENTS "
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
185
Q5: Quels sont les numros et les noms des employs travaillant dans le dpartement numro 10 ? SELECT Num_Emp, Nom_Emp FROM EMPLOYES WHERE Num_Dept = 10 Le rsultat de cette requte est identique a celui de la question Q4 sauf qu'ici on aura uniquement une relation forme de deux colonnes (attributs) qui sont Num_Emp et Nom_Emp et non pas une relation forme de tous les attributs comme ctait le cas pour Q4 cause de la clause SELECT *. On peut ventuellement ordonner le rsultat dune requte grce la clause ORDER BY. Pour cela, il suffit de spcifier dans cette clause le ou les attributs selon lesquels on dsire ordonner le rsultat ainsi que le critre ascendant ou descendant. La condition de la clause WHERE peut utiliser les oprateurs tels que: = , > , , < , , != , AND , OR , NOT , BETWEEN , LIKE , IN , ANY, ALL, EXIST, .... } BETWEEN IN LIKE ANY ALL EXIST : Test d'appartenance un intervalle : Test d'appartenance dune valeur un ensemble : Test de ressemblance de chanes de caractres : Comparaison dune valeur une valeur quelconque dun ensemble : Comparaison dune valeur toutes les valeurs dun ensemble : Test dexistence dun tuple dans une relation (Quantificateur existentiel )
Q6:
Quels sont les numros et les noms des employs du dpartement numro 10 et qui ont un salaire suprieur 1000 ? SELECT Num_Emp, Nom_Emp FROM EMPLOYES WHERE Num_Dept = 10 AND Salaire > 1000
Q7:
Quels sont les fonctions exerces par les employs des dpartements 10 et 20 en liminant les tuples en double du rsultat?
(a) : avec IN (b): avec OR Fonction EMPLOYES Num_Dept IN (10 , 20 )
SELECT DISTINCT Fonction FROM EMPLOYES WHERE Num_Dept = 10 OR Num_Dept = 20
Q8:
Quels sont les fonctions dont le salaire est compris entre 2000 et 3000?
(b): avec AND
Fonction EMPLOYES Salaire 2000 AND 3000 SELECT DISTINCT FROM WHERE AND Fonction EMPLOYES Salaire >= 2000 Salaire < = 3000
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
186
Q9: Quels sont les employs du dpartement numro 10 commence par la lettre B ? SELECT Nom_Emp FROM EMPLOYES WHERE Num_Dept = 10 AND Nom_Emp LIKE B%
dont le nom
Le symbole % reprsente nimporte quelle chane de caractres. Il existe dautres possibilits de comparaisons avec loprateur LIKE. Par exemple, pour rechercher les employs dont le nom se termine par la lettre R , il suffit dutiliser %R comme argument de LIKE. Q10: Quels sont les employs du dpartement numro 10 dont la fonction nest ni Ingnieur ni Analyste ? SELECT FROM WHERE AND Nom_Emp EMPLOYES Num_Dept = 10 NOT (Fonction = Ingnieur OR Fonction = Analyste )
Il est important ce niveau de prciser que la rponse une mme question peut tre obtenue avec une ou plusieurs requtes diffrentes utilisant chacune un ou des oprateur(s) diffrent(s). Il est aussi possible dexprimer en SQL les oprations algbriques UNION, PRODUIT CARTESIEN, JOINTURE , INTERSECTION , DIFFERENCE et DIVISION. Certaines oprations algbriques ne sont pas directement supportes par SQL car ce dernier ne proposant pas un oprateur spcifique pour les exprimer directement. Cependant, il existe toujours une possibilit pour les traduire en termes des oprateurs offerts par le langage. Cest le cas par exemple des oprations algbriques de JOINTURE , DIFFERENCE , INTERSECTION et DIVISION. Nous verrons comment les traduire en fonction des possibilits du langage dans le cas ou ce dernier ne les supporte pas directement.
Q11: Quels sont les fonctions exerces par les employs des dpartements 10 et 20 en liminant les tuples en double du rsultat? (mme que Q7)
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
187
WHERE
Par dfaut, lopration dUNION (requte (a) ) limine les tuples en double du rsultat. Si on veut les garder, on doit utiliser UNION ALL (requte (b) ) la place de UNION tout court comme cidessus. Cette question tant la mme que Q7, nous avons vu que dans la requte correspondant Q7, on avait explicitement demand llimination des tuples en double grce au mot cl DISTINCT.
On remarque l'absence de la clause WHERE puisque comme il a t prcis on n'a pas besoin de spcifier une condition pour avoir le produit cartsien. Dans la dfinition de lopration de produit cartsien, nous avons not que cette opration ne peut tre value que si les deux relations navait pas dattributs en commun. Dans le cas o les deux relations avaient des attributs en commun (cest dire ayant les mme noms), il fallait dabord les renommer pour tre mme de calculer le produit cartsien de ces relations. Or dans notre exemple, les relations EMPLOYES et DEPARTEMENTS ont un attribut en commun savoir Num_Dept. et pourtant nous ne lavons pas renomm dans une de ces relations avant de calculer le produit cartsien. Ceci est d au fait quavec SQL le renommage nest pas ncessaire puisque ce dernier prfixe automatiquement un attribut avec le nom de sa relation selon la notation pointe Nom_de_Relation.Nom_Attribut. Ainsi le nom effectif de lattribut Num_Dept de la relation EMPLOYES est EMPLOYES.Num_Dept et celui de la relation DEPARTEMENTS est DEPARTEMENTS. Num_Dept ce qui vite tout problme dambigut. Il est aussi tout fait possible de prfixer dans une requte un attribut apparaissant dans une clause SELECT ou une clause WHERE avec le nom de sa relation comme dans la requte suivante (mme que Q6) : SELECT FROM WHERE EMPLOYES.Num_Emp, EMPLOYES.Nom_Emp EMPLOYES Num_Dept = 10 AND Salaire > 1000
Bien que cette criture soit juste, aucun problme dambigut ne se pose dans cet exemple puisque on est sr que les attributs Num_Emp et Nom_Emp appartiennent la relation EMPLOYES. Le prfixage nest donc pas ncessaire. Nanmoins, dans certaines requtes, surtout celles mettant en jeu
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
188
les jointures, on sera trs souvent amen utiliser cette notation afin de lever toute ambigut dans la dsignation des attributs.
Si on se rfre la dfinition de l'opration algbrique R-S, on remarque que la premire relation R correspond au le rsultat de la sous-requte : SELECT FROM WHERE Num_Dept DEPARTEMENT Fonction ='VENDEUR'
qui contiendra les numros de tous les dpartements dans lesquels travaille au moins un employ ayant pour fonction VENDEUR alors que la deuxime relation S correspond au rsultat de la sousrequte : SELECT FROM WHERE Num_Dept DEPARTEMENT Fonction ='INGENIEUR'
qui contiendra les numros de tous les dpartements dans lesquels travaille au moins un employ ayant pour fonction INGENIEUR.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
189
Daprs la dfinition de lopration MINUS, le rsultat sera l'ensemble des tuples appartenant R mais pas S. Donc si un mme dpartement possde au moins un employ ayant pour fonction VENDEUR (figure dans R) et possde aussi au moins un employ ayant pour fonction INGENIEUR (figure aussi dans S) alors ce dpartement ne figurera pas dans le rsultat de R-S, ce qui rpond bien la question.
X
EMPLOYES o la condition C est : DEPARTEMENTS
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
190
Q15:
Quels sont les noms ,les fonctions et les salaires des employs du dpartement RECHERCHES dont le salaire est suprieur 1000 ? SELECT Nom_Emp , Fonction , Salaire FROM EMPLOYES , DEPARTEMENTS WHERE EMPLOYESNum_Dept = DEPARTEMENTSNum_Dept AND Nom_Dept = 'RECHERCHE' AND Salaire > 1000
On remarque que le prfixage dun attribut avec le nom de sa relation nest utilis que pour Num_Dept qui est commun aux deux relations participant dans la jointure. La condition spcifie dans la clause WHERE correspond la condition de jointure C. Il est galement possible d'imbriquer des blocs : SELECT ... FROM ...WHERE .. plusieurs niveaux. Q16: Quels sont les noms et les fonctions des employs travaillant BATNA et ayant la mme fonction que lemploy AHMED ? Cette jointure peut s'exprimer sous forme de blocs SELECT imbriqus. SELECT Nom_Emp , Fonction FROM EMPLOYES , DEPARTEMENTS WHERE Ville = 'BATNA' AND EMPLOYESNum_Dept = DEPARTEMENTSNum_Dept AND Fonction IN ( SELECT Fonction FROM EMPLOYES WHERE Nom_Emp = 'AHMED' )
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
191
Il nest pas obligatoire de spcifier tous les attributs apparaissant dans la clause SELECT de la requte ci-dessus car SQL ignore quil sagit dune jointure naturelle. On peut mme ne spcifier dans la clause SELECT quun sous ensemble dattributs de la liste V seulement. Dans le cas o on utilise un SELECT * , on aura comme rsultat une relation ayant pour schma lunion des attributs de X1 et X2 (mme schma que la relation rsultant du produit cartsien X1 x X2 ) cest dire tous les attributs de X1 plus tous les attributs de X2 indpendamment du fait que X1 et X2 ont les mmes attributs. Rappelons que la notation pointe utilise par SQL pour dsigner un attribut X1.nom_Attribut ou X2.nom_Attribut fait que les attributs communs deux relations de la base de donnes possdent au niveau interne de SQL des noms distincts du fait du prfixage et ce mme si au niveau du schma ils ont les mmes noms.
9.3 Equi-Jointure
Cette opration nexiste pas aussi dans SQL. Cependant, il est possible de lexprimer de la mme manire que la jointure avec qualification puisque la seule diffrence est que dans lqui-jointure l'oprateur de comparaison utilis dans la condition de jointure est l'oprateur d'galit ( = ).
9.4
Pour rpondre certaines questions, on peut parfois tre amen faire la jointure d'une table avec elle-mme. Le problme qui se pose alors est comment distinguer les attributs. La solution qui est largement utilise est de dsigner dans la clause FROM de la requte SQL la relation (ou table) par deux noms diffrents appels synonymes. Avec SQL, lassociation dun nom synonyme une table consiste faire suivre le nom de la table par le nom synonyme qui nest autre quun identificateur au sens informatique du terme. Q17: Quels sont les noms et les fonctions des employs ayant un salaire suprieur celui de lemploy dont le nom est 'ALI' SELECT FROM WHERE AND X1.Nom_Emp , X1.Fonction EMPLOYES X1 , EMPLOYES X2 X1.Salaire > X2.Salaire X2.Nomp_Emp = 'ALI'
X1 et X2 sont les noms synonymes dsignant la table EMPLOYES. Cette requte peut tre vue comme une requte ayant pour arguments dans la clause FROM deux tables X1 et X2 ayant le mmes attributs et la mme extension que EMPLOYES. Lvaluation de la requte va consister calculer le produit cartsien entre deux les tables X1 et X2, puis de slectionner les tuples du rsultat pour lesquels la colonne X1.Salaire > X2.Salaire et la colonne X2.Nomp_Emp = 'ALI' . Enfin, on fait une projection sur les colonnes X1.Nom_Emp et X1.Fonction qui sera alors la relation rpondant cette question. Ainsi, le schma de la relation rsultat du produit cartsien X1 x X2 sera : Attributs de X1Num_Emp la Table X1 Attributs de X2Num_Emp . .
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
la
Table
X2
X2Nom_Emp X2Salaire
192
Aprs slection des lignes ou tuples satisfaisant la condition : X1Salaire > X2Salaire AND X2Nomp_Emp = 'ALI' , la projection permet de retenir les colonnes X1Nom_Emp et X1Fonction Un autre exemple dauto-jointure est : Q18: Quels sont les noms des employs ayant le mme responsable ? SELECT EMP1Nom_Emp , EMP2Nom_Emp FROM EMPLOYES EMP1 , EMPLOYES EMP2 WHERE EMP1Num_Resp = EMP2Num_Resp Dans cette requte EMP1 et EMP2 sont les noms synonymes de la table EMPLOYES. Les tapes dvaluation de la requte sont les mmes que celles de Q14. Cependant, il faut remarquer ici que dans le rsultat on peut avoir des tuples en double et des tuples symtriques traduisant les situations qui suivent : Dans notre exemple, les employs Tahar et Ahmed ont le mme responsable (Num_Resp = 4 qui correspond lemploy Omar). Dans le rsultat de notre requte, on aura une relation ayant deux attributs et contenant parmi ses tuples les suivants : EMP1Nom_Emp Tahar Tahar Ahmed Ahmed EMP2Nom_Emp Tahar Ahmed Ahmed Tahar
Les tuples 2 et 4 traduisent la mme information : Tahar et Ahmed ont le mme responsable. Il faudrait donc ne garder quun seul de ces deux tuples. Les tuples 1 et 3 traduisent le fait que tout employ a le mme responsable que lui-mme. Ils napportent aucune information et doivent tre limins du rsultat. Pour traiter ces cas il suffit de rajouter dans la clause WHERE une condition supplmentaire : EMP1Nom_Emp < EMP2Nom_Emp (ou > ) SELECT FROM WHERE EMP1Nom_Emp , EMP2Nom_Emp EMPLOYES EMP1 , EMPLOYES EMP2 EMP1Num_Resp = EMP2Num_Resp AND EMP1Nom_Emp < EMP2Nom_Emp
Essayons de voir leffet de cette condition supplmentaire sur le rsultat final. Lapplication de cette condition a lieu au moment de la slection des lignes partir de la relation rsultant du produit cartsien entre EMP1 et EMP2. Voyons quelles sont parmi les lignes qui contenaient dans les colonnes EMP1.Nomp_Emp et EMP2.Nom_Emp les valeurs Tahar et Ahmed celles qui seront retenues par lopration de slection : Tahar nest pas < Tahar : donc la ligne qui contient dans la colonne
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
193
EMP1.Nom_Emp la valeur Tahar et dans la colonne EMP2.Nom_Emp la valeur Tahar aussi ne figurera pas dans la relation rsultat de la slection Tahar nest pas < Ahmed : donc la ligne qui contient dans la colonne EMP1.Nom_Emp la valeur Tahar et dans la colonne EMP2.Nom_Emp la valeur Ahmed ne figurera pas dans la relation rsultat de la slection. Ahmed nest pas < Ahmed : donc la ligne qui contient dans la colonne EMP1.Nom_Emp la valeur Ahmed et dans la colonne EMP2.Nom_Emp la valeur Ahmed aussi ne figurera pas dans la relation rsultat de la slection. Ahmed est < Tahar : donc la ligne qui contient dans la colonne EMP1.Nom_Emp la valeur Ahmed et dans la colonne EMP2.Nom_Emp la valeur Tahar figurera dans la relation rsultat de la slection Donc aprs projection on aura uniquement le tuple (Ahmed,Tahar) dans le rsultat final et correspondant au fait que Tahar et Ahmed ont le mme responsable. Il en sera de mme pour les autres employs ayant le mme responsable.
La sous requte doit tre place entre parenthses. Elle est value en premier et va retourner une seule valeur 'DIRECTEUR'. Cette valeur sera utilise pour constituer la condition de slection de la clause WHERE de la requte principale qui sera donc : Fonction = 'DIRECTEUR'. Loprateur de comparaison utilis est celui de lgalit (=) parce quon est sr davance que le rsultat retourn par la sous requte comporte une seule valeur. On aurait pu rpondre cette question en utilisant les deux requtes spares suivantes :
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
194
requte (1) SELECT FROM WHERE Fonction EMPLOYES Nomp_Emp ='OMAR' SELECT FROM WHERE
La requte (1) va retourner : 'DIRECTEUR' . On lutilise alors pour exprimer la requte (2).
La sous requte va retourner un ensemble de valeurs reprsentant les salaires du dpartement 30. Pour chaque employ, la requte principale va comparer son salaire avec lensemble des valeurs retournes par la sous requte. Si le salaire est suprieur une valeur quelconque de cet ensemble, cet employ sera inclus dans le rsultat. Exprimez cette requte en utilisant la fonction de groupe MINIMUM Q21: Quels sont les noms des employs ayant un salaire suprieur celui de tous les employs du dpartement 30 ? SELECT Nom_Emp FROM EMPLOYES WHERE Salaire > ALL ( SELECT FROM WHERE
Exprimez cette requte en utilisant la fonction de groupe MAXIMUM On peut dans le cas ou la condition est = ANY , remplacer ce test par loprateur IN. De mme que != ALL peut tre remplacer par NOT IN.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
195
Q22: Quels sont les noms et les fonctions des employs du dpartement 10 ayant la mme fonction quun employ quelconque du dpartement 30 ? SELECT FROM WHERE AND Nom_Emp , Fonction EMPLOYES Num_Dept = 10 Fonction IN ( SELECT FROM WHERE
Il est aussi possible dutiliser plusieurs sous requtes imbriques et construire ainsi des requtes aussi complexes quon le souhaite. Cest ce qui fait la puissance du langage SQL. Q24: Quels sont les noms et les fonctions des employs ayant la mme fonction que lemploy Omar ou un salaire suprieur ou gal celui de Rachid? SELECT FROM WHERE Nom_Emp , Fonction EMPLOYES Fonction = ( SELECT FROM WHERE OR ( SELECT FROM WHERE Fonction EMPLOYES Nom_Emp = Omar ) Salaire > = Salaire EMPLOYES Nom_Emp = Rachid )
Le nombre autoris de sous requtes imbriques dpend de limplmentation du langage. Par exemple dans le SQL des premires versions du SGBD ORACLE (V3 et V4 datant dj de 19821983) autorisait jusqu 16 sous requtes imbriques en plus de la requte principale.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
196
Nom_Emp , Fonction , Salaire EMPLOYES , DEPARTEMENTS Ville = Alger EMPLOYESNum_Dept = DEPARTEMENTSNum_Dept Fonction IN ( SELECT Fonction FROM EMPLOYES WHERE Nom_Emp = Rachid )
Dans cette jointure, la sous requte est excute en premier et fournit comme rsultat un ensemble de valeurs correspondant aux fonction des employs ayant pour nom Rachid. Si on est sr que deux employs ne peuvent pas avoir le mme nom alors le IN peut tre remplac par =. Le rsultat est utilis pour constituer la partie de la condition de jointure : Fonction IN <Ensemble des valeurs retournes par la sous requte>. Dans notre exemple , lensemble retourn par la sous requte tant gal Vendeur, la condition de jointure serait quivalente : Ville = Alger AND EMPLOYESNum_Dept = DEPARTEMENTSNum_Dept AND Fonction IN (Vendeur ) Nous allons voir un autre exemple o lvaluation de la sous requte ne se fait pas en une seule fois indpendamment de la requte principale mais est rpte plusieurs fois en fonction de certaines donnes provenant de la requte principale. Q26: Quels sont les noms et Salaires des employs qui ont un salaire suprieur la moyenne des salaires de leur dpartements? Lobtention dune rponse cette question va ncessiter les tapes suivantes : Parcourir la table EMPLOYES de faon connatre le numro d du dpartement de lemploy et son salaire s Calculer la moyenne md des salaires du dpartement d (dans une sous requte) Tester si le salaire s est > md et si oui inclure lemploy dans le rsultat
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
197
SELECT Nom_Emp , Salaire FROM EMPLOYES , X WHERE Salaire > ( SELECT FROM WHERE
On remarque lutilisation dun nom synonyme X pour la table EMPLOYES dans la clause FROM de la requte principale. X peut tre vu comme une variable qui parcourt les tuples de la relation EMPLOYES apparaissant dans la requte principale. La clause WHERE XNum_Detp = Num_Dept de la sous requte lui permet en quelque sorte de se synchroniser avec la requte principale. Ainsi pour chaque tuple repr par la variable X , la sous requte va calculer la moyenne (fonction AVG : Average qui sera explique dans la suite) des salaires du dpartement ayant le mme numro que celui du tuple repr par X et qui correspond un employ bien sr. Le fait que la sous requte rfrence la mme table EMPLOYES dans sa clause FROM ne gne en aucun cas la requte principale.
198
Num_Dept DEPARTEMENT Fonction ='VENDEUR' NOT EXISTS ( SELECT Num_Dept FROM DEPARTEMENT WHERE Fonction ='INGENIEUR' )
DISTINCT (Num_Prof) PROFESSEURS X NOT EXISTS * ( SELECT MODULES FROM MODULES.Spcialit ='INFORMATIQUE' WHERE AND NOT EXISTS ( SELECT * PROFESSEURS FROM MODULESCode_Mod=PROFESSEURSCode_Mod WHERE AND PROFESSEURSNum_Prof = XNum_Prof ) )
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
199
: permet de calculer une MOYENNE : permet de calculer une SOMME : permet de compter des tuples : permet de calculer un maximum : permet de calculer un minimum : permet de crer des sous-ensembles de tuples : permet de tester si une condition est vrifie par un groupe de tuples
Nous allons commencer par illustrer laide dexemples comment utiliser les fonctions AVG, MIN , MAX et COUNT puis nous examinerons de plus prs la manipulation des groupes de tuples. Q29: Quels sont les numros et salaires des employs dont le salaire est suprieur 10% de la moyenne des salaires de son dpartement ? Nom_Emp , Salaire EMPLOYES , X Salaire > ( SELECT FROM WHERE
Q30: Quel est le nom , la fonction et le salaire de(s) lemploy(s) ayant le salaire le plus lev SELECT FROM WHER Nom_Emp , Fonction , Salaire EMPLOYES Salaire = ( SELECT FROM
MAX(Salaire) EMPLOYES)
La sous requte est valu en premier et permet de calculer le salaire maximum des employs. La requte principale va parcourir les lignes de la table EMPLOYES et comparer le salaire de chaque employ avec le rsultat de la sous requte. Sil y a galit, le nom , la fonction et le salaire de cet employ figurera dans le rsultat final. Q31: Quel est le salaire maximum , le salaire minimum et la diffrence entre ces deux valeurs ? SELECT MAX(Salaire) , MIN(Salaire) , MAX(Salaire) - MIN(Salaire) FROM EMPLOYES Q32: Quel est le nombre demploys percevant une prime ? SELECT COUNT(Prime) FROM EMPLOYES Q33: Quel est le nombre de fonctions diffrentes exerces dans le dpartement 30 ? SELECT COUNT(DISTINCT Fonction) FROM EMPLOYES WHERE Num_Dept = 30
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
200
Le mot DISTINCT cl permet de ne compter une mme valeur quune seule fois. Le nombre retourn sera bien le nombre de valeurs diffrentes de lattribut Fonction.
Q34 : Quelle est la moyenne des salaires du dpartement 10 ? SELECT AVG (Salaire) FROM EMPLOYES WHERE Num_Dept = 10 Si on veut connatre la moyenne des salaires des dpartements 20 et 30, il suffit dutiliser la mme requte en remplaant dans la clause WHERE Num_Dept = 10 par Num_Dept = 20 puis par Num_Dept = 30 comme suit : moyenne des salaires du dpartement 20 SELECT FROM WHERE AVG (Salaire) EMPLOYES Num_Dept = 20 moyenne des salaires du dpartement 30 SELECT FROM WHERE AVG (Salaire) EMPLOYES Num_Dept = 30
Au lieu dutiliser 3 requtes spares, on peut obtenir la moyenne des salaires par dpartement avec une seule requte en utilisant une clause GROUP BY comme suit : SELECT FROM GROUP BY Q35: Num_Dept , AVG (Salaire) EMPLOYES Num_Dept
Quels est pour chaque dpartement et chaque fonction le salaire annuel (12 mois) moyen par fonction et le nombre demploys exerant cette fonction?
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
201
mme question que mais donner le nom du dpartement au lieu du numro ce qui va ncessiter de faire une jointure ? SELECT FROM WHERE GROUP BY Nom_Dept, Fonction , Count (*) , AVG (Salaire) * 12 EMPLOYES , DEPARTEMENTS EMPLOYESNum_Dept = DEPARTEMENTSNum_Dept Num_Dept , Fonction
Q37:
Quels est pour chaque dpartement le salaire annuel (12 mois) moyen de tous ses employs sauf ceux ayant une fonction de DIRECTEUR ou PRESIDENT? SELECT FROM WHERE GROUP BY Num_Dept, AVG (Salaire) * 12 EMPLOYES Fonction NOT IN (DIRECTEUR , PRESIDENT) Num_Dept
Q38: Quels sont les numros des dpartements ayant plus de 10 employs ? SELECT FROM GROUP BY HAVING Num_Dept EMPLOYES Num_Dept COUNT(*) > 10
Le COUNT(*) compte les tuples des sous-ensembles crs par GROUP BY. Les tuples de chaque sous-ensemble cre ont la mme valeur de l'attribut qui est utilis dans le GROUP BY (c.a.d. ici Num_Dept). Le rsultat de cette requte sera une relation partitionne en groupes de tuples ayant la mme valeur de lattribut Num_Dept. A chacun de ces groupes sera applique la qualification de la clause HAVING c'est a dire COUNT(*) > 10. Si le groupe satisfait la condition (contient plus de 10 tuples), il sera inclut dans le rsultat par le biais de son attribut Num_Dept jouant le rle de dnominateur commun pour les tuples du groupe. Q39: Quelles sont les diffrentes fonctions exerces dans lensemble des dpartements et la moyenne des salaires par fonction ? SELECT FROM GROUP BY Fonction , AVG (Salaire) EMPLOYES Fonction
Q40: Quelles sont les diffrentes fonctions exerces dans lensemble des dpartements dont la moyenne des salaires par fonction est suprieure 10.000 ?
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
202
Q41:
Quels sont les numros des dpartements au moins deux employs exerant la fonction de Vendeur? SELECT FROM WHERE GROUP BY HAVING Num_Dept EMPLOYES Fonction = Vendeur Num_Dept COUNT(*) > 2
Q42:
Quels sont les numros des dpartements dans lesquels la moyenne des primes est suprieur 10% de la moyenne des salaires? SELECT FROM GROUP BY HAVING Num_Dept , AVG (Salaire) , AVG (Prime) , AVG (Salaire) * 0.10 EMPLOYES Num_Dept AVG (Prime) > AVG (Salaire) * 0.10
Dans la liste des attributs figurant dans une clause SELECT si on a des noms dattributs avec fonctions de groupe (AVG , MAX, MIN , .....), on ne peut pas avoir en mme temps de nom dattribut sans fonction de groupe. Par exemple lcriture suivante serait une erreur : SELECT Nom_Emp , AVG (Salaire)
parce que lattribut Nom_Emp est un attribut ayant une valeur dans chaque ligne alors que AVG (Salaire) reprsente une valeur correspondant un ensemble de lignes qui seront slectionnes. Si on veut combiner dans la liste un attribut sans fonction de groupe avec un autre avec fonction de groupe, on doit utiliser une sous requte.
Q43:
Liste des employs du dpartement 10 par ordre dcroissant de leur salaire? SELECT FROM WHERE ORDER BY Num_Dept , Nom_Emp, Salaire EMPLOYES Num_Dept = 10 Salaire DESC
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
203
Q44:
Liste par ordre alphabtique des employs du dpartement 10? SELECT FROM WHERE ORDER BY Nom_Emp EMPLOYES Num_Dept = 10 Nom_Emp
Il est aussi possible de trier le rsultat retourn par une requte en fonction de plusieurs attributs. Q45: Liste des employs tris selon un ordre alphabtique de leur fonction et a lintrieur de chaque fonction les trier selon un salaire dcroissant. SELECT FROM ORDER BY Nom_Emp, Fonction, Salaire EMPLOYES Fonction ASC, Salaire DESC
Cette requte va entraner dans un premier temps un tri du rsultat par ordre alphabtique selon la fonction des employs. Puis un autre tri sera effectu sur les tuples correspondant aux employs ayant la mme fonction de faon a les arranger selon un ordre dcroissant de leur salaire.
Q46: Liste des employs nayant pas reu de prime. SELECT FROM WHERE Nom_Emp Ali Omar Farouk Lyes Tahar Malik Fatma Nadia Ahmed Kader Nom_Emp, Salaire, Prime EMPLOYES Prime IS NULL Salaire 800 2975 2850 2450 3000 5000 1100 950 3000 1300 Prime
La condition Prime = NULL nest pas un test valide pour trouver les valeurs NULL. Son utilisation est possible mais retourne un rsultat vide.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
204
Q47: Liste des employs du dpartement 30 dont la prime est infrieure a 1000. SELECT FROM WHERE Nom_Emp Rachid Kamel Louisa Prime 300 500 0 Nom_Emp, Prime, Num_Dept EMPLOYES Num_Dept = 30 AND Prime < 1000 Num_Dept 30 30 30
On remarque que les employs du dpartement 30 dont la prime est NULL ne sont pas inclus dans le rsultat.
Du fait que la colonne Prime contient des valeurs NULL, dans le rsultat les lignes pour lesquelles lattribut Prime a une valeur NULL apparatront en premier suivies de celles pour lesquelles Prime nest pas NULL et qui seront alors tries par ordre croissant des primes.
Nom_Emp Ali Omar Farouk Lyes Tahar Malik Fatma Nadia Ahmed Kader Louisa Rachid Kamel Brahim
Salaire 800 2975 2850 2450 3000 5000 1100 950 3000 1300 1500 1600 1250 1250
Prime
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
205
: ajouter une table la B.D. : modifier une colonne ou ajouter une nouvelle colonne une table : supprimer une table
On peut aussi spcifier la longueur maximal d'un champ (CHAR ou NUMBER). Exemple: CHAR(12) NUMBER(4) NUMBER(7,2) : maximum 12 caractres : 4 chiffres au maximum : maximum 7 chiffres dont 2 droite du point dcimal
La spcification de la longueur maximale d'un champ permet au SGBD de contrler si une valeur ajoute dans la colonne ne dpassera pas ce maximum. Pour spcifier qu'une colonne ne doit pas contenir de valeurs NULL (ou indfinies, inconnues), il faut ajouter aprs le type l'option NOT NULL. Exemple: CREATE TABLE ETUDIANTS ( NUMERO NOM MOYENNE NUMBER NOT NULL, CHAR(10), NUMBER(4,2) )
Lattribut NUMERO est un nombre dont la taille sera prise par dfaut et ne comporter de valeurs NULL. Lattribut NOM est une chane de 10 caractres au maximum. Lattribut MOYENNE est un nombre de 4 chiffres dont 2 aprs la virgule.
13.2
La taille d'une colonne peut tre augmente grce la commande ALTER TABLE dont le format est : ALTER TABLE <nom de table> MODIFY (<nom de colonne>,<type(nouvelle taille)>) Exemple: ALTER TABLE MODIFY ETUDIANTS (MOYENNE,NUMBER(6,2))
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
206
La nouvelle colonne AGE sera rajoute droite des autres colonnes de la table et sera initialise par des valeurs NULL. On ne doit donc pas spcifier l'option NOT NULL ce niveau. Cette colonne peut tre remplie grce la commande UPDATE (voir la commande UPDATE plus loin).
On suppose pour la suite que la relation ou table ETUDIANTS a pour schma : ETUDIANTS(NUMERO, NOM, MOYENNE, AGE)
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
207
Exemple: On veut insrer une ligne ou un tuple dans la table ETUDIANTS correspondant ltudiant ayant pour numro 795 , pour nom JOJO , pour moyenne 12.54 et pour ge 21 ans. INSERT INTO ETUDIANTS VALUES (795,'JOJO',12.54,21) On peut ajouter une ligne incomplte en ne donnant que les valeurs de certains attributs. Pour cela, il faut prciser les noms de ces attributs (i.e. colonnes) dans INSERT. Exemple: On veut insrer une ligne ou un tuple dans la table ETUDIANTS correspondant ltudiant ayant pour numro 15 , pour nom TITI , pour ge 19 ans et dont on ne connat pas le moyenne. INSERT INTO VALUES ETUDIANTS(AGE,NUMERO,NOM) (15,'TITI',19)
Toutes les autres colonnes de la table seront initialises avec la valeur NULL. On remarque que lordre des colonnes na pas dimportance alors que dans lexemple prcdent si car on na pas spcifi les noms des attributs et donc lordre implicite est celui donn lors de la cration de la table. 13.5.2 Mise jour de lignes dans une table : UPDATE La commande UPDATE permet de changer la valeur d'un attribut. Son Format gnral est : UPDATE <nom de table> SET <nom de colonne> = valeur WHERE <liste de conditions> La clause WHERE est optionnelle. Elle sert faire des changements slectifs sur les lignes satisfaisant les conditions spcifies. WHERE peut contenir les mmes conditions de recherches que celles possibles avec une clause SELECT. Exemple 1 : Mise jour d'une seule colonne d'une ligne
L'tudiant ayant pour nom TOTO , vient rclamer quil lui manque un demi point dans sa moyenne. Il faudra alors lui majorer sa moyenne de 0.5. UPDATE ETUDIANTS SET MOYENNE = MOYENNE + 0.5 WHERE NOM = 'TOTO' Exemple 2 : Mise jour de plusieurs colonnes dans une mme ligne
Lors de la saisie des attributs de l'tudiant numro 795 des erreurs se sont glisses dans l'ge, la moyenne et le nom de cet tudiant. Il faudra alors les corriger avec les valeurs correctes suivantes : UPDATE ETUDIANTS SET AGE=25 , NOM = 'OMAR' , MOYENNE =09.5 WHERE NUMERO = 795 Les colonnes doivent tre spares par une virgule dans la clause SET.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
208
Une commande DELETE sans clause WHERE implique la suppression de toutes les lignes de la table.
209
CREATE VIEW AS
MOYENNE_ETUDIANTS SELECT FROM WHERE AND NOM,MOYENNE ETUDIANTS NOM LIKE B% MOYENNE < 10.0
La vue MOYENNE_ETUDIANTS est quivalente une table de 2 colonnes NOM et MOYENNE et dont les lignes sont extraites de la table ETUDIANTS. On peut utiliser toute la puissance de SQL pour dfinir une VUE. La commande CREATE VIEW ne doit pas contenir de clause ORDER BY car l'ordre est spcifi lorsqu'on excute une requte sur la vue. Cependant quelques limites existent telles que : On peut utiliser une jointure entre tables dans la dfinition dune vue. Exemple : On veut crer une vue RECHERCHE partir des tables EMPLOYES , DEPARTEMENTS uniquement les noms , fonctions et salaires des employs du dpartement RECHERCHES dont le salaire est suprieur 1000 ? CREATE VIEW AS SELECT FROM WHERE AND AND RECHERCHE Nom_Emp , Fonction , Salaire EMPLOYES , DEPARTEMENTS EMPLOYESNum_Dept= DEPARTEMENTSNum_Dept Nom_Dept = 'RECHERCHE' Salaire > 1000
210
Exemple : Insrer l'tudiant de NOM = 'BACHIR' et de MOYENNE = 12 dans la vue MOYENNE_ETUDIANTS cre plus haut INSERT INTO MOYENNE_ETUDIANTS VALUES ('BACHIR',12) Or la table ETUDIANTS qui a servi la cration de cette vue a le schma suivant : ETUDIANTS(NUMERO,NOM,MOYENNE,AGE) Donc l'insertion du tuple ('BACHIR', 12) dans la vue ne peut se rpercuter dans la table ETUDIANTS que sous la forme du tuple suivant : (NULL,'BACHIR',12,NULL) ou NULL correspond une valeur indfinie. Ceci pose un problme car l'attribut NUMERO a t dfini comme NOT NULL lors de la cration de la table ETUDIANTS et on ne pourra donc pas insrer le tuple (NULL,'BACHIR',12,NULL) dans la table. Donc on ne peut pas rpercuter l'insertion faite sur la vue au niveau de la table qui a permis de crer cette vue. Le problme se complique encore plus si la vue a t obtenue par jointure entre plusieurs tables.
15. Conclusion
Le langage SQL est a l'heure actuelle le langage le plus utilis dans le domaine des bases de donnes. Certains auteurs le qualifient de COBOL des annes 90. Il constitue aussi le support idal au dveloppement des L4G (langages de 4ieme gnration). Un L4G est un outil de productivit permettant de dvelopper des applications compltes sans programmation. Il est construit a partir d'un langage relationnel comme SQL. Certains SGBD comme ORACLE offrent des outils dans ce sens et qui sont tous dvelopps autour de SQL. Ceci inclue : - un gnrateurs d'tats - un tableur - un utilitaire de sortie graphique - un gnrateur d'application - etc. L'utilisation de SQL et des utilitaires associs ouvre le dveloppement d'applications a de nouveaux utilisateurs (non spcialistes) tout en amliorant les performances (temps de dveloppement, de maintenance et de flexibilit). Avec un vritable L4G, le dveloppeur d'application n'est plus un programmeur au sens classique du terme (i.e. au sens des L3G procduraux). Enfin, rien ne remplacerais lapprentissage du langage par la pratique en utilisant nimporte quel SGBD relationnel dont on peut disposer. A notre avis, le plus simple serait de pratiquer le langage avec le SGBD Microsoft ACCESS. Mais il faut noter aussi quil existe beaucoup dautres SGBD relationnels distribus gratuitement et pouvant mme fonctionner dans une architecture Client/Serveur comme par exemple MySql.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
211
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
212
Exercice 1:
Considrons a nouveau la base de donnes relationnelle prsente au dbut du chapitre et compose des tables suivantes avec les mmes extensions : EMPLOYES (Num_Emp, Nom_Emp, Fonction, Salaire, Prime, Num_Resp , Num_Dept) DEPARTEMENTS (Num_Dept, Nom_Dept , Ville) Donnez pour chacune des questions suivantes une requte SQL permettant de rpondre a cette question : Q1 : Liste des dpartements avec pour chacun la moyenne des salaires du dpartement Q2 : Liste par ordre croissant de leur salaire des employs travaillant dans la ville de BATNA Q3 : Pour chaque dpartement donnez le nombre demploys exerant comme responsable dans ce dpartement. Q4 : Liste des dpartements avec le nombre demploys par dpartement Q5 : Liste des employs ayant le mme salaire que lemploy numro 100 Q6 : Donnez les noms et salaires des employs dont le salaire est plus grand que le salaire moyen de leur dpartement Q7 : Liste des dpartements yant au moins 3 employs dont le salaire est gal a 5000 Q8 : Donnez les noms et salaires des employs dont le salaire est suprieur a celui de leur responsable ainsi que le nom est le salaire de ce responsable Q9 : Liste des dpartements ou travaillent plus de 10 employs occupant le poste de responsable.
Exercice 2:
Soit la base de donnes relationnelle compose des tables suivantes : ETUDIANTS (Num_Etudiant, Nom_Etudiant, Age, Num_Dlgu, Num_Institut) INSTITUTS (Num_Institut, Nom_Institut) Donnez pour chacune des questions suivantes une requte SQL permettant de rpondre a cette question : Q1 : Liste des tudiants de linstitut ayant pour nom MATHS Q2 : Liste des INSTITUTS avec pour chacun la moyenne dge de cet institut Q3 : Quel est le nom de ltudiant le plus g ainsi que le nom de son institut Q4 : Liste des instituts ayant au moins deux tudiants dont lge est gal a 16. Q5 : Liste des instituts avec le nombre dtudiants par institut
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
213
Q6 : Donnez les noms et ges des tudiants ayant le mme ge que ltudiant ayant le numro 200. Q8 : Donnez les noms et ges des tudiants dont lge est suprieur a la moyenne dge de leur institut. Q9 : Donnez les noms et ges des tudiants dont lge est suprieur a celui de leur dlgu ainsi que le nom et lge de ce dlgu. Q10 : Liste des instituts dont le nombre de dlgus est suprieur a 5. Q11 : Liste des instituts avec le nombre de dlgus par institut.
Exercice 3:
Reprendre les exercices du chapitre 4 en exprimant toutes les requtes algbriques avec SQL
Exercice 4:
Comme SQL ne peut tre bien matris que par la pratique, on vous propose dutiliser un SGBD relationnel de votre choix (ACCESS, Oracle, MySQL) et dimplmenter la bases de donnes de lexercice 1 avec les extensions des tables fournies au dbut du chapitre en utilisant les requtes SQL adquates. Une fois vos tables cres et remplies, Reprendre les exemples de requtes donnes tout au long du chapitre pour enfin voir les rsultats de chacune et sassurer de leur validit.
Dr. Brahim BELATTAR - Dpt dinformatique Facult des Sciences de lingnieur - Univrist de Batna - 05000 - Algrie
Bibliographie
Bibligoraphie
CARDENAS A. F. , Database Management Systems, ALLYN and BACON Inc., Second Edition , USA, 1985 CARREZ C. , Des structures aux bases de donnes , DUNOD informatique, France, 1990 CELKO J. , SQL avanc , (traduction de Martine Chamond), INTENATIONAL THOMSON PUBLISHING, FRANCE, 1997 DATE. C. J. , An Introduction to Database Systems, Volume I, Fourth Edition , ADDISONWESLEY PUBLISHING COMPANY, 1986 DELOBEL C. , M. ADIBA , Bases de donnes et systmes relationnels, DUNOD informatique, France, 1982 GALACSI, Concetin de bases de donnes : du schma conceptuel aux schmas physiques, , DUNOD informatique, France, 1989 GALACSI, Les systmes dinformation : Analyse et conception , DUNOD informatique, France, 1989 GAMACHE A., Logiciels SGBD et bases de donnes, Les Presses de lUniversit LAVAL, Quebec, 1980 GARDARIN G., Bases de donnes : les systmes et leurs langages, EYROLLES, France, 1982 KORTH H. F. , SILBERSCHATZ A., Database System Concepts, Second Edition , McGrawHill, Inc., USA, 1991 MARTIN D. , Techniques avances pour bases de donnes , DUNOD informatique, France, 1985 MIRANDA S., BUSTA J.S., Lart des Bases de donnes : Tome 2 - Les bases de donnes relationnelles, EYROLLES, France, 1986 ULLMAN J. D. , Principles of Database Systems, Computer Science Press, Second Edition , USA, 1982
Dr. Brahim BELATTAR - LISA - Dpt dinformatique - Facult des sciences de lIngnieur - Univ. de Batna - 05000 - Algrie