Chapitre 5
Chapitre 5
Chapitre 5
Contrairement à ce qu’on pourrait penser, SQL n’est pas simplement un langage de requête ou
d’interrogation d’une base de données relationnelle. Il supporte aussi bien les fonctions de description
de données que celles de manipulation de données. La liste suivante permet de donner une idée sur les
opérations qui peuvent être réalisées avec SQL :
2. Requête en SQL
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •182
Le terme SELECT utilisé dans une requête SQL n’a rien à voir avec celui utilisé dans l’opération
de sélection de l’algèbre relationnelle notée elle aussi par Select ou σ. Dans la suite du texte nous
utiliserons une notation en majuscules SELECT pour désigner la sélection dans une requête SQL et
une notation en minuscules pour faire référence à l’opération algébrique de sélection Select.
SELECT A1 , A2 , ......., An
FROM R1 , R2 , ......, Rm
WHERE C
Ainsi, on peut dire que l’évaluation de la requête va consister à calculer le produit cartésien entre
les relations Ri figurant dans la clause FROM, puis à appliquer au résultat obtenu l’opération de
sélection σC de l’algèbre relationnelle en utilisant la condition C figurant dans la clause WHERE, et
enfin à appliquer au résultat obtenu l’opération de projection Π A1 , A2 , ......., An de l’algèbre relationnelle
en utilisant la liste des attributs Ai figurant dans la clause SELECT de la requête. Néanmoins, il faut
souligner que ce schéma d’évaluation est trop simpliste car dans la pratique, le SGBD peut être amené
à convertir une requête en une autre requête équivalente mais plus performante en terme de temps
d’exécution et ce en utilisant les propriétés des opérateurs de l’algèbre relationnelle.
Afin de bien illustrer les possibilités de SQL en matière d’interrogation d’une base de données
relationnelle, nous allons nous servir du schéma relationnel suivant :
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •183
Relation DEPARTEMENTS
Relation EMPLOYES
Les cases vides traduisent le fait que la valeur de l’attribut est indéfinie pour l’employé
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 zéro bien que SQL offre des possibilités pour
convertir une valeur NULL en une autre valeur numérique (par exemple en 0 ) dans les expressions de
calcul utilisables dans une requête.
En pratique, SQL n'élimine pas les tuples en double car ces tuples ne gênent pas l'utilisateur et leur
élimination implicite par SQL peut entraîner une perte de temps. Cependant SQL offre à l'utilisateur la
possibilité de demander une élimination explicite de ces doubles grâce a un mot clé du langage qui est
: DISTINCT (ou parfois UNIQUE).
A ce niveau, il est important de remarquer que l’autorisation de la présence de tuples dupliqués est
un inconvénient majeur de SQL est qu’il n’est pas un langage ensembliste puisque ne fournissant pas
automatiquement comme résultat un ensemble. Or nous avons vu que les opérations de l’algèbre
relationnelle s’appliquaient à des relations et le résultat était aussi une relation. Ceci n’est en fait vrai
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •184
que parce que les arguments de ces opérations sont supposées être des relations qui sont des ensembles
au sens mathématique du terme c’est à dire ne contenant pas de tuples dupliqués. Dans le cas où une
relation pouvait contenir un tuple en double, beaucoup de propriétés des opérateurs de l’algèbre
relationnelle seraient remises en cause.
Q1: Donner les noms de tous les employés et le salaire de chacun d'eux ?
Q2: Liste de tous les Départements dans lesquels travaille au moins un employé?
On a rajouté le mot clé DISTINCT car le même numéro de Département peut apparaître plusieurs
fois dans le résultat du fait que plusieurs Employés différents peuvent travailler dans un même
département.
On voit que la liste des attributs après la clause SELECT inclut tous les attributs de la relation
DEPARTEMENTS. Pour simplifier l’écriture d’une telle requête, SQL permet de les formuler comme
suit :
SELECT *
FROM DEPARTEMENTS
ou le SELECT * signifie : " Sélectionner tous les attributs de la relation DEPARTEMENTS "
SELECT *
FROM EMPLOYES
WHERE Num_Dept = 10
Avec cette requête, on aura comme résultat une relation ayant le même schéma que la relation
EMPLOYES (i.e. mêmes attributs) et contenant tous les tuples de la relation EMPLOYES pour
lesquels l'attribut Num_Dept a pour valeur 10.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •185
Q5: Quels sont les numéros et les noms des employés travaillant dans le
département numéro 10 ?
Le résultat de cette requête est identique a celui de la question Q4 sauf qu'ici on aura uniquement
une relation formée de deux colonnes (attributs) qui sont Num_Emp et Nom_Emp et non pas une
relation formée de tous les attributs comme c’était le cas pour Q4 à cause de la clause SELECT *.
On peut éventuellement ordonner le résultat d’une requête grâce à la clause ORDER BY. Pour
cela, il suffit de spécifier dans cette clause le ou les attributs selon lesquels on désire ordonner le
résultat ainsi que le critère ascendant ou descendant.
La condition de la clause WHERE peut utiliser les opérateurs tels que: = , > , ≥ , < , ≤ , != , AND
, OR , NOT , BETWEEN , LIKE , IN , ANY, ALL, EXIST, .... }
Q6: Quels sont les numéros et les noms des employés du département numéro
10 et qui ont un salaire supérieur à 1000 ?
Q7: Quels sont les fonctions exercées par les employés des départements 10 et
20 en éliminant les tuples en double du résultat?
Q8: Quels sont les fonctions dont le salaire est compris entre 2000 et 3000?
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •186
SELECT Nom_Emp
FROM EMPLOYES
WHERE Num_Dept = 10 AND Nom_Emp LIKE ‘B%’
Q10: Quels sont les employés du département numéro 10 dont la fonction n’est
ni ‘Ingénieur’ ni ‘Analyste’ ?
SELECT Nom_Emp
FROM EMPLOYES
WHERE Num_Dept = 10
AND NOT (Fonction = ‘Ingénieur’ OR Fonction = ‘Analyste’ )
Il est important à ce niveau de préciser que la réponse à une même question peut être obtenue avec
une ou plusieurs requêtes différentes utilisant chacune un ou des opérateur(s) différent(s).
Il est aussi possible d’exprimer en SQL les opérations algébriques UNION, PRODUIT
CARTESIEN, JOINTURE , INTERSECTION , DIFFERENCE et DIVISION. Certaines opérations
algébriques ne sont pas directement supportées par SQL car ce dernier ne proposant pas un opérateur
spécifique pour les exprimer directement. Cependant, il existe toujours une possibilité pour les traduire
en termes des opérateurs offerts par le langage. C’est le cas par exemple des opérations algébriques de
JOINTURE , DIFFERENCE , INTERSECTION et DIVISION. Nous verrons comment les traduire en
fonction des possibilités du langage dans le cas ou ce dernier ne les supporte pas directement.
Q11: Quels sont les fonctions exercées par les employés des départements 10
et 20 en éliminant les tuples en double du résultat? (même que Q7)
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •187
Par défaut, l’opération d’UNION (requête (a) ) élimine les tuples en double du résultat. Si on veut
les garder, on doit utiliser UNION ALL (requête (b) ) à la place de UNION tout court comme ci-
dessus. Cette question étant la même que Q7, nous avons vu que dans la requête correspondant à Q7,
on avait explicitement demandé l’élimination des tuples en double grâce au mot clé DISTINCT.
SELECT *
FROM EMPLOYES , DEPARTEMENTS
On remarque l'absence de la clause WHERE puisque comme il a été précisé on n'a pas besoin de
spécifier une condition pour avoir le produit cartésien.
Dans la définition de l’opération de produit cartésien, nous avons noté que cette opération ne peut
être évaluée que si les deux relations n’avait pas d’attributs en commun. Dans le cas où les deux
relations avaient des attributs en commun (c’est à dire ayant les même noms), il fallait d’abord les
renommer pour être à même de calculer le produit cartésien de ces relations. Or dans notre exemple,
les relations EMPLOYES et DEPARTEMENTS ont un attribut en commun à savoir Num_Dept. et
pourtant nous ne l’avons pas renommé dans une de ces relations avant de calculer le produit cartésien.
Ceci est dû au fait qu’avec SQL le renommage n’est pas nécessaire puisque ce dernier préfixe
automatiquement un attribut avec le nom de sa relation selon la notation pointée
Nom_de_Relation.Nom_Attribut. Ainsi le nom effectif de l’attribut Num_Dept de la relation
EMPLOYES est EMPLOYES.Num_Dept et celui de la relation DEPARTEMENTS est
DEPARTEMENTS. Num_Dept ce qui évite tout problème d’ambiguïté.
Il est aussi tout à fait possible de préfixer dans une requête un attribut apparaissant dans une clause
SELECT ou une clause WHERE avec le nom de sa relation comme dans la requête suivante (même
que Q6) :
Bien que cette écriture soit juste, aucun problème d’ambiguïté ne se pose dans cet exemple puisque
on est sûr que les attributs Num_Emp et Nom_Emp appartiennent à la relation EMPLOYES. Le
préfixage n’est donc pas nécessaire. Néanmoins, dans certaines requêtes, surtout celles mettant en jeu
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •188
les jointures, on sera très souvent amené à utiliser cette notation afin de lever toute ambiguïté dans la
désignation des attributs.
Q12: Quels sont les numéros des départements dans lesquels travaillent des
VENDEURS et des 'INGENIEURS'.
SELECT Num_Dept
FROM EMPOYES
WHERE Fonction ='VENDEUR'
INTERSECT
SELECT Num_Dept
FROM EMPOYES
WHERE Fonction ='INGENIEUR'
Q13: Quels sont les numéros des départements dans lesquels travaillent des
'VENDEURS' mais pas des 'INGENIEURS' ?
SELECT Num_Dept
FROM EMPOYES
WHERE Fonction ='VENDEUR'
MINUS
SELECT Num_Dept
FROM EMPOYES
WHERE Fonction ='INGENIEUR'
SELECT Num_Dept
FROM DEPARTEMENT
WHERE Fonction ='VENDEUR'
qui contiendra les numéros de tous les départements dans lesquels travaille au moins un employé
ayant pour fonction ‘VENDEUR’ alors que la deuxième relation S correspond au résultat de la sous-
requête :
SELECT Num_Dept
FROM DEPARTEMENT
WHERE Fonction ='INGENIEUR'
qui contiendra les numéros de tous les départements dans lesquels travaille au moins un employé
ayant pour fonction ‘INGENIEUR’.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •189
D’après la définition de l’opération MINUS, le résultat sera l'ensemble des tuples appartenant à R mais pas à
S. Donc si un même département possède au moins un employé ayant pour fonction ‘VENDEUR’ (figure dans
R) et possède aussi au moins un employé ayant pour fonction ‘INGENIEUR’ (figure aussi dans S) alors ce
département ne figurera pas dans le résultat de R-S, ce qui répond bien à la question.
SQL n’offre pas une opération spécifique pour exprimer la jointure avec qualification ou avec
condition. Comme cette opération algébrique est une opération complémentaire, elle peut s'exprimer
en fonction des opérations de algébriques de base à savoir : la sélection et le produit cartésien. On sait
que :
SQL n’offre pas un opération spécifique pour exprimer la jointure. Il faudra donc l’exprimer
comme une sélection selon une condition sur le produit cartésien des relations R et S .
Q14: Quels sont les numéros et les noms des employés qui travaillent à
‘BATNA’ ?
Correspond au WHERE
C de la requete SQL
X Correspond au FROM
de la requete SQL
DEPARTEMENTS
EMPLOYES
où la condition C est : EMPLOYES•Num_Dept=DEPARTEMENTS•Num_Dept ∧
Ville = 'BATNA'
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •190
Q15: Quels sont les noms ,les fonctions et les salaires des employés du
département ‘RECHERCHES’ dont le salaire est supérieur à 1000 ?
On remarque que le préfixage d’un attribut avec le nom de sa relation n’est utilisé que pour
Num_Dept qui est commun aux deux relations participant dans la jointure. La condition spécifiée 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 employés travaillant à ‘BATNA’ et
ayant la même fonction que l’employé ‘AHMED’ ?
SQL n’offre pas une opération spécifique pour exprimer la jointure naturelle. Il faudra là aussi
traduire en utilisant l’expression de la jointure naturelle en fonction des opérations algébriques de
sélection , projection et produit cartésien et qui est :
L’expression de la jointure naturelle entre les relations EMPLOYES et DEPARTEMENTS qui ont
un seul attribut peut s’écrire : ΠV ( σ C (EMPLOYES X DEPARTEMENTS) ) où :
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •191
Il n’est pas obligatoire de spécifier tous les attributs apparaissant dans la clause SELECT de la
requête ci-dessus car SQL ignore qu’il s’agit d’une jointure naturelle. On peut même ne spécifier dans
la clause SELECT qu’un sous ensemble d’attributs de la liste V seulement. Dans le cas où on utilise
un SELECT * , on aura comme résultat une relation ayant pour schéma l’union des attributs de X1 et
X2 (même schéma que la relation résultant du produit cartésien X1 x X2 ) c’est à dire tous les attributs
de X1 plus tous les attributs de X2 indépendamment du fait que X1 et X2 ont les mêmes attributs.
Rappelons que la notation pointée utilisée par SQL pour désigner un attribut X1.nom_Attribut ou
X2.nom_Attribut fait que les attributs communs à deux relations de la base de données possèdent au
niveau interne de SQL des noms distincts du fait du préfixage et ce même si au niveau du schéma ils
ont les mêmes noms.
9.3 Equi-Jointure
Cette opération n’existe pas aussi dans SQL. Cependant, il est possible de l’exprimer de la même
manière que la jointure avec qualification puisque la seule différence est que dans l’équi-jointure
l'opérateur de comparaison θ utilisé dans la condition de jointure est l'opérateur d'égalité ( = ).
Pour répondre à certaines questions, on peut parfois être amené à faire la jointure d'une table avec
elle-même. Le problème qui se pose alors est comment distinguer les attributs. La solution qui est
largement utilisée est de désigner dans la clause FROM de la requête SQL la relation (ou table) par
deux noms différents appelés synonymes.
Avec SQL, l’association d’un nom synonyme à une table consiste à faire suivre le nom de la table
par le nom synonyme qui n’est autre qu’un identificateur au sens informatique du terme.
Q17: Quels sont les noms et les fonctions des employés ayant un salaire
supérieur à celui de l’employé dont le nom est 'ALI'
X1 et X2 sont les noms synonymes désignant la table EMPLOYES. Cette requête peut être vue
comme une requête ayant pour arguments dans la clause FROM deux tables X1 et X2 ayant le mêmes
attributs et la même extension que EMPLOYES. L’évaluation de la requête va consister à calculer le
produit cartésien entre deux les tables X1 et X2, puis de sélectionner les tuples du résultat 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 répondant à cette
question.
.
.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •192
Q18: Quels sont les noms des employés ayant le même responsable ?
Dans cette requête EMP1 et EMP2 sont les noms synonymes de la table EMPLOYES. Les étapes
d’évaluation de la requête sont les mêmes que celles de Q14. Cependant, il faut remarquer ici que dans
le résultat on peut avoir des tuples en double et des tuples symétriques traduisant les situations qui
suivent :
Dans notre exemple, les employés Tahar et Ahmed ont le même responsable (Num_Resp = 4 qui
correspond à l’employé Omar). Dans le résultat de notre requête, on aura une relation ayant deux
attributs et contenant parmi ses tuples les suivants :
EMP1•Nom_Emp EMP2•Nom_Emp
Tahar Tahar
Tahar Ahmed
Ahmed Ahmed
Ahmed Tahar
Les tuples 2 et 4 traduisent la même information : Tahar et Ahmed ont le même responsable. Il
faudrait donc ne garder qu’un seul de ces deux tuples. Les tuples 1 et 3 traduisent le fait que tout
employé a le même responsable que lui-même. Ils n’apportent aucune information et doivent être
éliminés du résultat.
Pour traiter ces cas il suffit de rajouter dans la clause WHERE une condition supplémentaire :
Essayons de voir l’effet de cette condition supplémentaire sur le résultat final. L’application de
cette condition a lieu au moment de la sélection des lignes à partir de la relation résultant du produit
cartésien 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
l’opération de sélection :
¾ Tahar n’est pas < à Tahar : donc la ligne qui contient dans la colonne
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •193
¾ Tahar n’est 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 résultat de la sélection.
¾ Ahmed n’est 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 résultat de la sélection.
¾ 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 résultat de la sélection
Donc après projection on aura uniquement le tuple (Ahmed,Tahar) dans le résultat final et
correspondant au fait que Tahar et Ahmed ont le même responsable. Il en sera de même pour les autres
employés ayant le même responsable.
La sous requête sert en général pour comparer un attribut ou un ensemble d’attributs de la requête
principale au résultat retourné par la sous requête. Il faut remarquer au passage que les sous requêtes
peuvent aussi être utilisées dans les opérations d’insertion, de mise à jour et de suppression de tuples
dans une table.
Q19: Quels sont les noms des employés ayant la même fonction que l’employé
‘OMAR’
SELECT Nom_Emp
FROM EMPLOYES
WHERE Fonction =
( SELECT Fonction
FROM EMPLOYES
WHERE Nomp_Emp ='OMAR' )
La sous requête doit être placée entre parenthèses. Elle est évaluée en premier et va retourner une
seule valeur 'DIRECTEUR'. Cette valeur sera utilisée pour constituer la condition de sélection de la
clause WHERE de la requête principale qui sera donc :
Fonction = 'DIRECTEUR'.
L’opérateur de comparaison utilisé est celui de l’égalité (=) parce qu’on est sûr d’avance que le
résultat retourné par la sous requête comporte une seule valeur.
On aurait pu répondre à cette question en utilisant les deux requêtes séparées suivantes :
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •194
La requête (1) va retourner : 'DIRECTEUR' . On l’utilise alors pour exprimer la requête (2).
Lorsqu’une sous requête retourne un ensemble de valeurs , il faudra faire précéder l’opérateur de
comparaison (= , != , > , < , <= , >=) de la clause WHERE de la requête principale avec un des mots
clefs ANY ou ALL.
Q20: Quels sont les noms des employés ayant un salaire supérieur à celui d’un
employé quelconque du département 30 ?
SELECT Nom_Emp
FROM EMPLOYES
WHERE Salaire > ANY
( SELECT Salaire
FROM EMPLOYES
WHERE Nump_Dept = 30 )
La sous requête va retourner un ensemble de valeurs représentant les salaires du département 30.
Pour chaque employé, la requête principale va comparer son salaire avec l’ensemble des valeurs
retournées par la sous requête. Si le salaire est supérieur à une valeur quelconque de cet ensemble, cet
employé sera inclus dans le résultat.
Q21: Quels sont les noms des employés ayant un salaire supérieur à celui de
tous les employés du département 30 ?
SELECT Nom_Emp
FROM EMPLOYES
WHERE Salaire > ALL
( SELECT Salaire
FROM EMPLOYES
WHERE Nump_Dept = 30 )
On peut dans le cas ou la condition est = ANY , remplacer ce test par l’opérateur IN. De même
que != ALL peut être remplacer par NOT IN.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •195
Q22: Quels sont les noms et les fonctions des employés du département 10
ayant la même fonction qu’un employé quelconque du département 30 ?
Une sous requête peut retourner plus d’une colonne si la liste des attributs de sa clause SELECT
comprend plus d’un attribut. Le nombre d’attributs de la requête principale à comparer avec
l’ensemble des lignes (ou valeurs) retournées par la sous requête doit être égale au nombre de colonnes
retournées par la sous requête.
Q23: Quels sont employés ayant le même salaire et la même fonction que
l’employé ‘Omar’ ?
SELECT *
FROM EMPLOYES
WHERE (Salaire , Fonction) =
( SELECT Salaire , Fonction
FROM EMPLOYES
WHERE Nom_Emp = ‘Omar’ )
Il est aussi possible d’utiliser plusieurs sous requêtes imbriquées et construire ainsi des requêtes
aussi complexes qu’on le souhaite. C’est ce qui fait la puissance du langage SQL.
Q24: Quels sont les noms et les fonctions des employés ayant la même
fonction que l’employé ‘Omar’ ou un salaire supérieur ou égal à celui de
‘Rachid’?
OR Salaire > =
( SELECT Salaire
FROM EMPLOYES
WHERE Nom_Emp = ‘Rachid’ )
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •196
Une sous requête peut être aussi utilisée dans l’expression d’une jointure. L’évaluation de la sous
requête dépend de la façon dont on structure la requête qui la contient. Les exemples suivants
permettent de donner une idée sur quelques possibilités.
Q25: Quels sont les noms, Salaires et fonctions des employés travaillant à
‘Alger’ et ayant la même fonction que ‘Rachid’?
Dans cette jointure, la sous requête est exécutée en premier et fournit comme résultat un ensemble
de valeurs correspondant aux fonction des employés ayant pour nom ‘Rachid’. Si on est sûr que deux
employés ne peuvent pas avoir le même nom alors le IN peut être remplacé par =. Le résultat est
utilisé pour constituer la partie de la condition de jointure :
Dans notre exemple , l’ensemble retourné par la sous requête étant égal à ‘Vendeur’, la condition
de jointure serait équivalente à :
Ville = ‘Alger’
AND EMPLOYES•Num_Dept = DEPARTEMENTS•Num_Dept
AND Fonction IN (‘Vendeur’ )
Nous allons voir un autre exemple où l’évaluation de la sous requête ne se fait pas en une seule fois
indépendamment de la requête principale mais est répétée plusieurs fois en fonction de certaines
données provenant de la requête principale.
Q26: Quels sont les noms et Salaires des employés qui ont un salaire supérieur
à la moyenne des salaires de leur départements?
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •197
On remarque l’utilisation d’un nom synonyme X pour la table EMPLOYES dans la clause FROM
de la requête principale. X peut être vu comme une variable qui parcourt les tuples de la relation
EMPLOYES apparaissant dans la requête principale.
La clause WHERE X•Num_Detp = Num_Dept de la sous requête lui permet en quelque sorte de
se synchroniser avec la requête principale. Ainsi pour chaque tuple repéré par la variable X , la sous
requête va calculer la moyenne (fonction AVG : Average qui sera expliquée dans la suite) des salaires
du département ayant le même numéro que celui du tuple repéré par X et qui correspond à un employé
bien sûr. Le fait que la sous requête référence la même table EMPLOYES dans sa clause FROM ne
gêne en aucun cas la requête principale.
En logique on utilise généralement les deux quantificateurs ∃ (il existe) et ∀ (quelque soit) qui
s’appliquent à des propositions selon les deux formes : ∃ x P(x) et ∀ x P(x) . Dans le premier cas la
P(x) est vraie s’il existe au moins une valeur de x qui la rend vraie et dans le deuxième cas P(x) est
vraie si et seulement si elle est vraie pour toutes les valeurs de x .
SQL offre un prédicat qui s’appelle EXISTS équivalent du quantificateur existentiel ∃. Il permet
de tester si l’ensemble de valeurs (tuples) retourné par une requête (ou sous requête) est vide ou non.
Ce test est évalué à vrai (TRUE) si l’ensemble contient au moins une ligne et à faux (FALSE) si
l’ensemble retourné est vide.
SQL n’offre pas de prédicat équivalent du quantificateur ∀. Cependant, ce quantificateur peut être
traduit en utilisant l’opérateur EXISTS. En effet, Il suffit de remarquer l’équivalence entre les deux
formules suivantes :
∀ x P(x) ≡ ∃ x P(x)
L’utilisation du quantificateur ∀ est très rare dans l’expression des requêtes. Il sert surtout pour
exprimer l’opération algébrique de DIVISION dont la définition formelle utilise justement ce
quantificateur.
La différence entre deux relations peut s’exprimer grâce a l’opérateur MINUS dont l’utilisation est
semblable a celle de l’union entre deux relations. Il est aussi possible d’utiliser le prédicat EXISTS
pour réaliser cette opération. Nous allons illustrer la mise en ouvre de la différence à l’aide de la
question suivante :
Q27: Quels sont les numéros des départements dans lesquels travaillent des
'VENDEURS' mais pas des 'INGENIEURS' ?
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •198
SELECT Num_Dept
FROM DEPARTEMENT
WHERE Fonction ='VENDEUR'
AND NOT EXISTS
( SELECT Num_Dept
FROM DEPARTEMENT
WHERE Fonction ='INGENIEUR' )
On sait que la division d’une relation R de schéma R(A,B,C) par une relation S de schéma S(C) est
une relation Q de schéma Q(A, B) et telle que :
Autrement dit, en utilisant l’équivalence des formules : ∀ x P(x) ≡ ∃ x P(x) on peut traduire la
division comme suit :
Ainsi, la division va se traduire en SQL par l’utilisation de deux opérateurs NOT EXITS
successifs. Nous allons illustrer la mise en ouvre de la division à l’aide des deux relations suivantes :
PROFESSEURS(Num_Prof, Code_Mod)
MODULES(Code_Mod , Spécialité)
Q28: Quels sont les numéros des enseignants qui dispensent TOUS les
modules de la spécialité ‘INFORMATIQUE’?
SQL offre aussi un certain nombre de fonctions dites fonctions de groupes qui peuvent être
utilisées dans l'expression d'une requête. les plus importantes sont :
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •199
Nous allons commencer par illustrer à l’aide d’exemples comment utiliser les fonctions AVG, MIN
, MAX et COUNT puis nous examinerons de plus près la manipulation des groupes de tuples.
Q29: Quels sont les numéros et salaires des employés dont le salaire est
supérieur à 10% de la moyenne des salaires de son département ?
La sous requête est évalué en premier et permet de calculer le salaire maximum des employés. La
requête principale va parcourir les lignes de la table EMPLOYES et comparer le salaire de chaque
employé avec le résultat de la sous requête. S’il y a égalité, le nom , la fonction et le salaire de cet
employé figurera dans le résultat final.
SELECT COUNT(Prime)
FROM EMPLOYES
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •200
Le mot DISTINCT clé permet de ne compter une même valeur qu’une seule fois. Le nombre
retourné sera bien le nombre de valeurs différentes de l’attribut Fonction.
La clause GROUP BY permet de partitionner les tuples d’une relation de façon à former des
groupes de tuples. Chaque groupe de tuples est caractérisé par le fait que les tuples qu’il contient
possèdent les mêmes caractéristiques.
La manipulation des groupes implique donc que les requêtes peuvent comporter des clauses
WHERE , GROUP BY, des fonctions de groupes (AVG, SUM, MAX, MIN) et HAVING. La clause
WHERE est utilisée pour sélectionner dans une table les lignes (tuples) qui satisfont une condition.
Elle ne s’applique donc pas aux groupes. La clause HAVING est utilisée pour sélectionner dans une
table les groupes de lignes (tuples) qui satisfont une condition. Elle ne s’applique donc pas aux lignes
et s’utilise avec une clause GROUP BY.
Dans une requête manipulant des fonctions de groupe, il existe un ordre logique d'exécution de la
requête et qui est :
Si on veut connaître la moyenne des salaires des départements 20 et 30, il suffit d’utiliser la même
requête en remplaçant dans la clause WHERE Num_Dept = 10 par Num_Dept = 20 puis par
Num_Dept = 30 comme suit :
Au lieu d’utiliser 3 requêtes séparées, on peut obtenir la moyenne des salaires par département
avec une seule requête en utilisant une clause GROUP BY comme suit :
Q35: Quels est pour chaque département et chaque fonction le salaire annuel
(12 mois) moyen par fonction et le nombre d’employés exerçant cette
fonction?
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •201
Q37: Quels est pour chaque département le salaire annuel (12 mois) moyen de
tous ses employés sauf ceux ayant une fonction de ‘DIRECTEUR’ ou
‘PRESIDENT’?
Q38: Quels sont les numéros des départements ayant plus de 10 employés ?
SELECT Num_Dept
FROM EMPLOYES
GROUP BY Num_Dept
HAVING COUNT(*) > 10
Le COUNT(*) compte les tuples des sous-ensembles créés par GROUP BY. Les tuples de chaque
sous-ensemble crée ont la même valeur de l'attribut qui est utilisé dans le GROUP BY (c.a.d. ici
Num_Dept). Le résultat de cette requête sera une relation partitionnée en groupes de tuples ayant la
même valeur de l’attribut Num_Dept. A chacun de ces groupes sera appliquée 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 résultat par le biais de son attribut Num_Dept jouant le rôle de
dénominateur commun pour les tuples du groupe.
Q39: Quelles sont les différentes fonctions exercées dans l’ensemble des
départements et la moyenne des salaires par fonction ?
Q40: Quelles sont les différentes fonctions exercées dans l’ensemble des
départements dont la moyenne des salaires par fonction est supérieure à
10.000 ?
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •202
Q41: Quels sont les numéros des départements au moins deux employés
exerçant la fonction de ‘Vendeur’?
SELECT Num_Dept
FROM EMPLOYES
WHERE Fonction = ‘Vendeur’
GROUP BY Num_Dept
HAVING COUNT(*) > 2
Q42: Quels sont les numéros des départements dans lesquels la moyenne des
primes est supérieur à 10% de la moyenne des salaires?
parce que l’attribut Nom_Emp est un attribut ayant une valeur dans chaque ligne alors que AVG
(Salaire) représente une valeur correspondant à un ensemble de lignes qui seront sélectionnées. 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 requête.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •203
SELECT Nom_Emp
FROM EMPLOYES
WHERE Num_Dept = 10
ORDER BY Nom_Emp
Il est aussi possible de trier le résultat retourné par une requête en fonction de plusieurs attributs.
Q45: Liste des employés triés selon un ordre alphabétique de leur fonction et a
l’intérieur de chaque fonction les trier selon un salaire décroissant.
L’opérateur de comparaison IS NULL (ou IS NOT NULL) permet d’exprimer une condition avec une
colonne contenant des valeurs NULL.
La condition Prime = NULL n’est pas un test valide pour trouver les valeurs NULL. Son utilisation est
possible mais retourne un résultat vide.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •204
Q47: Liste des employés du département 30 dont la prime est inférieure a 1000.
On remarque que les employés du département 30 dont la prime est NULL ne sont pas inclus dans le
résultat.
Quelque soit l’ordre de tri ascendant (ASC) ou descendant (DESC), si dans une clause ORDER BY l’attribut
utilisé contient des valeurs NULL ou indéfinies, les t sera fonction du type de ou des attributs qui seront spécifiés
comme arguments de cette clause. Les exemples suivants permettent de donner une idée des possibilités de cette
clause.
SELECT Nom_Emp, Salaire, Prime
FROM EMPLOYES
ORDER BY Prime
Du fait que la colonne Prime contient des valeurs NULL, dans le résultat les lignes pour lesquelles l’attribut
Prime a une valeur NULL apparaîtront en premier suivies de celles pour lesquelles Prime n’est pas NULL et qui
seront alors triées par ordre croissant des primes.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •205
Pour créer une table on spécifie le nom de la table, les noms des colonnes ainsi que le type des
données de chaque colonne. Un nom de table ou de colonne (attribut) est un identificateur au sens
informatique du terme et obéit en général aux règles syntaxiques de construction d’un identificateur
(i.e. commencer par un caractère alphabétique, etc.).
Les Types de données possibles pour un attribut sont variés. Nous donnons ci-dessous des
exemples inspirés du SGBD ORACLE :
CHAR : caractères
NUMBER : chiffre de 0 à 9,signe et point décimal
DATE : date (MM-JJ-AA)
Exemple:
La spécification de la longueur maximale d'un champ permet au SGBD de contrôler si une valeur
ajoutée dans la colonne ne dépassera pas ce maximum.
Pour spécifier qu'une colonne ne doit pas contenir de valeurs NULL (ou indéfinies, inconnues), il
faut ajouter après le type l'option NOT NULL.
Exemple:
L’attribut NUMERO est un nombre dont la taille sera prise par défaut et ne comporter de valeurs
NULL. L’attribut NOM est une chaîne de 10 caractères au maximum. L’attribut MOYENNE est un
nombre de 4 chiffres dont 2 après la virgule.
La taille d'une colonne peut être augmentée grâce à la commande ALTER TABLE dont le format
est :
Exemple:
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •206
L’ajout d’une nouvelle colonne peut se faire grâce à la commande ALTER TABLE avec le Format
suivant :
Exemple:
La nouvelle colonne AGE sera rajoutée à droite des autres colonnes de la table et sera initialisée
par des valeurs NULL. On ne doit donc pas spécifier l'option NOT NULL à ce niveau. Cette colonne
peut être remplie grâce à la commande UPDATE (voir la commande UPDATE plus loin).
Pour supprimer une table, on utilise la commande DROP TABLE ayant le format suivant :
Exemple:
La commande INSERT permet d’insérer des lignes (tuples) dans une table. Son format général est
:
INSERT INTO <nom de relation>
VALUES (liste de valeurs)
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •207
Exemple:
On veut insérer une ligne ou un tuple dans la table ETUDIANTS correspondant à l’étudiant ayant
pour numéro 795 , pour nom JOJO , pour moyenne 12.54 et pour âge 21 ans.
On peut ajouter une ligne incomplète en ne donnant que les valeurs de certains attributs. Pour cela,
il faut préciser les noms de ces attributs (i.e. colonnes) dans INSERT.
Exemple:
On veut insérer une ligne ou un tuple dans la table ETUDIANTS correspondant à l’étudiant ayant
pour numéro 15 , pour nom TITI , pour âge 19 ans et dont on ne connaît pas le moyenne.
Toutes les autres colonnes de la table seront initialisées avec la valeur NULL. On remarque que
l’ordre des colonnes n’a pas d’importance alors que dans l’exemple précédent si car on n’a pas
spécifié les noms des attributs et donc l’ordre implicite est celui donné lors de la création de la table.
La commande UPDATE permet de changer la valeur d'un attribut. Son Format général est :
La clause WHERE est optionnelle. Elle sert à faire des changements sélectifs sur les lignes
satisfaisant les conditions spécifiées. WHERE peut contenir les mêmes conditions de recherches que
celles possibles avec une clause SELECT.
L'étudiant ayant pour nom TOTO , vient réclamer qu’il 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'
Lors de la saisie des attributs de l'étudiant numéro 795 des erreurs se sont glissées 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 séparées par une virgule dans la clause SET.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •208
La commande DELETE permet de supprimer des lignes d'une table. Elle permet donc de
supprimer une seule ligne dans une table ou plusieurs en même temps. Son format général est :
La clause WHERE est optionnelle. Elle sert à faire des suppressions sélectives des lignes
satisfaisant les conditions spécifiées. WHERE peut contenir les mêmes conditions de recherches que
celles possibles avec SELECT ou UPDATE.
Exemple 1:
Exemple 2:
Supprimer tous les étudiants ayant la même moyenne que l'étudiant ayant pour nom : TOTO.
Une commande DELETE sans clause WHERE implique la suppression de toutes les lignes de la
table.
Une vue est dérivée d'une ou plusieurs tables réelles. Du fait que le résultat d'une requête est lui-
même une table, une vue peut donc être définie grâce à une requête. Le format général d’une requête
de création d'une vue est :
Exemple :
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •209
On peut utiliser toute la puissance de SQL pour définir une VUE. La commande CREATE VIEW
ne doit pas contenir de clause ORDER BY car l'ordre est spécifié lorsqu'on exécute une requête sur la
vue. Cependant quelques limites existent telles que :
On peut utiliser une jointure entre tables dans la définition d’une vue.
Exemple :
On veut créer une vue RECHERCHE à partir des tables EMPLOYES , DEPARTEMENTS
uniquement les noms , fonctions et salaires des employés du département ‘RECHERCHES’ dont le
salaire est supérieur à 1000 ?
On peut utiliser dans toute requête SQL le nom d'une vue, comme on peut utiliser toute la
puissance du langage SQL pour interroger une vue.
Exemple :
Quels sont les nom et les moyennes de tous les étudiants dont le nom se termine par 'R'
SELECT NOM,MOYENNE
FROM MOYENNE_ETUDIANTS
WHERE NOM LIKE ‘%R’
Il faut souligner que les changements qui sont faits dans les tables sont directement visibles dans
les vues qui ont été définies à partir de ces tables. Par exemple , la requête précédente n'affichera pas
l’étudiant de nom 'BERBAR' si ce dernier a été supprimé de la table ETUDIANTS par la commande
de suppression de tuples DELETE.
On peut ajouter, mettre à jour ou supprimer des lignes dans une vue de la même façon qu'avec une
table. Cependant certaines opérations (comme l'insertion) sur une vue engendrent des problèmes au
niveau de la répercussion de ces opérations sur les tables qui ont servi à définir cette vue. C'est le
problème de propagation des mises à jour sur une vue.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •210
Exemple :
ETUDIANTS(NUMERO,NOM,MOYENNE,AGE)
Donc l'insertion du tuple ('BACHIR', 12) dans la vue ne peut se répercuter dans la table
ETUDIANTS que sous la forme du tuple suivant : (NULL,'BACHIR',12,NULL)
ou NULL correspond à une valeur indéfinie. Ceci pose un problème car l'attribut NUMERO a été
défini comme NOT NULL lors de la création de la table ETUDIANTS et on ne pourra donc pas
insérer le tuple (NULL,'BACHIR',12,NULL) dans la table. Donc on ne peut pas répercuter l'insertion
faite sur la vue au niveau de la table qui a permis de créer cette vue. Le problème 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
données. Certains auteurs le qualifient de COBOL des années 90. Il constitue aussi le support idéal au
développement des L4G (langages de 4ieme génération). Un L4G est un outil de productivité
permettant de développer des applications complètes 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 développés autour
de SQL. Ceci inclue :
- un générateurs d'états
- un tableur
- un utilitaire de sortie graphique
- un générateur d'application
- etc.
Enfin, rien ne remplacerais l’apprentissage du langage par la pratique en utilisant n’importe 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 qu’il existe beaucoup d’autres SGBD
relationnels distribués gratuitement et pouvant même fonctionner dans une architecture Client/Serveur
comme par exemple MySql.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •211
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •212
Exercice 1:
Donnez pour chacune des questions suivantes une requête SQL permettant de répondre a cette
question :
Q1 : Liste des départements avec pour chacun la moyenne des salaires du département
Q2 : Liste par ordre croissant de leur salaire des employés travaillant dans la ville de BATNA
Q3 : Pour chaque département donnez le nombre d’employés exerçant comme responsable dans ce
département.
Q5 : Liste des employés ayant le même salaire que l’employé numéro 100
Q6 : Donnez les noms et salaires des employés dont le salaire est plus grand que le salaire moyen de
leur département
Q7 : Liste des départements yant au moins 3 employés dont le salaire est égal a 5000
Q8 : Donnez les noms et salaires des employés dont le salaire est supérieur a celui de leur
responsable ainsi que le nom est le salaire de ce responsable
Exercice 2:
Donnez pour chacune des questions suivantes une requête SQL permettant de répondre a cette
question :
Q2 : Liste des INSTITUTS avec pour chacun la moyenne d’âge de cet institut
Q3 : Quel est le nom de l’étudiant le plus âgé ainsi que le nom de son institut
Q4 : Liste des instituts ayant au moins deux étudiants dont l’âge est égal a 16.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Chapitre 5 : Présentation générale DE SQL •213
Q6 : Donnez les noms et âges des étudiants ayant le même âge que l’étudiant ayant le numéro 200.
Q8 : Donnez les noms et âges des étudiants dont l’âge est supérieur a la moyenne d’âge de leur
institut.
Q9 : Donnez les noms et âges des étudiants dont l’âge est supérieur a celui de leur délégué ainsi que
le nom et l’âge de ce délégué.
Exercice 3:
Reprendre les exercices du chapitre 4 en exprimant toutes les requêtes algébriques avec SQL
Exercice 4:
Comme SQL ne peut être bien maîtrisé que par la pratique, on vous propose d’utiliser un SGBD
relationnel de votre choix (ACCESS, Oracle, MySQL) et d’implémenter la bases de données de
l’exercice 1 avec les extensions des tables fournies au début du chapitre en utilisant les requêtes SQL
adéquates.
Une fois vos tables créées et remplies, Reprendre les exemples de requêtes données tout au long du
chapitre pour enfin voir les résultats de chacune et s’assurer de leur validité.
Dr. Brahim BELATTAR - Dpt d’informatique – Faculté des Sciences de l’ingénieur - Univéristé de Batna - 05000 - Algérie
Bibliographie
Bibligoraphie
• CARDENAS A. F. , Database Management Systems, ALLYN and BACON Inc., Second Edition ,
USA, 1985
• CARREZ C. , Des structures aux bases de données , 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 , ADDISON-
WESLEY PUBLISHING COMPANY, 1986
• DELOBEL C. , M. ADIBA , Bases de données et systèmes relationnels, DUNOD informatique,
France, 1982
• GALACSI, Concetin de bases de données : du schéma conceptuel aux schémas physiques, ,
DUNOD informatique, France, 1989
• GALACSI, Les systèmes d’information : Analyse et conception , DUNOD informatique, France,
1989
• GAMACHE A., Logiciels SGBD et bases de données, Les Presses de l’Université LAVAL,
Quebec, 1980
• GARDARIN G., Bases de données : les systèmes et leurs langages, EYROLLES, France, 1982
• KORTH H. F. , SILBERSCHATZ A., Database System Concepts, Second Edition , McGraw-
Hill, Inc., USA, 1991
• MARTIN D. , Techniques avancées pour bases de données , DUNOD informatique, France, 1985
• MIRANDA S., BUSTA J.S., L’art des Bases de données : Tome 2 - Les bases de données
relationnelles, EYROLLES, France, 1986
• ULLMAN J. D. , Principles of Database Systems, Computer Science Press, Second Edition ,
USA, 1982
Dr. Brahim BELATTAR - LISA - Dpt d’informatique - Faculté des sciences de l’Ingénieur - Univ. de Batna - 05000 - Algérie