Vous êtes sur la page 1sur 57

I NFORMATIQUE C OMMUNE

Introduction aux
Bases de Donnes
Relationnelles

Serge Abiteboul
Inria, ENS Cachan, Conseil national du numrique
serge.abiteboul@inria.fr

Benjamin Nguyen
Universit de Versailles St-Quentin-en-Yvelines, Inria
benjamin.nguyen@uvsq.fr

Yannick Le Bras
Mathmatiques MPSI, Lyce Montesquieu, Le Mans
yannick.le-bras@prepas.org

CPGE

Logic is the beginning of wisdom, not the end.


Mr. Spock, Star Trek

Table des matires


1 Introduction
1.1 Les principes et larchitecture . . . .
1.2 Le calcul et lalgbre relationnels . .
1.3 Loptimisation de requte . . . . . .
1.4 Les transactions . . . . . . . . . . .
1.5 Conception dune Base de Donnes
1.6 Notions du programme officiel . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

7
7
9
11
13
14
14

2 Le Calcul Relationnel
2.1 Objectif du chapitre . . . . . . . . . . . . . . . . .
2.2 Concepts des Bases de Donnes . . . . . . . . . . .
2.2.1 Dfinitions et Notations . . . . . . . . . . .
2.3 Calcul conjonctif . . . . . . . . . . . . . . . . . . .
2.3.1 Exemples . . . . . . . . . . . . . . . . . . .
2.3.2 Formules bien-formes du calcul conjonctif .
2.3.3 Exercices corrig . . . . . . . . . . . . . . .
2.3.4 Conclusion . . . . . . . . . . . . . . . . . .
2.4 Calcul relationnel . . . . . . . . . . . . . . . . . . .
2.4.1 Formules bien-formes du calcul relationnel
2.4.2 Exercices corrigs . . . . . . . . . . . . . . .
2.4.3 Pour aller plus loin . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

17
17
17
17
20
20
20
21
22
22
23
23
24

3 LAlgbre Relationnelle
3.1 Objectif du chapitre . . . . . . .
3.2 Algbre conjonctive . . . . . . . .
3.3 Algbre relationnelle . . . . . . .
3.4 Thorme dEquivalence de Codd

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

27
27
27
31
31

. . . . .
. . . . .
. . . . .
. . . . .
WHERE
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

33
33
33
35
36
36
37
37
37
39
40
40

.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

4 SQL et Requtes Agrgat


4.0.1 Objectif du chapitre . . . . . . . . . .
4.1 Le langage de dfinition de donnes . . . . . .
4.2 Le langage de manipulation de donnes . . .
4.3 Linterrogation des donnes . . . . . . . . . .
4.3.1 La syntaxe SQL du SELECT, FROM,
4.3.2 Traduction en calcul relationnel . . . .
4.3.3 Traduction en algbre relationnelle . .
4.3.4 Exemple de requtes . . . . . . . . . .
4.4 Requtes agrgats . . . . . . . . . . . . . . .
4.5 Requtes ensemblistes . . . . . . . . . . . . .
4.6 Tri . . . . . . . . . . . . . . . . . . . . . . . .
5

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.

TABLE DES MATIRES


5 Exercices
5.1 Objectif du chapitre . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Activits du Programme Officiel . . . . . . . . . . . . . . . . .
5.2.1 Installation du SGBD MySQL, du serveur web Apache,
PHPMyAdmin et de la BD banque-simple . . . . . . . .
5.2.2 De la prsentation des exercices . . . . . . . . . . . . . .
5.2.3 Mthodologie pour rpondre une question . . . . . . .
5.2.4 Requtes sur une base de donnes existante . . . . . . .
5.3 Corrigs des exercices . . . . . . . . . . . . . . . . . . . . . . .
5.4 Exercices hors programme . . . . . . . . . . . . . . . . . . . . .

. .
. .
de
. .
. .
. .
. .
. .
. .

. . . . . . . .
. . . . . . . .
lapplication
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

41
41
42
42
47
48
49
52
56

Introduction

Nous allons parler de systmes informatiques qui nous aident grer des donnes. Nous avons
donc, dun ct, un serveur de donnes quelque part sur la Toile, avec des disques magntiques 1 et
leurs pistes qui gardent prcieusement des squences de bits, des structures daccs compliques
comme des index ou des arbres-B, des hirarchies de mmoires avec leurs caches et, de lautre,
un utilisateur. Supposons que le serveur soit celui dIMDb qui gre une base de donnes sur le
cinma. Supposons que lutilisateur, disons Alice, veuille savoir quels films ont t raliss par
Alfred Hitchcock. Pour ce faire, elle spcifie des mots-cls ou remplit les champs dun formulaire
propos par IMDb. Sa question voyage depuis son navigateur jusquau serveur de donnes. L,
cette question est transforme en un programme peut-tre complexe qui sexcute pour obtenir
la rponse. Ce qui est important : ce programme, Alice na pas envie de lcrire ; elle na pas
lcrire.
Le systme lmentaire qui permet de grer des donnes est un systme de fichiers. Un fichier
est une squence de bits qui peut reprsenter une chanson, une photo, une vido, un courriel, une
lettre, un roman, etc. Votre ordinateur personnel et votre tlphone stockent leurs donnes dans
des systmes de fichiers. Et parfois quand vous ne savez plus o vous avez mis quelque chose, vous
faites des recherches dans ces systme de fichiers. Cest rudimentaire. Un moteur de recherche
de la Toile ne fait pas autre chose, seulement il le fait sur un systme de fichiers lchelle de la
plante. Dans ce chapitre, nous parlerons de systmes qui grent aussi des donnes mais qui sont
bien plus sophistiqus que les systmes de fichiers : les systmes de gestion de bases de donnes.
Ce sont des logiciels complexes, rsultats de dizaines dannes de recherche et de dveloppement.
Ils permettent des individus ou des programmes dexprimer des requtes pour interroger des
bases de donnes ou pour les modifier. Nous nous focaliserons ici sur les plus rpandus dentre
ces systmes, les systmes relationnels, parmi lesquels nous trouvons des logiciels commerciaux
trs rpandus comme celui dOracle et des logiciels libres trs utiliss comme MySQL.
Dans ce livre, nous couvrons le programme des classes prparatoires scientifiques, toutefois
il nous est paru indispensable daller au del dune interprtation stricte du programme, pour
permettre au lecteur de comprendre les fondements de la thorie des bases de donnes, sans
laquelle il ne serait quun simple utilisateur de SGBD. Nous indiquons les lments qui sont
la limite du programme par la notation , et ceux qui sont au del par la notation .

1.1

Les principes et larchitecture

Au fil des ans, trois grands principes ont merg qui ont faonn le domaine de la gestion de
donnes :
Abstraction : Un systme de gestion de bases de donnes sert de mdiateur entre des
1. lheure actuelle, un nombre croissant de serveurs utilisent dsormais des disques bass sur de la mmoire
Flash, appels Solid State Drive (SSD). Les travaux historiques sur les systmes de gestion des bases de donns font
lhypothse de lutilisation de disques magntiques. Loptimisation des SGBD aux disques SSD est du domaine
de la recherche actuel (voir [?]).

CHAPITRE 1. INTRODUCTION

(a) ClientServeur

(b) Trois Tiers


(c) Base de donnes


dans les nuages

Figure 1.1 Architectures principales


individus et des machines. Pour mieux sadapter aux individus, il doit organiser et prsenter
les donnes de faon intuitive et permettre de les manipuler en restant un niveau abstrait
sans avoir considrer des dtails dimplmentation.
Indpendance : nous distinguons trois niveaux, physique, logique et externe, que lon essaie de rendre le plus indpendants possible. Au niveau externe, nous trouvons les vues
dutilisateurs particuliers qui partagent la base de donnes. Chaque vue est adapte aux
besoins de lutilisateur. Au niveau logique, nous trouvons une organisation unique des donnes typiquement dans le modle relationnel que nous dtaillons plus loin. Et au niveau
physique, les dtails de lorganisation sur disque et de structures comme des index dont
le rle est dacclrer les calculs. Le but est de pouvoir modifier un niveau (par exemple,
ajouter un nouvel utilisateur avec de nouveaux besoins) sans modifier les autres niveaux.
Universalit : Ces systmes visent capturer toutes les donnes dune entreprise, dun
groupe, dune organisation quelconque, pour tout type dapplications. Il leur faut donc
offrir des langages de dveloppement dapplications puissants et une gamme de fonctionnalits trs riche. Des limites de cette universalit existent aujourdhui pour les systmes
relationnels : normment de donnes moins structures sont par exemple gres dans des
systmes de fichiers.
Mentionnons brivement les architectures les plus rpandues de systmes de gestion de donnes. Voir Figure ??. Une premire architecture est celle des systmes client/serveur. La base de
donnes est gre sur un serveur. Lapplication tourne sur une autre machine, le client. De plus
en plus, cette architecture se complique avec lintroduction dun troisime tiers (ce qui signifie
en ralit niveau en anglais), une machine qui gre linterface, typiquement un navigateur Web
sur une tablette ou un laptop.
Nous pouvons noter diffrentes volutions gnres par des amliorations dans les matriels
disponibles :
laccroissement des performances notamment fondes sur les mmoires vives de plus en
plus massives, et des mmoires flash encore plus massives ;
8

CHAPITRE 1. INTRODUCTION
Film
Titre
Casablanca
Casablanca
Les 400 coups
Star Wars

Ralisateur
M. Curtiz
M. Curtiz
F. Truffaut
G. Lucas

Acteur
Humphrey Bogart
Peter Lore
J.-P. Leaud
Harrison Ford

Sance
Titre
Casablanca
Casablanca
Star Wars
Star Wars

Salle
Lucernaire
Studio
Sel
Sel

Heure
19 :00
20 :00
20 :30
22 :15

Figure 1.2 Une base de donnes relationnelles


lutilisation de plus en plus de paralllisme massif dans des grappes de machines pour
traiter dnormes volumes de donnes. On parle parfois de big data ;
pour simplifier la gestion de donnes, on tend la dporter dans les nuages (le cloud),
cest--dire mettre ses donnes dans des grappes de machines gres par des spcialistes
comme Amazon.

1.2

Le calcul et lalgbre relationnels

Un systme de gestion de bases de donnes doit aussi proposer un langage, pour exprimer des
requtes, facilement utilisable par des tres humains. Ces exigences forment le point de dpart
du modle relationnel [Cod70, AHV95] propos par Ted Codd, un chercheur dIBM, dans les
annes 1970. Des mathmaticiens avaient dvelopp la fin du 19e sicle (bien avant linvention
de linformatique et des bases de donnes) la Logique du premier ordre, pour formaliser le langage
des mathmatiques. Codd a eu lide dadapter cette Logique pour dfinir un modle de gestion
de donnes, le modle relationnel.
Dans le modle relationnel, les donnes sont organises en tableaux deux dimensions que
nous appellerons des relations. la diffrence des mathmaticiens, nous supposons les relations
de taille finie. Comme illustration, nous utiliserons une base de donnes consistant en une relation
Film et une relation Sance (voir Figure 1.2). Une ligne de ces relations est appele un n-uplet
(ou tuple en anglais). Par exemple, hStar Wars, Sel, 22 :15 i est un n-uplet darit 3, cest-dire un triplet, dans la relation Sance. Les colonnes ont des noms, appels attributs, comme
Titre. Un n-uplet est not de la manire suivante : h Casablanca, M. Curtiz, umphrey
Bogarti
Les donnes sont interroges en utilisant comme langage le calcul relationnel. Le calcul
relationnel (trs fortement inspir de la Logique du premier ordre) sappuie sur des noms qui
reprsentent des relations comme Film ou Sance, des entres de ces relations comme Star
Wars, des variables comme t, h, et des symboles logiques, (et), (ou), (non), (implique),
(existe), (pour tout). partir de ces ingrdients, des formules logiques peuvent tre construites
telles que :
qHB = t, r; (Film(t, r, Humphrey Bogart) Sance(t, s, h))
Si cela vous parait cryptique, en franais, cela se lit : il existe un titre t et un ralisateur r
tels que le n-uplet h t, r, Humphrey Bogart i se trouve dans la relation Film, et le n-uplet h
t, s, h i dans Sance. Observez que s et h ne sont pas quantifies dans la formule prcdente ;
nous dirons que ces deux variables sont libres. La formule qHB peut tre vue comme une requte
du calcul relationnel. Elle se lit alors : donnez-moi les salles s et les horaires h, sil existe un
ralisateur r et un titre t tels que... En dautres termes,
O et quelle heure puis-je voir un film avec Humphrey Bogart ?. Pour faciliter la lisibilit
de ces formules logiques, on peut exprimer une requte en dfinissant prcisment la forme du
n-uplet (nomm res dans la suite du document) en lui affectant les variables libres que lon
cherche obtenir, ce qui est implicite dans lexpression prcdente :
9

CHAPITRE 1. INTRODUCTION

{res(s, h)| t, r; (Film(t, r, Humphrey Bogart) Sance(t, s, h)}

Lintrt de ce procd est quon peut ensuite rutiliser les n-uplets rsultats exactement
comme sil sagissait dune relation. Cest ce quon appelle le mcanisme des vues. Une vue est
une relation, qui au lieu dtre stocke dans la base de donnes, est dfinie intentionnellement.
Un utilisateur de la base de donnes peut lutiliser comme nimporte quelle autre relation.
Ce langage, le calcul relationnel, que nous prsentons en Chapitre 2 permet dexprimer des
questions dans une syntaxe qui vite les ambiguts de nos langues naturelles. Si elles pouvaient
aimer, les machines aimeraient la simplicit et la prcision du calcul relationnel. En pratique,
elles utilisent le langage SQL (pour Structured Query Language) qui exprime diffremment les
mmes questions. Par exemple la question prcdente sexprime en SQL comme :
SELECT salle, heure
FROM Film, Seance
WHERE
Film.titre = Seance.titre AND acteur= "Humphrey Bogart"
Cest presque comprhensible. Non ? Et quAlice sexprime en franais ou quelle utilise une
interface graphique, le systme transforme sa question en requte 2 SQL. Nous prsentons le
langage SQL au Chapitre 4.
La requte (question) du calcul relationnel prcdente (ou en SQL) prcise bien ce quAlice
demande. Cette question a un sens prcis : une smantique. Elle dfinit 3 une rponse, un ensemble de n-uplets. Ce que la question ne dit pas cest comment calculer la rponse. Pour le
comment, on utilise lalgbre relationnelle introduite par Codd, et que nous prsentons en Chapitre 3. Une tape importante consiste transformer une question du calcul en une expression
algbrique qui permet de calculer la rponse cette question.
Lalgbre relationnelle consiste en un petit nombre doprations de base qui, appliques
des relations, produisent de nouvelles relations. Ces oprations peuvent tre composes pour
construire des expressions algbriques de plus en plus complexes. Pour rpondre la question
qui nous sert dexemple, il nous faudra trois oprations, la jointure, la slection et la projection,
que nous composerons dans lexpression suivante de lalgbre relationnelle :
EHB = salle,heure (titre (acteur=Humphrey Bogart )(Film)) 1 Sance)
Nous pourrons suivre lvaluation de cette expression algbrique en Figure 1.3. Lopration
de slection, dnote , filtre une relation, ne gardant que les n-uplets satisfaisant une condition,
ici acteur = Humphrey Bogart. Lopration de projection, dnote , permet aussi de filtrer
de linformation dune relation mais cette fois en liminant des colonnes. Lopration peut-tre
la plus exotique de lalgbre, la jointure, dnote 1, combine des n-uplets de deux relations.
Dautres oprations non illustres ici permettent de faire lunion et la diffrence entre deux relations ou de renommer des attributs. La puissance de lalgbre relationnelle tient de la possibilit
de composer ces oprations. Cest ce que nous avons fait dans lexpression algbrique EHB qui
permet dvaluer la rponse la question qHB .
Notre prsentation est rapide mais il est important que le lecteur comprenne lintrt de
lalgbre. Nous reviendrons l dessus plus en dtail au Chapitre 3. En effet, il est relativement
simple dcrire un programme qui value la rponse une question du calcul relationnel. Il est
plus dlicat dobtenir un programme qui calcule cette rponse efficacement. Lalgbre relationnelle dcoupe le travail. Un programme particulier trs efficace peut tre utilis pour chacune
des oprations de lalgbre ; le rsultat est obtenu en composant ces programmes. Lefficacit
provient notamment de ce que les oprations considrent des ensembles de n-uplets plutt que
les n-uplets un un.
2. SQL va plus loin que le calcul relationnel. Par exemple, il permet dordonner les rsultats et dappliquer
des fonctions simples comme la somme ou la moyenne.
3. Nous ne prciserons pas comment dans ce cours.

10

CHAPITRE 1. INTRODUCTION

salle,heure

salle,heure

salle,heure

xjoin

Titre= Harry Po0er

Titre= Harry Po0er

Film

Salle

Salle

Film

Titre= Harry Po0er


I
N
D
E
X

Film

Salle

(a) (b) (c)

Figure 1.3 Des plans dexcution algbriques

Le Thorme de Codd
Codd a dmontr le thorme suivant :
Thorme 1.2.1. [Codd] : une question est exprimable en calcul relationnel si et seulement si
elle peut tre value avec une expression de lalgbre relationnelle, et il est facile de transformer
une requte du calcul en une expression algbrique qui value cette requte.
Que nous apprend ce thorme ? Pas grand-chose du point de vue des mathmatiques. Le
calcul relationnel est emprunt aux logiciens. Une algbrisation (lgrement diffrente) avait
mme dj t propose par Tarski. Mais dun point de vue informatique, Codd a pos les
bases de la mdiation autour des donnes entre individus et machines. Grce son rsultat,
nous savons que nous pouvons exprimer une question en calcul relationnel, quun systme peut
traduire cette question en expression algbrique et calculer efficacement sa rponse. Pourtant,
quand Codd proposa cette approche, la raction des ingnieurs qui graient alors de gros volumes
de donnes et de grandes applications, fut unanime : trop lent ! a ne passera pas lchelle.
Ils se trompaient. Pour traduire lide de Codd en une industrie de milliards de dollars, il
manquait loptimisation de requte. Aprs des annes deffort, les chercheurs sont parvenus faire
fonctionner les systmes relationnels avec des temps de rponse acceptables. Avec ces systmes,
le dveloppement dapplications grant des donnes devenait beaucoup plus simple ; cela se
traduisait par un accroissement considrable de la productivit des programmeurs dapplications
grant des gros volumes de donnes.

1.3

Loptimisation de requte

Il existe une infinit dexpressions algbriques qui valuent une mme requte. Si elles sont
syntaxiquement diffrentes, elles dfinissent la mme question. Dun point de vue smantique,
elles sont quivalentes. Optimiser une requte consiste la transformer en une autre qui donne
les mmes rponses, mais qui soit la moins coteuse possible (typiquement en temps). Dun point
11

CHAPITRE 1. INTRODUCTION

de vue pratique, il nous faut choisir un plan dexcution, cest--dire une expression algbrique
avec des prcisions sur lalgorithme utiliser pour valuer chacune des oprations. Un plan dexcution, cest quasiment un programme pour calculer la rponse. Un premier problme est que
lespace de recherche, cest--dire lespace dans lequel nous voulons trouver le plan dexcution,
est gigantesque. Pour viter de le parcourir entirement, nous allons utiliser des heuristiques,
cest--dire des mthodes qui, si elles ne garantissent pas de trouver le plan optimal, donnent
assez rapidement des plans satisfaisants. Ces heuristiques utilisent souvent des rgles de bon sens
comme : il faut raliser les slections le plus tt possible. Lautre difficult est que pour choisir le
plan le moins chronophage, loptimiseur (cest--dire le programme en charge de loptimisation)
doit tre capable destimer le cot de chaque plan candidat et cest une tche complexe laquelle
le systme ne peut se permettre daccorder trop de ressources. Donc, loptimiseur fait de son
mieux. Et typiquement les optimiseurs de systmes comme Oracle ou DB2 font des merveilles
sur des requtes simples. Cest bien moins glorieux pour les requtes complexes, par exemple
mettant en jeu des quantificateurs universels comme la question : quels sont les acteurs qui nont
jou que dans des comdies ? Heureusement, en pratique, la plupart des questions poses par
des applications utilisant des bases de donnes sont simples.
Sous-jacent dans la discussion sur loptimisation de requte est la question de la difficult
dobtenir une certaine information. Nous rencontrons la notion de complexit. Depuis Gdel,
nous savons quil est des propositions qui ne peuvent tre ni dmontres ni rfutes, quil est des
problmes qui ne peuvent tre rsolus. Cette notion dindcidabilit commence pniblement
arriver jusquau grand public. Ce mme public ne voit dans le fait quune requte prend plus ou
moins longtemps que des raisons purement techniques. Evidemment, le temps de calcul dpend
de la puissance du serveur, de la vitesse du disque ou de la qualit de loptimiseur. Mais au-del
de tels aspects, il est des tches qui demandent intrinsquement plus de temps que dautres.
Par exemple, nous pouvons facilement afficher un graphe avec 100 noeuds ; a ne prend que
quelques fractions de secondes. Par contre, cela prendrait normment de temps dafficher un
aprs lautre tous les graphes possibles reliant ces 100 noeuds. Mme parmi les problmes dont
la rponse est courte (par exemple, la rponse est oui ou non), il en est qui, bien que dcidables,
sont intrinsquement bien plus complexes que dautres ; il en est mme que nous ne savons
pas rsoudre en temps raisonnable. Parfois, cette difficult trouve mme son utilit. Le systme
cryptographique RSA repose sur le fait que nous ne savons pas factoriser (en gnral) un trs
grand entier en nombres premiers, en un temps raisonnable et quil est donc trs difficile de
dcrypter un message sans en connatre la cl secrte.
La complexit est un aspect particulirement important pour le traitement de gros volumes
de donnes. Pour une requte particulire, nous voulons savoir :
quel temps il faut pour la raliser ? complexit en temps,
quel espace disque (ou quelle mmoire) est ncessaire ? complexit en espace.
Evidemment ces quantits dpendent de la taille de la base de donnes. Si la requte prend
un temps t et que nous doublons la taille n de nos donnes, nous faut-il attendre le mme temps
(temps constant), le double de temps (temps linaire en n), ou est-ce que le temps grandit de
manire polynomiale (en nk o n est la taille des donnes) voire exponentielle (en k n ) ? Ce nest
pas anodin : sur de gros volumes de donnes, une complexit en temps nk exigera une grosse
puissance de calcul, et une complexit en k n sera rdhibitoire.
De nombreuses classes de complexit ont t tudies. Intuitivement, une classe de complexit regroupe tous les problmes qui peuvent tre rsolus sans dpasser certaines ressources
disponibles, typiquement le temps ou lespace. Par exemple, vous avez peut-tre entendu parler de la classe P, temps polynomial. Il sagit de lensemble des problmes quil est possible de
rsoudre dans un temps nk o n est la taille des donnes et k un entier arbitraire. Au-del de
P, nous atteignons les temps NP (pour non-dterministe polynomial 4 ) et EXPTIME (temps
4. Un exemple de problme difficile dans NP est celui du voyageur de commerce. Etant donnes des villes, des

12

CHAPITRE 1. INTRODUCTION
exponentiel), des temps prohibitifs ? Pourtant, il faut relativiser. Les systmes informatiques
rsolvent routinirement des problmes parmi les plus complexes de NP. Et, a contrario, pour
1.5 traoctets de donnes, n3 est encore aujourdhui hors datteinte, mme en disposant de tous
les ordinateurs de la plante.
Avant de poursuivre sur dautres aspects du modle relationnel, interrogeons-nous sur les
origines de lnorme succs des systmes relationnels :
les requtes sont fondes sur le calcul relationnel, un langage logique, simple et comprhensible pour des humains surtout dans des variantes comme SQL ;
une requte du calcul relationnel est facilement traduisible en une expression de lalgbre
relationnelle simple valuer pour des machines ;
il est possible doptimiser lvaluation dexpressions de lalgbre relationnelle car cette
algbre noffre quun modle de calcul limit ;
enfin, pour ce langage relativement limit, le paralllisme permet de passer lchelle de
trs grandes bases de donnes.
Pour insister sur les deux derniers points qui sont essentiels, nous pourrions choisir pour les
bases de donnes le slogan : ici on ne fait que des choses simples mais on les fait vite.
Continuons avec un aspect essentiel de la gestion de donnes, mais qui est hors programme :
les transactions.

1.4

Les transactions

La modernisation des chanes de fabrication a t principalement cause dans un premier


temps par llectronique et lautomatique. Avant de simposer aussi dans la production, linformatique a elle profondment pntr lindustrie en modifiant radicalement la manire dont des
transactions, comme les commandes ou la paye, taient gres de manire automatique. Une
transaction informatise est la forme dmatrialise dun contrat. Son cot peut se trouver incomparablement plus faible que celui dune transaction relle mettant en jeu des dplacements de
personnes sur des chelles de temps bien plus longues. Avec des fonctionnalits considrablement
largies par le recours linformatique, les transactions se retrouvent au cur de nombreuses
applications qui ont largement contribu populariser les systmes relationnels comme, par
exemple, les applications bancaires.
Les systmes relationnels rpondent aux besoins des transactions en supportant la notion de
transaction relationnelle. Une transaction relationnelle garantit quune squence doprations se
ralise correctement, par exemple en empchant quune somme dargent ne svanouisse dans la
nature (avec un compte en banque dbit sans quun autre ne soit crdit). Mme loccurrence
dune panne 5 ne doit pas pouvoir conduire une excution incorrecte. Il nous faut donc formaliser la notion dexcution correcte. Evidemment, il serait impossible de le faire prcisment sil
fallait tenir compte des millions de choses que font de tels systmes. Mais linformatique, comme
les mathmatiques, dispose dun outil fantastique : labstraction. Nous pouvons considrer ce
que fait un systme relationnel sous langle des transactions relationnelles et des modifications
quelles apportent aux donnes, en faisant abstraction de toutes les autres tches quil ralise. Il
devient alors possible de dfinir formellement la notion dexcution correcte.
Nous pouvons mentionner dautres tches que les systmes relationnels accomplissent cot
de lvaluation de requtes et de la gestion de transactions relationnelles. Ils grent galement :
les contraintes dintgrit (telles que tout responsable de projet doit tre enregistr dans la
base des personnels) ;
routes entre ces villes, et les longueurs de ces routes, trouver le plus court chemin pour relier toutes les villes.
5. Les applications qui tournent sur le systme relationnel contiennent des bogues. Le systme lui-mme
contient ses propres bogues. Enfin les matriels peuvent dysfonctionner.

13

CHAPITRE 1. INTRODUCTION
les dclencheurs ou triggers (tels que si quelquun modifie la liste des utilisateurs, envoyer
un message au responsable de la scurit) ;
les droits des utilisateurs (pour contrler qui a le droit de lire ou de modifier quoi) ;
les vues (pour sadapter aux besoins dutilisateurs particuliers) ;
larchivage (pour pouvoir retrouver des donnes primes depuis des lustres) ;
le nettoyage des donnes (pour liminer les doublons, les incohrences).

1.5

Conception dune Base de Donnes

Nous ne discuterons pas non plus dans ce document dun autre aspect trs important qui
est la conception dune base de donnes, dun point de vue abstrait. En effet, si le programme
officiel utilise le terme de conception dun schma relationnel, le travail de conception de la
structure de la base passe en gnral par un modle beaucoup plus abstrait, nomm Modle
Entit-Association (E-A), qui a t introduit par Chen dans [Che76] en 1976. Ce modle est un
modle gnral de conception, qui peut tre traduit ensuite dans le modle relationel ou dans
un autre modle (par exemple objet). Lui sont associes des mthodologies de conception, cest-dire des rgles qui permettent en principe dobtenir, partir dune situation de la vie relle
quon souhaite modliser, un modle correct. Lintrt du modle E-A est quil est plus intuitif
que le modle relationel, ne ncessite pas de comptences mathmatiques et se prte bien
une prsentation graphique. Il est donc utilis pour changer avec des personnes du mtier quon
souhaite informatiser.

1.6

Notions du programme officiel

Le programme officiel de CPGE est dfini de la manire suivante, et pse pour 15% de la
premire anne, soit environ 6 semaines, dcoup en 6 sances d1h de cours (prfrablement 3
sances de 2h) et 3 sances de 2h de TP. Nous indiquons dans le tableau suivant les sections qui
dcrivent chaque point du programme. Le programme encourage une approche applicative au
thme des bases de donnes, ce qui est naturel, puisque les bases de donnes sont partout dans
la vie de tous les jours. Nanmoins, il nous parait extrmement rducteur de faire croire que
les bases de donnes ne sont quun domaine dapplication. Outre des exemples applicatifs,
nous prsentons ainsi une approche plus formelle et mathmatique, qui nous parait parfaitement
adapte au niveau des lves des classes prparatoires. Il serait en effet regrettable de faire croire
que lapprentissage fondamental des bases de donnes se limite lutilisation de ressources
prsentes par les sites grand public, mme si ces sites sont de bonnes rfrences techniques
pour un utilisateur dbutant, et permettent une mise en oeuvre rapide de la pratique des bases
de donnes sans passer par lapprentissage et la comprhension de tous les concepts.
Le programme propose galement les exercices suivants :
utiliser une application de cration et de manipulation de donnes, offrant une interface
graphique, notamment pour crer une base de donnes simple, ne comportant pas plus de
trois tables ayant chacune un nombre limit de colonnes. Linstallation et lexploitation
dun serveur SQL ne fait pas partie des attendus.
lancer des requtes sur une base de donnes de taille plus importante, comportant plusieurs
tables, que les tudiants nauront pas eu construire, laide dune application offrant
une interface graphique
enchaner une requte sur une base de donnes et un traitement des rponses enregistres
dans un fichier.
Nous avons dj dans ce chapitre introductif, bross un tableau des possibilits et des problmes lis aux bases de donnes, en particulier de problmes qui ne sont pas au programme.
14

CHAPITRE 1. INTRODUCTION
Contenus
Vocabulaire des bases de donnes :
relation(2.2), attribut(2.2),
domaine(2.2), schma de
relation(2.2) ; notion de cl
primaire(4.1).
Oprateurs usuels sur les ensembles
dans un contexte de bases de
donnes : union, intersection,
diffrence. Oprateurs spcifiques
de lalgbre relationnelle :
projection(3.2), slection (ou
restriction)(3.2), renommage(3.2),
jointure(3.2), produit(3.2) et
division cartsiennes (3.3) ;
fonctions dagrgation : min, max,
somme, moyenne, comptage (4.4).
Concept de client-serveur(1.1).
Brve extension au cas de
larchitecture trois-tiers(1.1).

Prcisions et commentaires
Ces concepts sont prsents dans
une perspective applicative, partir
dexemples.

Ces concepts sont prsents dans


une perspective applicative. Les
seules jointures prsentes seront les
jointures symtriques, simples (utilisant JOIN . . . ON . . . =. . . ).

On se limite prsenter ce concept


dans la perspective applicative
dutilisation de bases de donnes.

Dans la suite de ce document, nous nous consacrons aux aspects spcifiques du programme,
dbutant dans le Chapitre 2 toutefois par un aspect qui nest pas explicitement au programme,
mais qui nest pas non plus explicitement hors programme, car il est fondamental : il sagit du
calcul relationnel, fondement thorique des bases de donnes, sans quoi cette partie du cours se
rsumrait une utilisation des bases de donnes comme un simple outil. Puis, dans le Chapitre 3 nous discutons de lalgbre relationnelle, et donnons quelques exemples doptimisation,
problmatique fondamentale des bases de donnes. Dans le Chapitre 4 nous prcisons la syntaxe
SQL, et discutons du problme de laggrgation de donnes. Enfin, dans le Chapitre 5 nous
proposons du contenu pour le droulement de trois sances de TP, deux sur machine et une sur
papier. Le dcoupage en trois chapitres de cours, respecte cette division que nous prconisons.

15

CHAPITRE 1. INTRODUCTION

16

2
2.1

Le Calcul Relationnel

Objectif du chapitre

Dans ce chapitre, nous montrons par lexemple comment crire des requtes en utilisant le
formalisme logique du calcul relationnel. Lintrt de cette criture est quelle est dclarative
et non pas imprative, cest--dire quelle exprime ce quon souhaite obtenir et non pas comment lobtenir. Ce paradigme est dj utilis dans des langages fonctionnels comme Caml qui
permettent de sabstraire de dtails de calculs. Mais le calcul relationnel va bien plus loin en
laissant au systme le choix de lalgorithme dvaluation.
Avant toute chose, nous allons dfinir formellement des notations, et une terminogie. Cela
pourra paratre un peu lourd ; on sappuiera sur les exemples pour bien comprendre quil ny a
rien de vraiment complexe. Puis nous passerons au langage de requtes proprement dit.

2.2

Concepts des Bases de Donnes

Nous utiliserons dans la suite de ce chapitre le schma de base de donne CINEMA de la


Figure 2.1. Nous illustrerons la longue liste de dfinitions qui suit avec cet exemple.

2.2.1

Dfinitions et Notations

Dfinition 2.2.1. (Attribut) On dispose dun ensemble (infini) att dattributs. On associe
un attribut a, un ensemble de constantes, potentiellement infini not 1 dom(a). On note dom
lunion des ensembles de toutes les constantes de tous les attributs. On utilisera aussi un ensemble
var de variables.
Exemple 2.2.2: Dans la base de donnes CINEMA, Titre ou Salle sont des attributs.
Les entiers, les rels ou les jours de la semaine, sont des domaines.
Dfinition 2.2.3. (Schma relationnel) Un schma relationnel R consiste en un ensemble fini
de n attributs U = {u1 , . . . , un }. On le note aussi R[u1 , . . . , un ] ou tout simplement R[U ]. On
dfinit une fonction sort, qui associe chaque schma relationnel son ensemble dattributs,
cest--dire sort(R) = U .
Exemple 2.2.4: Film est un schma relationnel, avec :
sort(Film) = {Titre; Directeur; Acteur}.

1. Parfois, galement appel type de a

17

CHAPITRE 2. LE CALCUL RELATIONNEL


On omet souvent les virgules et les parenthses pour les ensembles dattributs ; et par exemple,
on crit :
sort(Film) = Titre Directeur Acteur.
Dfinition 2.2.5. (Arit) Larit dun schma relationnel est son nombre dattributs. On note
donc arite(R) = #sort(R), o # reprsente le cardinal dun ensemble.
Exemple 2.2.6: Larit de Film est 3.
Dfinition 2.2.7. (Schma de base de donnes) Un schma de base de donnes R est un
ensemble fini de p schmas relationnels que lon crit R = {R1 [U1 ], . . . , Rp [Up ]} pour indiquer
les schmas relationnels qui la composent ainsi que leurs sorts.

Exemple 2.2.8: CINEMA = { Film [Titre Directeur Acteur ] ; Coordonnes


[SalleAdresseTlphone ] ; Sance [SalleTitreHoraire ] } est un schma de base
de donnes.
Dfinition 2.2.9. (n-uplet) Un n-uplet (ou nuplet, ou encore tuple en anglais) est une fonction
sur un ensemble fini U dattributs. Plus prcisment, un n-uplet u sur U est une fonction de U
dans dom. Dans ce cas, le sort de u est U , et son arit est |U |.
On crit les n-uplets linairement, par exemple, hA : 5, B : 3i. Lordre dans cette syntaxe
est un ordre implicite att sur att. Soit u un n-uplet sur U et A U ; comme il est standard
en mathmatiques, u(A) dnote la valeur de u pour lattribut A. On tend cette notation aux
sous-ensembles de U . Soit V U , u[V ] dnote le n-uplet v sur V tel que v(A) = u(A) pour
chaque A V (cest--dire u[V ] = u|V , la restriction de la fonction u V ). Le n-uplet sur un
ensemble vide dattributs est dnot h i.
Dfinition 2.2.10. (Relation) Une relation, appele galement instance sur un schma relationnel R[U ] (ou sur un ensemble U dattributs), est un ensemble fini I de n-uplets sur U . On
dira que le sort de I est U et que son arit est |U |.
Chaque table dans la Figure 2.1 est la reprsentation graphique dune relation.
Dfinition 2.2.11. (Base de Donnes) Une base de donnes I, appele galement instance dun
schma de base de donnes R est une fonction dont lensemble de dfinition est R et telle que
pour chaque R R, I(R) est une relation sur R.
Pour rsumer, la Figure 2.1 reprsente une instance de la base de donnes CINEMA. Le
schma de base de donnes correspondant est donn par :
CINEMA = {Film, Coordonnes, Sance}
o les les schmas relationnels Film et Coordonnes, et Sance sont tous darit 3 et ont les
sorts suivants :
sort(Film)
= {Titre, Directeur, Acteur}
sort(Coordonnes) = { Salle, Adresse, Tlphone}
sort(Sance)
= {Salle, Titre, Horaire}
Pour simplifier, on supposera par la suite que tous les attributs auront comme domaine lensemble
des chanes de caractres 2 .
2. On pourrait dfinir par exemple lhoraire comme une expression rgulire dfinissant un sous-ensemble des
chanes de caractres, comme dfini par la norme ISO 8601.

18

CHAPITRE 2. LE CALCUL RELATIONNEL

Titre

Film

Mais
Mais
Mais
Mais

qui
qui
qui
qui

a
a
a
a

tu
tu
tu
tu

Harry ?
Harry ?
Harry ?
Harry ?

Directeur

Acteur

Hitchcock
Hitchcock
Hitchcock
Hitchcock

Gwenn
Forsythe
MacLaine
Hitchcock

Cris
Cris
Cris
Cris

Coordonnes

et
et
et
et

chuchotements
chuchotements
chuchotements
chuchotements

Bergman
Bergman
Bergman
Bergman

Andersson
Sylwan
Thulin
Ullman

Salle

Adresse

Tlphone

Gaumont Opra
Saint Andr des Arts
Le Champo

31 bd. des Italiens


30 rue Saint Andr des Arts
51 rue des Ecoles

47 42 60 33
43 26 48 18
43 54 51 60

Georges V
Les 7 Parnassiens

Sance

144 av. des Champs-Elyses


98 bd. du Montparnasse

45 62 41 46
43 20 32 20

Salle

Titre

Horaire

Gaumont Opra
Saint-Andr des Arts
Georges V

Cris et chuchotements
Mais qui a tu Harry ?
Cris et chuchotements

20 :30
20 :15
22 :15

Les 7 Parnassiens

Cris et chuchotements

Figure 2.1 La base de donnes CINEMA

19

20 :45

CHAPITRE 2. LE CALCUL RELATIONNEL

2.3

Calcul conjonctif

Nous allons dmarrer avec des exemples de requtes simples. Ensuite, nous les complexifions
en rajoutant des concepts au fur et mesure du chapitre. Nous dbutons donc avec des oprateurs logiques en nombre restreint, mais qui permettent tout de mme de rpondre certaines
questions simples. . . et la plupart du temps les questions que se posent les utilisateurs de bases
de donnes sont simples.

2.3.1

Exemples

Voici quelques exemples de requtes en franais que nous pouvons poser sur cette base.
Dans la suite de ce document, nous donnerons des expressions formelles sous forme du calcul
relationnel permettant de capturer la smantique de ces requtes, et des expressions algbriques
permettant de calculer les rsultats de ces requtes.
(2.2.1) Qui est le metteur en scne de Cris et chuchotements ?

(2.2.2) Quelles salles affichent Chiens de paille ?


(2.2.3) Quels sont ladresse et le numro de tlphone du cinma Le Studio ?
Chacune de ces requtes ne met en jeu quune relation unique. Les requtes suivantes impliquent
plusieurs relations :
(2.2.4) Donner les noms et adresses des salles affichant un film de Bergman.
(2.2.5) Donner les paires de personnes telles que la premire a mis en scne la seconde, et vice
versa ;
(2.2.6) Peut-on voir un film de Bergman la salle Gaumont Opra ?
Considrons plus en dtail la requte (2.2.4). Intuitivement, on veut dire :
si les n-uplets r1 , r2 , r3 respectivement dans les relations
Film, Sance, Coordonnes sont tels que
le Directeur dans r1 est Bergman
et les Titre dans r1 et r2 sont les mmes
et les Salle dans r2 et r3 sont les mmes
alors nous voulons les Salle et Adresse du n-uplet r3 .

2.3.2

Formules bien-formes du calcul conjonctif

Le calcul conjonctif est dfini formellement de la manire suivante et correspond informellement la logique du premier ordre avec uniquement des conjonctions et le quantificateur
existentiel.
Un terme t est une constante ou une variable, on note t var dom. Pour un schma de
base de donne R et R R, un atome sur R est une expression R(t1 , . . . , tn ) o n = arite(R)
et chaque ti est un terme.
Par exemple, la constante Chiens de paille et les variables xd , xa sont des termes et
Film(Chiens de paille, xd , xa ) est un atome sur Film.
Les formules de base incluent les atomes sur R et les expressions e = e0 pour des termes e, e0 .
Les formules bien-formes sont de la forme :
(a) , o est une formule de base sur R ; ou
(b) ( ) o et sont des formules bien-formes sur R ; ou
(c) x , o x est une variable et une formule bien forme sur R.

20

CHAPITRE 2. LE CALCUL RELATIONNEL

Exemple 2.3.1: 0 = Film(xt , Bergman, xa ) Sance(xs , xt , xh ) est une formule


bien-forme, puisque Film(xt , Bergman, xa ) et Sance(xs , xt , xh ) sont deux atomes.
Les notions doccurrence de variables libres et lies dans une formule sont dfinies de la
manire usuelle. Une occurrence dune variable x est libre dans une formule si :
(i) est un atome ; ou
(ii) = ( ) et loccurrence de x dans ou est libre ; ou
(iii) = y , x et y sont des variables distinctes, et loccurrence de x est libre dans .
Lensemble libre() est lensemble des variables qui ont au moins une occurrence libre dans .
Une variable est lie si elle nest pas libre.
Exemple 2.3.2: libre(0 ) = {xt , xa , xs , xh }.
Dfinition 2.3.3. Requte Une requte est dfinie comme une expression de la forme
{t1 , . . . , tm | }
o t1 , . . . , tm sont des termes et o lensemble des variables apparaissant dans t1 , . . . , tm est
exactement libre().
Exemple 2.3.4: {Bergman, xt , xa , xs , xh | Film(xt , Bergman, xa ) Sance(xs , xt ,
xh ) } est une requte.
Une telle requte va dfinir une fonction. Applique une instance de schma de base de
donnes, elle va retourner une relation darit m, cest--dire un ensemble de n-uplets darit m,
les rsultats. On pourra donner la relation rsultat :
res = {t1 , . . . , tm | }
On dira quon a dfini une vue de la base de donnes. La diffrence entre une relation de la base
de donnes et une vue de cette mme base, est que la relation est stocke sur disque et quelle
peut tre modifie, alors que la vue est calcule partir des relations stockes et quelle nest
pas directement modifiable.

2.3.3

Exercices corrig

Nous donnons ici les requtes permettant dexprimer les exemples de la Section 2.3.1.
Exemple 2.3.5: La requte (2.2.1) Qui est le Directeur de Chiens de paille ? scrit :
res = {xd | xa , Film(Chiens de paille, xd , xa )} .
On notera que la rponse est un ensemble de nuplets. Donc on pourra avoir zro, une ou
plusieurs rponses.
Exemple 2.3.6: La requte (2.2.2) Quelles salles projettent Chiens de paille ? scrit :
res = {xs | xh , Sance(xs , Chiens de paille, xh )} .
Exemple 2.3.7: La requte (2.2.3) Adresse et numro de tlphone du Studio ? scrit :
res = {xa , xt | Coordonnes(Studio, xa , xt )} .
Exemple 2.3.8: La requte (2.2.4) Nom et Adresse des salles projetant un film de Bergman ? scrit :

21

CHAPITRE 2. LE CALCUL RELATIONNEL


res = {xs , xad | xtel , xh , xact , xtitre , Film(xtitre , Bergman, xact )
Sance(xs , xtitre , xh )
.
Coordonnes(xs , xad , xtel )}
Observons que la variable xtitre apparait dans latome sur la relation Film et celui sur
Sance. On parle bien dun film de Bergman, et on cherche une sance de ce film et pas
dun autre.
Notons que cette mme requte peut galement scrire en regroupant les variables quantifies ensemble.
res = {xs , xad | xh , xact , xtitre , Film(xtitre , Bergman, xact )
Sance(xs , xtitre , xh )
.
xtel , Coordonnes(xs , xad , xtel )}
Exemple 2.3.9: La requte (2.2.5) Paires directeur/acteur ? scrit :

res = {xd , xa | xt , Film(xt , xd , xa )}


Exemple 2.3.10: La requte (2.2.5) Peut-on voir un film de Bergman la salle Gaumont
Opra ? scrit :
res = {h i | xt , xs , xh Film(xt , Bergman, xa )
Film(Gaumont Opra, xt , xh )}
On notera que lensemble rsultat contiendra le n-uplet darit 0 h i si la formule logique est
vraie, et sera vide sinon.

2.3.4

Conclusion

Le calcul conjonctif est simple et possde une quivalence smantique trs intressante avec
lalgbre SPJR, prsente dans la Section 3.2. Toutefois, il ne permet pas de poser certaines
questions :
(2.3.1) O puis-je voir le film Annie Hall ou Manhattan ? il faudrait la disjonction, cest-dire le OU (), ce qui donne le calcul positif !
(2.3.2) Quels sont les acteurs qui ont jou dans tous les films de Hitchcock ? il faudrait le
quantificateur universel.
(2.3.3) Quels sont les films que Hitchcock a dirigs, mais dans lesquels il na pas jou en tant
quacteur ? il faudrait la ngation ! Dans la section suivante, nous prsentons le calcul
relationnel, qui permet dexprimer ces types de questions.
Ce qui est intressant, cest quen rajoutant simplement la ngation, on obtient la fois la
disjonction et le quantificateur universel, puisque ( ), et x (x()).

2.4

Calcul relationnel

En ajoutant la ngation au calcul conjonctif, on obtient le calcul relationnel, qui est essentiellement le calcul des prdicats du premier ordre (sans symbole de fonction). On a un problme :
celui de garantir des rsultats finis.
On donnera ici une interprtation particulire simplificatrice : linterprtation dans le domaine actif ; et nous envisagerons ensuite des interprtations plus riches.
22

CHAPITRE 2. LE CALCUL RELATIONNEL

2.4.1

Formules bien-formes du calcul relationnel

Un terme est une constante ou une variable, cest--dire un lment de var dom. Pour
un schma de base de donne R et R R, un atome sur R est une expression R(t1 , . . . , tn ) o
n = arit
e(R) et chaque ti est un terme.
Les formules de base incluent les atomes sur R et les expressions e = e0 pour des termes e, e0 .
Les formules (bien-formes) sont de la forme :
(a) , o est une formule de base sur R ;
(b) , o est une formule bien forme sur R ;
(c) ( ), ( ) o et sont des formules bien formes sur R ; et
(d) x , x , o x est une variable et une formulebien forme sur R.
Comme il est usuel,
x1 , x2 , . . . , xm est une abrviation de x1 x2 . . . xm ,
et on inclue souvent deux connecteurs logiques supplmentaires implique () et est quivalent
() que lon voit de la manire suivante

( ) ( )
Nous tendons les notions doccurrence de variables libres et lies dj introduites. Une
occurrence dune variable x est libre dans une formule si :
(i) est un atome ; ou
(ii) = ( ) et loccurrence de x dans ou est libre (et idem pour ) ; ou
(iii) = y , x et y sont des variables distinctes variables, et loccurrence de x est libre dans
(et idem pour ).
Lensemble libre() est lensemble des variables qui ont au moins une occurrence libre dans .
Une variable est lie si elle nest pas libre.
Une requte est dfinie comme une expression de la forme
{t1 , . . . , tm | }
o t1 , . . . , tm sont des termes et o lensemble des variables apparaissant dans t1 , . . . , tm est
exactement libre().

2.4.2

Exercices corrigs

Exemple 2.4.1: La requte (2.3.1) Salles o on peut voir Annie Hall ou Manhattan
est exprime par :
res = {xt | xs1 , xs2 (Sance(xt , Annie Hall, xs1 ) Sance(xt , Manhattan, xs2 ))}.
Notons que si la question implique quon voulait les voir exactement au mme horaire de
dbut, alors il faudrait crire :

res = {xt | xs (Sance(xt , Annie Hall, xs ) Sance(xt , Manhattan, xs ))}


Exemple 2.4.2: La requte (2.3.2) Acteurs qui ont jou dans tous les films de Hitchcock
est exprime par :
res = {xa | xf , Film(xf , Hitchcock, xa )}.
23

CHAPITRE 2. LE CALCUL RELATIONNEL

Exemple 2.4.3: La requte (2.3.3) Films dirigs par Hitchcock dans lesquels il na pas
jou est exprime par :
res = {xt | xa Film(xt , Hitchcock, xa ) Film(xt , Hitchcock, Hitchcock)} .

2.4.3

Pour aller plus loin

Cette section est hors-programme. Elle est utile pour le lecteur qui souhaite comprendre plus
profondment le Thorme dquivalence, nonc la Section 3.4.1
Requtes non sres
Avant de prsenter une smantique prcise, on prsente intuitivement les problmes dans les
expressions suivantes :

(non-sre-1) {x
| Film(Cris et chuchotements, Bergman, x)}
(non-sre-2) {x, y | Film(Cris et chuchotements, Bergman, x)
Film(y, Bergman, Ullman)}
Dans le calcul des prdicats, la requte non-sre-1 produit tous les nuplets hai tels que a dom
et hCris et chuchotements, Bergman, ai nest pas dans la relation Film. Comme la relation
Film est par dfinition finie et que dom est infini, la requte donne un rsultat infini. Comme
linput est par dfinition fini, le requte donne un rsultat infini. La mme remarque est vraie
pour la requte non-sre-2, mme si elle nutilise pas explicitement la ngation.
Une solution naturelle (encore que pas totalement satisfaisante) est de considrer que les
variables prennent leurs valeurs dans un contexte restreint, par exemple, une variable de type
acteur ne prend comme valeurs que les acteurs connus de la base. Mme si les domaines sousjacents sont finis, les utilisateurs ne sont pas censs les connatre et il est gnant que le rsultat
des requtes dpende de cette information.
Un autre problme assez subtil vient de la quantification. Considrons la requte
(non-sre-3)

{x | y R(x, y)}

Si R est fini, alors la rponse cette requte est finie, mais elle dpend du domaine des y auxquels
on applique le quantificateur. En effet, si y prend sa valeur dans la totalit de dom(y) et que
dom(y) est infini, alors aucun x ne pourra vrifier cette relation, puisquil ne peut tre au mieux
en relation quavec un nombre fini de y. Ainsi, le rsultat serait toujours vide. Si on considre
une interprtation sur un domaine fini, alors le rsultat pourrait tre non vide, puisquil ny a
alors plus dincompatibilit entre la possibilit quil existe un x en relation avec un ensemble fini
de valeurs de y.
Cest la notion de domaine actif (le domaine effectivement utilis) qui va nous permettre de
contourner ces difficults.
Interprtation dans le domaine actif
Soit une requte q = {libre(), constantes | }, et une base de donnes I (cest dire une
instance dun schma R). On note adom(q, I) lensemble des constantes apparaissant soit dans
q soit dans I, et on le considre comme domaine pour les variables de la requte (en dautres
termes, on nautorise comme valeur possible des variables uniquement des valeurs prsentes dans
la base de donnes ou dans la requte). On considre donc des valuations de libre() dans
adom(q, I). Alors, I satisfait pour (dans cette interprtation dans le domaine actif), dnot
I |=adom [], si
24

CHAPITRE 2. LE CALCUL RELATIONNEL


(a) = R(u) est un atome et (u) I(R) ;
(b) = (s = s0 ) est un atome dgalit et (s) = (s0 ) ;
(c) = ( ) et I |=adom [] et I |=adom [] ;
(d) = ( ) et I |=adom [] ou I |=adom [] ;
(e) = et I 6|=adom [], cest--dire, I |=adom [] nest pas vrai ;
(f) = x et pour quelque c adom, I |=adom [ {x/c}] ; ou
(g) = x et pour chaque c adom, I |=adom [ {x/c}].
o {x/c} reprsente lextension de u obtenue en ajoutant llment x son domaine et en
lui assignant la valeur c.
Soit R un schma, et q = {t1 , . . . , tn | } une requte du calcul sur I. Alors, limage de I
par q (pour cette smantique) est donne par :
qadom (I) = {(ht1 , . . . , tn i) | I |=adom [],
est une valuation sur libre()
dont limage est incluse dans adom}.
Autres smantiques
On peut dfinir la smantique dune requte en prenant dom la place du domaine actif.
Dans ce cas, la rponse une requte peut tre considre comme indfinie si le rsultat est
infini. Les requtes intressantes dun point de vue pratique sont celles dont la rponse ne
dpend pas du choix du domaine (en supposant quil contienne au moins le domaine actif).
Malheureusement, cette proprit est indcidable, cest--dire quil nexiste pas dalgorithme qui
dcide si une requte dpend ou non du domaine. On a donc dvelopp une gamme de critres
suffisants (qui garantissent que les requtes sont bien indpendantes du domaine). Les langages
utiliss en pratique rpondent ces critres, notamment en forant lutilisateur prciser le
domaine des variables quil utilise. Nous verrons cela avec SQL.

25

CHAPITRE 2. LE CALCUL RELATIONNEL

26

3
3.1

LAlgbre Relationnelle

Objectif du chapitre

Dans ce chapitre, nous montrons comment crire des requtes en utilisant lalgbre relationnelle. Lintrt de cette criture est quelle conduit directement des algorithmes pour valuer
les requtes, calculer leurs rponses. Nous donnons (sans preuve formelle) le rsultat sans doute
le plus fondamental de ce domaine : le thorme dquivalence de Codd. Ce thorme tablit
lquivalence entre le calcul et lalgbre relationnels. En fait, lintrt rside dans la traduction
des requtes (provenant de lutilisateur) en requtes directement valuables (et optimisables)
par le systme. Si on voit la base de donne comme un outil tampon entre lutilisateur (humain)
et une machine, ce rsultat est la pierre angulaire de cette interface.

3.2

Algbre conjonctive

Par algbre, nous entendons ici simplement un ensemble avec des oprations fermes sur
cet ensemble. Lalgbre et ses oprations vont apporter une perspective trs diffrente sur les
requtes des bases de donnes relationnelles. Nous considrons des oprations unaires et binaires
sur des relations. Lapplication de ces oprations exige certaines contraintes de typage. (Cest
une algbre plusieurs sorts). Nous verrons pour chaque opration les contraintes quelle impose
ses arguments.
Dans un premier temps, nous considrons quatre oprations : slection, projection, jointure et
renommage. Nous appellerons algbre conjonctive lalgbre obtenue avec ces quatre oprations.
Un rsultat essentiel est lquivalence entre le calcul conjonctif et lalgbre conjonctive.
Commenons par un exemple qui nous permettra dillustrer deux oprations unaires et une
opration binaire :
la slection note qui permet dliminer des nuplets (des lignes de relation)
la projection note qui permet dliminer des attributs (des colonnes de relation).
la jointure note 1 qui permet de combiner les informations de plusieurs relations.
Ces oprations seront dfinies formellement plus loin.
Exemple 3.2.1: La requte (2.2.4), Quels sont les nom et adresse des salles affichant un
film de Bergman peut tre construite en utilisant des oprations algbriques. Dabord, on
utilise la slection pour extraire les n-uplets de Film avec Bergman comme Directeur :
I1 := Directeur=Bergman (Film).
Ensuite, on obtient la liste des titres de films par projection :
I2 := Titre (I1 ).

27

CHAPITRE 3. LALGBRE RELATIONNELLE


Observez que ces deux oprations permettent de filtrer linformation en rduisant le nombre
de lignes et de colonnes dune relation.
La jointure nous sert relier des donnes contenues dans plusieurs tables. On a par I2 les
titres de films de Bergman. On y rajoute les salles et adresses par jointures : I2 et Sance
on en commun le Titre et Sance et Coordonnes on en commun lattribut Salle :
I3 := I2 1 Sance 1 Coordonnes.
Le rsultat est obtenu en se dbarrassant des colonnes inutiles :
I4 := Salle,Adresse (I3 ).
En dautres termes, la requte (2.2.4) peut tre obtenue par :
Salle,Adresse (Titre (Directeur=Bergman (Film)) 1 Sance 1 Coordonnes),
ou simplement par :

Salle,Adresse (Directeur=Bergman (Film 1 Sance 1 Coordonnes))


Comme le montre lexemple prcdent, la jointure naturelle peut tre utilise pour construire
des ponts entre donnes venant de plusieurs relations en utilisant les noms dattributs communs. Cependant, cela nest pas possible si on veut relier deux relations suivant des noms
dattributs distincts. Un autre exemple va nous permettre de montrer comment raliser cela en
utilisant une quatrime opration, le renommage. Nous poursuivons donc par un exemple, et
dfinissons ensuite ces quatre oprations formellement.
Exemple 3.2.2: Supposons que la base de donnes CINEMA est tendue par une relation
Aime de schma {Personne, Directeur }, o Aime(x, y) indique que Personne x aime
Directeur y. Pour rpondre la requte Quels directeurs sont aims dau moins un de
leurs pairs ? on aimerait faire la jointure entre les relations Film et Aime en associant la
colonne Directeur de la premire la colonne Personne de la seconde. Pour ce faire, on
commence par renommer (oprateur ) lattribut Directeur en Personne dans Film.
On peut ensuite faire la jointure du rsultat avec Aime et rpondre la requte par :
Directeur (DirecteurPersonne (Film) 1 Aime)
Notons que lattribut Directeur sur lequel on projette au final est lattribut de la relation
Aime, lattribut de la relation Film ayant t renomm !
Les oprations sont dfinies formellement de la manire suivante.
Slection : La slection a la forme A=a et A=B , A, B att et a dom. Pour I une relation
(ayant A (respectivement A, B) parmi ses attributs),
A=c (I) = {t I | t(A) = c}

A=B (I) = {t I | t(A) = t(B)}.

Au contraire, C=c (I) est incorrect car I na pas dattribut C.


Projection : La projection a la forme A1 ,...,An , n 0 o A1 , . . . , An att. Pour I une relation
(ayant A1 , . . . , An parmi ses attributs),
A1 ,...,An (I) = {hA1 : t(A1 ), . . . , An : t(An )i | t I}
Au contraire, C,C 0 (I) est incorrect si I na pas dattribut C ou C 0 .
Si lon considre un n-uplet comme une fonction, on peut dfinir la projection laide de
la notion de restriction dune fonction un sous-ensemble de son ensemble de dfinition de la
faon suivante :
A1 ,...,An (I) = {t|A1 ,...,An | t I}.
28

CHAPITRE 3. LALGBRE RELATIONNELLE


Jointure (naturelle) : Cette opration, dnot 1, sapplique deux relations quelconques I
et J de sorts V et W , respectivement, et produit une relation de sort V W :
I 1 J = {t sur V W | il existe v I et w J,
t|V = v et t|W = w}
Quand sort(I) = sort(J), I 1 J = I J (cest lintersection ensembliste classique), et quand
sort(I) sort(J) = , alors I 1 J est le produit cartsien de I et J, dnot I J.
Par exemple, considrons I1 , I2 , deux relations sur AB, I3 sur BC et I4 sur CD. Alors on a :
I1 1 I2 = I1 I2 est une relation sur AB,
I1 1 I3 est une relation sur ABC, et
I1 1 I4 = I1 I4 est une relation sur ABCD.
Lopration de jointure est associative et admet comme lment neutre la relation darit 0
non vide {hi}. Comme la jointure est associative, on sautorise la voir comme polyadique, par
exemple, on crira I1 1 1 In , ou mme 1 {Ii } pour un ensemble {Ii } dinstances en utilisant
aussi la commutativit de la jointure.
Renommage : Un renommage pour un ensemble fini dattributs U est une fonction injective de
U dans att que lon notera A1 B1 , . . . , An Bn . Lopration de renommage A1 B1 ,...,An Bn
transforme une relation sur A1 , . . . , An en une relation sur B1 , ..., Bn de la manire suivante :
A1 B1 ,...,An Bn (I) = {v sur B1 , . . . , Bn | il existe u I, v(Bi ) = u(Ai ) pour tout i [1..n]}
Nous allons dfinir lalgbre conjonctive. Les lments de cette algbre sont appels des
requtes algbriques et ses oprations sont les oprations de slection (, appel galement restriction), de projection (), de renommage () et de jointure naturelle (1).
Une requte algbrique est une application qui associe une instance I dun schma R une
relation dun schma particulier. Pour construire lensemble des requtes algbriques, on dfinit
en premier lieu un ensemble de requtes algbriques de base :
si R est un schma de relation de R, alors [R] est une requte algbrique ;
Si A est un attribut de att et a un lment du domaine dom, alors {hA : ai} est une
requte algbrique.
Ce second type de requtes est appel requte constante. On donne ces deux types de requtes
algbriques la smantique suivante :
[R](I) = I(R)
{hA : ai}(I) = {hA : ai}
cest dire que lorsque lon applique [R] une base de donnes I de schma R, le rsultat est la
relation I(R), et lorsque lon applique {hA : ai} une base de donnes de schma R, le rsultat
est la relation une ligne et une colonne {hA : ai}. Ainsi, le sort de la requte [R] est tout
simplement sort(R) et celui de {hA : ai} est A.
Exemple 3.2.3: Sur le schma CINEMA, le sort de [Film] est Titre, Directeur, Acteur
et celui de {hDirecteur : Bergmani} est Directeur.
Lensemble des requtes algbriques est engendr partir de ces requtes de bases et des
oprateurs de slection, projection, renommage et jointure de la faon suivante : si q1 et q2 sont
deux requtes algbriques, A1 , . . . , An , B1 , . . . , Bn des attributs et c un lment de dom, alors :
A1 =c (q1 ) et A1 =A2 (q1 ) sont des requtes algbriques ;
A1 ,...,An (q1 ) est une requte algbrique ;
A1 B1 ,...,An Bn (q1 ) est une requte algbrique ;
29

CHAPITRE 3. LALGBRE RELATIONNELLE


q1 1 q2 est une requte algbrique.
On donne aux oprateurs et la jointure de requtes algbriques la smantique suivante, o
I est une instance dun schma de base de donnes R et un oprateur de slection, projection
ou renommage et q1 et q2 deux requtes algbriques :
(q1 )(I) = (q1 (I)) ;
(q1 1 q2 )(I) = q1 (I) 1 q2 (I).
Exemple 3.2.4: [Film] 1 {hDirecteur : Bergmani} est une requte algbrique, dont la
smantique donne :
[Film] 1 {hDirecteur : Bergmani}(CINEMA)
= [Film](CINEMA) 1 {hDirecteur : Bergmani}(CINEMA)
= Film 1 {hDirecteur : Bergmani}
Cest donc la jointure naturelle entre la relation Film et la relation {hDirecteur : Bergmani},
cest--dire, lensemble des films dont le directeur est Bergman. On remarque que la requte
algbrique suivante donne le mme rsultat :
Directeur=Bergman ([Film])(CINEMA).
On peut donc crire :

[Film] 1 {hDirecteur : Bergmani} = Directeur=Bergman ([Film])


Le rsultat important de la section est le suivant :
Thorme 3.2.5. (Thorme dquivalence) Une requte est exprimable en calcul conjonctif
si et seulement si elle est exprimable en algbre conjonctive.
Point Crucial : Toute requte du calcul conjonctif peut facilement tre exprime dans lalgbre
conjonctive : est simul par une restriction, et par la jointure. Pour la simulation de lalgbre
par les requtes conjonctives, on remarque dans un premier temps que cela est vident pour des
requtes de la forme :
() U ( (1 (|f1 (R1 )) 1 1 n (|fn (Rn ))))
o chaque i est une condition de slection, chaque fi un renommage, et chaque Ri une relation
de la base de donnes. (Voir lexemple plus loin.) Pour des requtes algbriques plus complexes,
on se ramne la forme () en utilisant des quivalences algbriques telles que :

F (F 0 (q))
X (Y (q))
F (X (q))
q1 1 q2
F (q1 1 q2 )
X (q1 1 q2 )

F 0 (F (q))
XY (q)
X (F (q))
si F porte sur des attributs de X
q2 1 q1
F (q1 ) 1 q2
si F porte sur des attributs de sort(q1 )
X (q1 ) 1 X (q2 ) si X sort(q1 ) sort(q2 )

2
Lexemple suivant illustre la traduction de requte algbrique en requte calcul.
Exemple 3.2.6: Considrons la requte algbrique suivante :
AC (A=C 0 (C=A0 (B=1 (R) 1 |ABC/A0 B 0 C 0 (R))))
30

CHAPITRE 3. LALGBRE RELATIONNELLE


o sort(R) = ABC. Une requte conjonctive quivalente est :
{x, z | y 0 (R(x, 1, z) R(z, y 0 , x)}
Lexemple suivant illustre une rcriture algbrique.
Exemple 3.2.7: Soit sort(R) = ABC et sort(S) = BCD. Alors nous avons :
AD (C=1 (R 1 S))

AD (C=1 (R) 1 S)

AD (ABD (C=1 (R) 1 S))

AD (AB (C=1 (R)) 1 BD (S))

3.3

Algbre relationnelle

Pour obtenir une algbre avec un pouvoir dexpression quivalent celui du calcul relationnel,
il suffit de rajouter lunion () et la diffrence (\), deux oprations qui ne peuvent tre appliques
que sur deux relations de mme sort.
Exemple 3.3.1: La requte (2.3.1) Salles o on peut voir Annie Hall ou Manhattan
est exprime par :
Salle (Titre=Annie Hall Sance Titre=Manhattan Sance).
Exemple 3.3.2: Division Cartsienne. Pour crire la requte (2.3.2) Nom des acteurs
ayant jou dans tous les films de Hitchcock , il faut russir crire le quantificateur universel
en utilisant la diffrence. Pour faciliter la lisibilit, nous dcomposons ce calcul en plusieurs
tapes. Tout dabord il faut calculer tous les films de Hitchcock (FHitch ). On note galement
A la projection sur lattribut Acteur. On construit ensuite grce au produit cartsien un
ensemble de toutes les combinaisons possibles dacteurs et de films de Hitchcock (X). Si
on calcule Y = X \ Film, on aura retir tous les acteurs ayant jou dans tous les films de
Hitchcock. Il nous restera comparer la projection sur Acteur de Y avec lensemble des
acteurs Y pour obtenir le rsultat attendu Z !
1. FHitch = Titre,Directeur (Directeur=Hitchcock00 (Film))
2. A = Acteur (Film)
3. X = FHitch A
4. Y = X \ Film
5. Z = A \ Y
Cette opration scrit galement de la manire suivante, en utilisant loprateur de division cartsienne, not : Acteur (Film Titre Directeur=Hitchcock00 (Film)).
Formellement, la division dune relation R1 par une relation R2 est une relation Q = R1 R2
de sort(Q)=sort(R1 ) \ sort(R2 ) telle que Q R2 R1 .
Exemple 3.3.3: La requte (2.3.3) Films dirigs par Hitchcock dans lesquels il na pas
jou est exprime par :
Titre Directeur=Hitchcock (Film) \ Titre Acteur=Hitchcock (Film).

3.4

Thorme dEquivalence de Codd

Nous concluons ce Chapitre avec un rsultat fondamental, lquivalence entre le calcul relationnel et lalgbre relationnelle. La preuve de ce Thorme est hors programme, nous la donnons
31

CHAPITRE 3. LALGBRE RELATIONNELLE


nanmoins pour le lecteur intress. Limpact de ce Thorme, comme nous lavons expliqu dans
le Chapitre 1 est quil permette lutilisateur de formuler ses requtes dans un langage descriptif et que le logiciel pourra les excuter, puisquil est capable de les transformer en une requte
algbrique et donc imprative.
Thorme 3.4.1. (Thorme dEquivalence) Le calcul avec la smantique de domaine actif
et lalgbre relationnelle ont des puissances dexpression quivalentes.
Nous dmontrons lquivalence de lalgbre et du calcul avec domaine actif.
Lemme 3.4.2. Chaque requte algbrique est exprimable dans le calcul avec domaine actif.
Dmonstration. Pour simplifier la prsentation, nous utilisons ici une algbre base sur les numros de colonnes au lieu des noms dattributs. Soit q une requte algbrique darit n. Nous
construisons q 0 = {x1 , . . . , xn | q } quivalente q par induction sur les sous-requtes de
q. (Une requte est construite en appliquant une opration une ou deux sous-requtes.) En
particulier, pour une sous-requte q 0 de q, on dfinit q0 par :
(a) si q 0 est R pour R R : q0 est R(x1 , . . . , xarite(R) ).
(b) si q 0 est {u1 , . . . , um } o chaque uj est un nuplet darit : q0 est
(x1 = u1 (1) x = u1 ()) . . . (x1 = um (1) x = um ()).

(c) si q 0 est F (q1 ) : q0 est q1 F , o F est la formule obtenue partir de F en rempla cant
chaque numro de colonne i par une nouvelle variable xi .
(d) si q 0 est i1 ,...,in (q1 ) : q0 est
yi1 . . . yin ((x1 = yi1 xn = yin ) yj1 . . . yjl q1 (y1 , . . . , yarite(q0 ) )),
o j1 , . . . , jl est une liste de [1, arite(q 0 )] {i1 , . . . , in }.
(e) si q 0 est q1 q2 : q0 est q1 q2 (xarite(q1 )+1 , . . . , xarite(q1 )+arite(q2 ) ).
(f) si q 0 est q1 q2 : q0 est q1 q2 .
(g) si q 0 est q1 q2 : q0 est q1 q2 .
Le lecteur pourra vrifier les dtails de cette construction.
Lemme 3.4.3. Pour chaque requte du calcul, il existe une requte algbrique quivalente.
Point Crucial : Soit q = {x1 , . . . , xn | } une requte du calcul. Il est facile de construire une
requte algbrique construisant le domaine actif :
qadom (I) = {hai | a adom(q, I)}
Ensuite, par induction, on associe chaque sous-formule une requte algbrique q telle que :
{y1 , . . . , ym | }(I) = q (I)
On illustre cette construction avec quelques cas. Supposons que est une sous formule de .
Alors q est construit de la manire suivante :
(a) (y1 , . . . , ym ) est R(t1 , . . . , tl ), o chaque ti est une constante ou appartient ~y . Alors
q ~k (F (R)), o ~k et F sont choisis en accord avec ~y et ~t.
(b) (y1 , y2 ) est y1 6= y2 : q est 16=2 (qadom qadom ).
(c) (y1 , y2 , y3 ) est 0 (y1 , y2 ) 00 (y2 , y3 ) : q est (q0 qadom ) (qadom q00 ).
(d) (y1 , . . . , ym ) est 0 (y1 , . . . , ym ) : q est (qadom qadom ) q0 .
2
32

4
4.0.1

SQL et Requtes Agrgat

Objectif du chapitre

Lalgbre relationnelle fait partie des fondements des bases de donnes relationnelles, utilis
en interne par le SGBD pour valuer les requtes. Le langage SQL quant lui est destin aux
utilisateurs du SGBD et, lheure actuelle, est le langage standard dinterrogation. Il marie dune
certaine faon lalgbre relationnelle et le calcul relationnel de n-uplets. SQL a t standardis
par lANSI en 1986 puis par lISO en 1989, 1992, 1999, 2003 et 2008. Ces standards successifs ont
tendu les capacits du langage. En plus de ces standards, SQL possde de nombreux dialectes
spcifiques chaque SGBD. En effet, le dveloppement des SGBD sest droul en parallle,
voire a prcd la standardisation de la norme SQL. En consquence, seul un sous-ensemble de
la norme est support par la grande majorit des SGBD (en particulier les SGBD open-source).
Ce sous-ensemble correspond en fait la norme SQL-92. Cest donc cette version de la norme
SQL que nous allons prsenter ici.
La norme SQL-92 se dcompose en plusieurs parties. Linterrogation des donnes se fait
par lopration de slection (SELECT), dont la smantique est donne par une expression du
calcul relationel et dont lexcution peut tre faite par une quivalence avec des oprateurs de
lalgbre relationnelle. Le langage de manipulation de donnes (Data Manipulation Language ou
DML) permet de modifier les donnes grce linsertion (INSERT), la mise jour (UPDATE)
et la suppression (DELETE) de n-uplets. Le langage de dfinition de donnes (Data Definition
Language ou DDL) se charge de la dfinition du schma dune BD. Enfin, SQL-92 inclut dautres
oprations comme la gestion des droits ou la gestion des transactions.
Lobjectif de ce chapitre est de donner au lecteur une connaissance de la syntaxe SQL, qui
lui permettra ensuite de tester la comprhension des bases de donnes en utilisant des SGBD
existants, tels que MySQL, Oracle, IBM DB2, Microsoft SQL Server, etc. Le langage SQL tant
standardis, les exemples donns ici fonctionneront sur nimporte quel SGBD respectant la norme
SQL-92 (cest--dire peu prs tous). Nous introduisons galement dans ce chapitre le calcul
dagrgats, qui nest pas trait dans le calcul relationnel simple et lalgbre relationnelle SPJR.

4.1

Le langage de dfinition de donnes

Le langage de dfinition de donnes permet la modification du schma dune base de donnes.


Il propose trois oprations : la cration (CREATE), la suppression (DROP) et la modification
(ALTER). Par exemple, la cration dune table a pour syntaxe :
CREATE TABLE htablei (hdfinitions de colonnesi [h contraintes de
tablei]).
Chaque dfinition de colonne comporte le nom de la colonne, son type et ventuellement une spcification de contraintes dintgrit. Il est galement possible de dfinir des contraintes dintgrit
sur la table. Les types de donnes supports sont les suivants :
33

CHAPITRE 4. SQL ET REQUTES AGRGAT


chanes de caractres de taille fixe, compltes droite par des espaces (CHAR(taille)),
chanes de taille variable (VARCHAR(taille)),
entiers sur 32 bits (INTEGER),
nombres en prcision fixe (nbChif f res chiffres dont nbDecimales aprs la virgule) (NUMERIC(nbChif f res,
nbDecimales)),
nombres en virgule flottante simple prcision (REAL),
nombres en virgule flottante double prcision (DOUBLE PRECISION), et
types date et/ou heure (DATE/TIME/TIMESTAMP).

Concernant les contraintes dintgrit, le principe de base est la cl dune table. La cl


primaire dune table est un ensemble dattributs (souvent un seul attribut). Une combinaison
de valeurs de ces attributs dtermine au plus un nuplet de la table. En dautres termes, deux
nuplets de la table ne peuvent avoir la mme projection sur ces attributs. Une table peut avoir
plusieurs cls. On dira dun cl dune table T quelle est une cl primaire si elle est utilse dans
dautres tables pour identifier des nuplets de T . (Les autres cls seront dites cls candidates.)
On appelle dans ce cas cl trangre un ensemble dattributs de lautre table faisant rfrence
la cl primaire de T . Si on se rfre lexemple initial de la Figure 2.1, on voit que la table
Coordonnes a comme cl primaire lattribut Salle. Cet attribut devient une cl trangre dans
la table Sance, rfrenant la table Coordonnes. Il faut noter que contrairement ce quon
pourrait penser, lattribut Titre nest pas une cl primaire de la table Film, puisque sa valuation
nest pas unique sur lensemble des nuplets de la table. Ainsi lattribut Titre de la table Sance
nest pas une cl trangre non plus. Notons quil serait possible de normaliser le schma, pour
obliger toutes les tables avoir une cl primaire. Cette opration est hors programme, mais nous
allons donner un exemple un peu plus bas de transformations de ces relations pour crer des
tables avec des cls primaires.
Ainsi, le langage DDL permet de spcifier quun ensemble dattributs est cl primaire (PRIMARY
KEY), quune squence dattributs est cl trangre (FOREIGN KEY/REFERENCES). Il permet
aussi de contraindre le domaine dun attribut (CHECK) ou quun ensemble dattributs ne contient
pas de valeur manquante (NOT NULL). Enfin, il permet, la manire de PRIMARY KEY, de
prciser quun ensemble dattributs ne contient pas de doublons (UNIQUE) ; la diffrence de
PRIMARY KEY, il est possible de spcifier plusieurs UNIQUE sur la mme table.
Par exemple, la requte DDL suivante cre la table Coordonnes.
CREATE TABLE coordonnees(
salle VARCHAR(30) PRIMARY KEY,
adresse VARCHAR(255) UNIQUE NOT NULL,
telephone VARCHAR(10)
);
Lattribut salle est la cl primaire donc annot par PRIMARY KEY. Les contraintes UNIQUE
et NOT NULL sur adresse prcisent que cet attribut est une cl candidate.
Le deuxime exemple permet de crer la table Film. Notons que nous allons sub-divisier la
table originale prsente dans la Figure 2.1 en trois tables Film, Acteur et Jouedans
CREATE TABLE film(
idfilm INTEGER(4) PRIMARY KEY,
titre VARCHAR(255) NOT NULL,
directeur VARCHAR(60) NOT NULL,
annee YEAR(4) CHECK(annee > 1900),
titre_vo VARCHAR(255),
CONSTRAINT film_unique_titre_directeur UNIQUE (titre, directeur)
);

34

CHAPITRE 4. SQL ET REQUTES AGRGAT


CREATE TABLE acteur(
idacteur INTEGER(4) PRIMARY KEY,
nom VARCHAR(255),
prenom VARCHAR(60),
CONSTRAINT acteur_unique_nom_prenom UNIQUE (nom, prenom)
);
CREATE TABLE jouedans(
idacteur INTEGER(4) REFERENCES acteur(idacteur),
idfilm INTEGER(4) REFERENCES film(idfilm),
PRIMARY KEY(idacteur, idfilm)
);
La contrainte rfrentielle prcise que les attributs idacteur et idfilm de la table Jouedans sont des cls trangres des attributs et tables indiques dans la clause REFERENCES. Les
contraintes NOT NULL sur les attributs titre et directeur indiquent que ces valeurs doivent
ncessairement tre renseignes. En revanche, le titre_vo peut rester vide (il aura la valeur
NULL). Notons que des attributs PRIMARY KEY sont galement NOT NULL, en revanche des
attributs UNIQUE peuvent contenir de multiples valeurs nulles, mais seulement une valeur non
nulle donne.
La contrainte de domaine sur annee limite aux valeurs suprieures 1900. La contrainte
de table PRIMARY KEY(equipe, no) sur la table Jouedans dfinit la cl primaire. Enfin, les contraintes de table nommes acteur_unique_nom_prenom et film_unique_titre_directeur prcisent dautres cls candidates.
Exercice : Ecrire la requte DDL pour crer la table Sance.
CREATE TABLE seance(
idfilm INTEGER(4) REFERENCES film(idfilm),
salle VARCHAR(30) REFERENCES coordonnees(salle),
horaire TIME,
PRIMARY KEY(idfilm, salle)
);

4.2

Le langage de manipulation de donnes

Maintenant que le schma de la BD a t dfini grce au langage DDL, il reste ajouter les
donnes proprement dites dans la BD. Cest le rle du langage DML.
Une insertion de n-uplets a la syntaxe suivante : INSERT INTO htablei [(hliste dattributsi)]
VALUES (hliste de valeursi) | hrequetei. On peut prciser la liste des attributs renseigner : les autres valeurs sont alors fixes la valeur par dfaut de lattribut ou NULL. La
clause VALUES ajoute un n-uplet la fois alors que lutilisation dune requte la place de
VALUES permet dinsrer plusieurs n-uplets en une seule opration (Bulk insert).
La requte suivante permet lajout du n-uplet hLe Champo, 51 rue des Ecoles, 0143545160i
dans la relation Coordonnes :
INSERT INTO coordonnees
VALUES(Le Champo, 51 rue des Ecoles, 0143545160);
La deuxime requte insre un n-uplet en ne prcisant que les attributs salle et adresse.
Ce n-uplet naura pas de valeur pour lattribut telephone (NULL). Notons que lordre des
attributs nest pas forcment celui de la dfinition dans la table.
35

CHAPITRE 4. SQL ET REQUTES AGRGAT


INSERT INTO coordonnees(adresse, salle)
VALUES(31 boulevard des Italiens, Gaumont Op\era);
La troisime requte insere un n-uplet dans la table Film :
INSERT INTO film(idfilm, titre, directeur, annee, titre_vo)
VALUES(1, Les Oiseaux, Hitchcock, 1963, The Birds);
Enfin, linsertion peut utiliser des requtes que nous considrerons dans la prochaine section.
Par exemple, la requte suivante insre dans la table Sance tous les films de Hitchcock au
cinma Le Champo.
INSERT INTO seance(salle, idfilm)
SELECT Le Champo, f.idfilm
FROM film f
WHERE directeur = Hitchcock
Linstruction UPDATE modifie les valeurs des n-uplets dune table : UPDATE htablei SET
hliste daffectationsi [WHERE hconditioni]. Lutilisation dune liste de valeurs permet de modifier la valeur de plusieurs attributs. La clause WHERE dfinit les n-uplets qui seront
mis jour.
La requte suivante modifie lhoraire du film 1 de la salle Le Champo.
UPDATE seance
SET horaire = 21:00
WHERE salle = Le Champo AND idfilm = 1;
Linstruction DELETE supprime des n-uplets dune table : DELETE FROM htablei [WHERE
hconditioni]. La clause WHERE prcise les n-uplets supprimer.
Par exemple, la requte suivante supprime le film 1 de la liste des films projets au Champo.

DELETE FROM seance


WHERE idfilm=1 and salle=Le Champo;
Sans clause WHERE, tous les n-uplets de la table sont supprims. Linstruction suivante effacerait tout le contenu de la table Sance.
DELETE FROM seance;

4.3
4.3.1

Linterrogation des donnes


La syntaxe SQL du SELECT, FROM, WHERE

Le dernier aspect du langage SQL que nous tudierons est linterrogation des donnes grce
linstruction SELECT :
SELECT hliste dexpressionsi
FROM hliste de tablesi
WHERE hconditionsi
GROUP BY hliste dattributsi
HAVING hconditionsi
ORDER BY hliste dattributsi
Les rles des trois prires lignes sont les suivants :
La clause SELECT spcifie le schma de sortie (projection).
La clause FROM prcise les tables impliques et leurs liens (produit cartsien et jointures).
36

CHAPITRE 4. SQL ET REQUTES AGRGAT


La clause WHERE fixe les conditions que doivent remplir les n-uplets rsultats (slection).
Les trois dernires clauses nous font sortir du calcul et de lalgbre relationnelle :
La clause GROUP BY comment regrouper des nuplets (agrgation) ?
La clause HAVING impose une condition sur les groupes (i.e. permet dliminer lintgralit
dun groupe, en se basant sur la valeur dun agrgat calcul sur ce groupe).
Enfin ORDER BY dfinit les critres de tris des rsultats.
La clause SELECT est suivie dune liste dexpressions. Chaque expression peut tre un attribut, un littral entre guillemet ou une expression calcule. Le caractre * est un joker signifiant
tous les attributs de la table . Il est noter que la clause SELECT ninterdit pas a priori les
doublons, i.e. plusieurs n-uplets gaux. Alors que le modle relationnel et lalgbre manipulent
des ensembles, en SQL, une table nest pas un ensemble de n-uplets mais un multi-ensemble. La
raison en est simple : liminer les doublons est coteux. Les requtes SELECT/FROM/WHERE
sont dfinies sur des multi-ensembles par dfaut. Pour se ramener un ensemble et donc liminer
les doublons, il faut alors utiliser DISTINCT dans la clause SELECT.

4.3.2

Traduction en calcul relationnel

La traduction en calcul relationnel est directe, et se fait de la manire automatique suivante.


Soit une requte SQL Q de la forme :
SELECT A1 , A2 , . . . , An
FROM R1 , R2 , . . . , Rm
WHERE CONDITION(A1 , . . . , An , An+1 , . . . , An+k )
Une expression de calcul relationnel correspondante se dduit directement par la relation suivante :
res = {A1 , A2 , . . . , An |An+1 , . . . , An+k , (CON DIT IONcalcul (A1 , . . . , An+k )}
o CON DIT IONcalcul lie les attributs aux tables correspondantes, ce qui de fait gnre les
jointure, ainsi que les conditions de restriction de la clause WHERE.
Notons pour tre prcis que la requte SQL a pour rsultat un multi-ensemble, contenant
peut-tre des doublons. Il faudrait utiliser DISTINCT pour les liminer.

4.3.3

Traduction en algbre relationnelle

La traduction en algbre relationnelle se fait de la manire suivante :


A1 ,...,An (CON DIT ION (R1 R2 . . . Rm )
Notons que nous considrons ici dans la clause FROM uniquement des tables et donc le produit
cartsien. Nous verrons plus tard quil est possible dindiquer directement dans cette clause FROM
des jointures, ce qui change lgrement la traduction.

4.3.4

Exemple de requtes

1. Nom et prnom des acteurs


SQL
Algbre
Calcul

SELECT nom, prenom


FROM acteur;
nom,prenom (Acteur)
res = {xnom , xprenom | xid , Acteur(xid , xnom , xprenom )}

2. Tous les attributs des acteur


37

CHAPITRE 4. SQL ET REQUTES AGRGAT


SQL
Algbre
Calcul

SELECT *
FROM acteur;
idacteur,nom,prenom,age (Acteur)
res = {xid , xnom , xprenom | Acteur(xid , xnom , xprenom )}

3. Noms des acteurs (sans doublons) pour SQL. Lalgbre et le calcul travaillent directement
sur des ensembles et non des multi-ensembles.
SQL

SELECT DISTINCT nom


FROM acteur;
La clause FROM accepte en paramtre une liste de tables. La requte porte alors sur le
produit cartsien de ces tables. Pour effectuer une jointure entre les tables, il convient dutiliser
les oprateurs de jointure du langage. Le mot-cl JOIN plac entre deux tables indique quil
faut en faire la jointure. La condition de jointure est prcise avec le mot-cl ON. Une jointure
naturelle sexprime avec le mot-cl NATURAL JOIN.
Lexemple suivant montre deux requtes de jointure.
1. Titre dun film avec la liste des identifiants de ses acteurs. Dans le cas de lalgbre, on
utilise la jointure naturelle, cest--dire que ce sont les attributs ayant le mme nom dans
les deux tables jointes qui sont choisis, et loprateur utilis est lgalit.
SQL
ou bien

Algbre
ce qui signifie

Calcul

SELECT f.titre AS titre, jd.idacteur AS id


FROM film f JOIN jouedans jd ON f.idfilm = jd.idfilm;
SELECT f.titre AS titre, jd.idacteur AS id
FROM film f jouedans jd
WHERE f.idfilm = jd.idfilm;
titre,idacteur (Film ./ Jouedans)
titre,idacteur (Film ./Film.idf ilm=Jouedans.idf ilm Jouedans)
res = {titre, idacteur | (idf ilm, directeur, annee),
Film(idf ilm, titre, directeur, annee)
Jouedans(idf ilm, idacteur)}

2. Les noms des salles projetant un film de Hitchcock.


SQL

SELECT f.titre AS titre, s.salle AS cinema


FROM film f, seance s
WHERE f.idfilm = s.idfilm
AND f.directeur = Hitchcock
AND s.horaire IS NOT NULL;
Algbre titre,salle ((directeur=Hitchcock00 Film) ./ Sance)
res = {titre, salle | (idf ilm, annee, horaire),
Film(idf ilm, titre, Hitchcock00 , annee)
Calcul
Sance(idf ilm, salle, horaire)}
On pourra sinterroger sur loptimalit de lexpression dalgbre relationnelle du 2e exemple.
Dans lexemple, des alias dattributs et de tables sont utiliss : la syntaxe AS cinema dans
la clause SELECT permet de renommer la colonne en sortie, la syntaxe film f dfinit f comme
alias de la table film.
La clause WHERE permet dexprimer la slection. SQL supporte des oprateurs de comparaison (<, <=, =, >=, >, <>), logiques (AND, OR), de test de valeur manquante (IS NULL,
IS NOT NULL), de recherche textuelle (LIKE), de slection dintervalle (BETWEEN), de liste
(IN), et dimbrication de blocs (IN, EXIST, NOT EXIST, ALL, SOME, ANY).
Les requtes suivantes illustrent ces notions.
1. Titre des films datant davant 2000
38

CHAPITRE 4. SQL ET REQUTES AGRGAT


SQL

SELECT titre FROM film


WHERE annee < 2000;
Algbre titre (annee<2000 (Film))
res = {titre | (idf ilm, directeur, annee),
Film(idf ilm, titre, directeur, annee)
Calcul
(annee < 2000)}
2. Titre et directeur des films produits entre 2003 et 2013 dont le titre commence par L
SQL
SELECT titre, directeur FROM film
WHERE annee BETWEEN 2003 AND 2013
AND titre LIKE L%;
Algbre r1 = annee>2013 annee<2000 titre LIKE 0 L%0 (Film)
titre,directeur (r1 )
res = {titre, directeur | (idf ilm, annee),
Film(idf ilm, titre, directeur, annee)
Calcul
(annee > 2000)
(annee < 2013)}

4.4

Requtes agrgats

Cette section discute de traitements dagrgation (e.g. calcul de moyenne) qui ne sont pas
couverts par lalgbre relationnelle classique et le calcul relationnel. Nous expliquons ici le principe sur SQL, et tendons lalgbre pour reprsenter ces concepts. Nous ne considrons donc
plus ici le calcul relationnel.
Les fonctions dagrgation, les clauses GROUP BY et HAVING permettent de rsumer
un ensemble de n-uplets. La clause GROUP BY prcise les attributs de groupement. Les fonctions dagrgation sont ensuite appliques sur chaque groupe. Enfin, la clause HAVING permet de spcifier des conditions sur les groupes. Il sagit donc ici dune condition globale un
groupe. Ces conditions peuvent tre la valeur min, max, moyenne, ou la somme dun attribut
a sur un groupe (MIN(a), MAX(a), AVG(a), SUM(a)), le nombre de lignes dun groupe
(COUNT(*)), ou le nombre de lignes dun groupe ayant une valeur distincte dun attribut a
particulier (COUNT(distinct a)).
Anne de production moyenne des films
SQL
SELECT AVG(annee)FROM film;
Algbre AV G(annee) (Film)
Nombre total de films dans lequel chaque acteur jou
SQL
SELECT idacteur AS id, COUNT(*)AS Nb_films
FROM film f NATURAL JOIN jouedans jd
GROUP BY idacteur
Algbre r1 = Film ./ Jouedans
idacteur COU N T () (r1 )
Anne de production la plus ancienne pour chaque acteur ayant jou dans au moins 3 films
de Hitchcock.
SQL
SELECT idacteur, MIN(annee)AS annee_debut
FROM film f NATURAL JOIN jouedans jd
WHERE f.directeur=Hitchcock GROUP BY idacteur
HAVING COUNT(*)> 2;
Algbre

r1 = directeur=Hitchcock00 Film ./ Jouedans


r2 = M IN (annee)annee_debut) (idacteur M IN (annee),COU N T () (r1 ))
annee_debut,idacteur COU N T ()>2 (r2 )
39

CHAPITRE 4. SQL ET REQUTES AGRGAT

4.5

Requtes ensemblistes

SQL permet galement de regrouper les rsultats de plusieurs requtes laide doprations
ensemblistes. La requte hrequete1i UNION hrequete2i retourne lunion des rsultats des deux
requtes. La requte hrequete1i INTERSECT hrequete2i retourne lintersection des rsultats des
deux requtes. La requte hrequete1i EXCEPT hrequete2i retourne la diffrence des rsultats
des deux requtes. Pour ces trois oprations, les schmas des requtes doivent tre compatibles
(mme nombre dattributs, mme types). Ces oprations seffectuent sur des ensembles, i.e. les
doublons sont limins. Le mot-cl ALL ajout aprs un oprateur ensembliste vite llimination
des doublons et permet donc de manipuler des multi-ensembles.

4.6

Tri

Une dernire clause ORDER BY permet de spcifier un tri des rsultats. Donc nous sommes
passs des ensensembles, aux multi-ensembles, pour atteindre les listes. On notera que les tables
stockes sont des ensembles et pas des multi-ensembles ou des listes.
La clause ORDER BY est suivie dune liste dattributs pour lesquels on prcise lordre de tri
(ASC pour croissant, DESC pour dcroissant). Cette clause, qui na pas dquivalent en algbre
relationnelle, ne doit apparatre quune seule fois dans une requte et obligatoirement la fin.
En effet, elle transforme un ensemble de n-uplets en liste de n-uplets pour reprsenter lordre. Il
nest donc pas possible dappliquer un autre oprateur sur le rsultat de cette clause.
Par exemple,
Nom et prnom des acteurs tris en ordre croissant selon le nom puis le prnom
SELECT nom, prenom FROM acteur
ORDER BY nom ASC, prenom ASC;

40

5
5.1

Exercices

Objectif du chapitre

Le programme officiel propose trois activits (ou exercices) que nous dtaillerons dans la
Section 5.2 :
utiliser une application de cration et de manipulation de donnes, offrant une interface
graphique, notamment pour crer une base de donnes simple, ne comportant pas plus de
trois tables ayant chacune un nombre limit de colonnes. Linstallation et lexploitation
dun serveur SQL ne fait pas partie des attendus.
lancer des requtes sur une base de donnes de taille plus importante, comportant plusieurs
tables, que les tudiants nauront pas eu construire, laide dune application offrant
une interface graphique
enchaner une requte sur une base de donnes et un traitement des rponses enregistres
dans un fichier.
On constate que le programme commence directement par des activits sur machine. De
notre point de vue, il peut tre prfrable de consacrer au moins une sance la rflexion,
sur papier, en particulier si on souhaite travailler sur les expressions du calcul et de lalgbre.
Pour le travail sur machine, il est important de noter que la plpupart des SGBDs disponibles
sur le march (mme ceux qui ne sont pas en open source) sont gratuits dans le cadre dune
utilisation non commerciale. Ainsi par exemple Oracle, qui est le SGBD le plus utilis, peut
tre tlcharg et utilis gratuitement, tout comme dautres logiciels concurrents tels Microsoft
SQL Server ou IBM DB2. Pour lutilisation qui en sera faite, et parce quils sont en gnral plus
simples installer, nous recommandons plutt lutilisation dun logiciel libre de type MySQL
ou PostgreSQL, installables par exemple avec le package EasyPHP 1 . Il faut noter que les deux
premires activits sont identiques : en effet, une requte ne dpend pas de la taille de la base
de donnes, ni de son contenu, mais uniquement de sa structure ! Le seul intrt de lancer des
requtes sur une petite base de donnes, est quil est possible de vrifier la main que les
rsultats sont corrects, ce qui est trs utile surtout pour dbuter. Concernant le schma de la
base de donnes, en ralit le nombre de tables ne rend pas plus difficile la rflexion, car on
se ramne toujours la mme procdure par le biais des jointures. Avec un schma compliqu,
il faudra simplement faire plus de jointures. Aussi, dans les exercices proposs ici, nous nous
restreignons un schma de trois tables.
Le programme officiel ne donne aucun exemple concrt dapplication : en effet, les bases de
donnes tant partout, nimporte quelle application peut convenir : salles de cinma, horaires
de trains, rencontres de championnat de foot, comptes bancaires, rsultats de manipulations
dexpriences, bibliothque, etc. . . Dans la Section ?? nous allons discuter de la conception des
schmas de bases de donnes et des requtes adaptes aux questions que peuvent rsoudre les
lves de CPGE, et nous donnerons quelques exemples corrigs.
1. http://www.easyphp.org/

41

CHAPITRE 5. EXERCICES
Enfin, en Section ?? nous proposerons quelques exercices faire sur papier, dans ce qui
pourrait tre une premire sance.

5.2

Activits du Programme Officiel

Il est possible de commencer soit (a) par la cration dun schma de BD, son remplissage
et son interrogation, ou bien (b) darriver sur une base de donnes dj cr et remplie et de
simplement linterroger. Nous suggrons de commencer avec les lves sur une base de donnes
dj cre et remplie, puisque comme la conception de schmas nest pas au programme, la seule
activit quon peut proposer est de recopier en quelque sorte un schma dj fait sur papier,
ce qui nest pas forcment trs accrocheur. Toutefois, pour cela, il faut disposer dun schma
dj fait et de donnes dj prpares. Nous mettons disposition cette adresse 2 le fichier
bd-banque-simple.sql qui correspond la BD nomme banque-simple que nous utiliserons
dans la suite.

5.2.1

Installation du SGBD MySQL, du serveur web Apache, de lapplication


PHPMyAdmin et de la BD banque-simple

Larchitecture mise en place est une architecture trois-tiers (trois niveaux) :


le premier niveau correspond au SGBD MySQL qui contiendra les donnes et excutera
les requtes
le deuxime niveau correspond au serveur Web Apache, qui excute lapplication web
PHPMyAdmin (un ensemble de pages Web et de programmes crits en langage PHP)
le troisime niveau correspond au navigateur Web de lutilisateur qui interagit avec le
premier niveau via lapplication PHPMyAdmin.

En effet, le navigateur Web de lutilisateur ne se connecte jamais directement la base de


donnes, il doit passer par le serveur Web pour poser des requtes. Le serveur Web peut servir
autre chose, comme par exemple grer un site Web, nous le verrons dans la Section ??.
Nous prenons comme exemple linstallation de la suite EasyPHP sur windows, qui contient
la fois MySQL, Apache, et PHPMyAdmin. Linstallation a t faite en janvier 2014 avec la
version 13.1 de EasyPHP DevServer, sur Windows. Rendez-vous ladresse : http://www.
easyphp.org/ et tlchargez la version 13.1 VC 11 si vous avez Windows 7 ou 8 et VC 9 si
vous avez une version prcdente. Nous esprons que les utilisateurs de Linux sauront installer
correctement un package similaire (par exemple le package LAMP 3 ). Excutez ensuite le fichier
tlcharg (dans cette version : EasyPHP-DevServer-13.1VC9-setup.exe). Linstalleur
demande le choix dune langue, vous pouvez choisir Franais, puis quelques clics plus loin vous
demande un rpertoire dinstallation. Vous pouvez le placer o vous voulez, mais notez bien
o se trouve ce rpertoire dinstallation 4 , vous en aurez besoin par la suite pour linstallation
de PHPMyadmin, ou encore si vous voulez crer un site Web ! Au bout de quelques minutes,
votre installation est termine. Vous pouvez ensuite lancer EasyPHP, qui une fois en route, se
prsent sous la forme dune lettre e noire dans la barre des tches. Un clic droit sur cette
icne ouvre un menu contextuel et un clique gauche ouvre une fentre permettant de voir ltat
des serveurs (serveur MySQL et serveur Apache), de les relancer, de modifier leur configuration,
etc. . . Effectuons un clic droit sur licne, puis choississons Web Local. Notre navigateur est
lanc, et nous arrivons sur la page Web indique dans la Figure 5.1. Cette page correspond au
contenu du rpertoire publi par le serveur Web Apache, qui se trouve dans le sous rpertoire
2. http://cassioppee.prism.uvsq.fr/cpge/bd-banque-simple.sql
3. http ://en.wikipedia.org/wiki/LAMP_%28software_bundle%29
4. Dans notre exemple, nous supposerons que ce rpertoire est D:/EasyPHP/

42

CHAPITRE 5. EXERCICES

Figure 5.1 Page de prsentation du serveur web local

data/localweb/ du rpertoire dinstallation 5 . Notez que lURL pour accder au serveur local
est le http://127.0.0.1 galement accessible via lURL http://localhost .
Il faut encore installer linterface PHPMyAdmin, ce qui se fait trs simplement : il faut copier
le rpertoire nomm phpmyadminXXXXXXX qui se trouve dans le sous-rpertoire modules du
rpertoire dinstallation dEasyPHP vers le sous-rpertoire data/localweb/ (voir Figure 5.2).
Une fois le rpertoire copi, rechargez la page 127.0.0.1, vous devriez voir apparaitre de
nouveau rpertoire sur la page web (Figure 5.3) . Cliquez dessus, vous arrivez sur la page de
prsentation du logiciel PHPMyAdmin (Figure 5.4). Notez que nous nous sommes connect
la base sans entrer le moindre mot de passe, ni didentifiant utilisateur. Dans la configuration
installe de base (qui peut tre change), lutilisateur est root (il possde tous les droits) et
na pas de mot de passe ! Sur la gauche de lcran, dans la zone cercle sur la figure, on peut
voir quatre lignes, qui correspondent chacune une base de donnes. Si on clique sur lun de
ces noms, on pourra accder au contenu de ces bases de donnes. Comme il sagit de bases de
donnes systme et de la base de donnes de PHPMyAdmin, il ne faut pas les modifier.
partir ce cette page, nous pourrions crer une base de donnes, en crant des tables
la main. De manire plus simple, nous allons en importer une dj existante, en utilisant
le fichier bd-banque-simple.sql tlchargeable via http://cassioppee.prism.uvsq.
fr/cpge/bd-banque-simple.sql en notant bien o il est tlcharg sur votre ordinateur.
Tout dabord, nous effectuons une manipulation spcifique de MySQL, qui consiste en la cration
dun espace portant un nom spcifique (nous allons choisir le nom banque) afin dy stocker les
tables. Notons que lutilit de cet espace (appel base de donnes par les dveloppeurs de
MySQL) est de permettre une gestion des droits des utilisateurs sur les tables quil contient.
Nous indiquons dans la table 5.5 la marche suivre pour crer une base de donnes.
Une fois la base de donnes cre, elle apparait dans la liste des bases de donnes prsentes
sur le serveur, dans le menu sur la gauche de la fentre. Il faut donc cliquer sur son nom dans la
fentre de gauche pour la slectionner, avant dexcuter la liste des instructions prsentes dans
le fichier bd-banque-simple.sql, comme indiqu dans la Figure 5.6.
Exemple 5.2.1: Le fichier bd-banque-simple.sql contient les instructions suivantes qui
permettent de crer le schma de la base de donnes, ainsi que les deux cls trangres liant la
table compte client par le biais de la contrainte nomme compte_ibfk_1 et qui impose
5. Soit D:/EasyPHP/data/localweb dans notre exemple.

43

CHAPITRE 5. EXERCICES

Figure 5.2 Copie du rpertoire PHPMyAdmin

Figure 5.3 Page de prsentation une fois PHPMyAdmin install

44

CHAPITRE 5. EXERCICES

Figure 5.4 Premire page de PHPMyAdmin

Figure 5.5 Cration dune Base de Donnes

45

CHAPITRE 5. EXERCICES
que compte.idproprietaire = client.idclient et la table operation compte
par le biais de la contrainte nomme operation_ibfk_1 et qui impose que les valeurs prises
par operation.idcompte soient les mmes que les valeurs de compte.idcompte.
DROP TABLE IF EXISTS operation;
DROP TABLE IF EXISTS compte;
DROP TABLE IF EXISTS client;
CREATE TABLE IF NOT EXISTS client (
idclient int(5) NOT NULL,
nom varchar(128) NOT NULL,
prenom varchar(128) NOT NULL,
ville varchar(128) NOT NULL,
PRIMARY KEY (idclient)
);

CREATE TABLE IF NOT EXISTS compte (


idcompte int(5) NOT NULL,
idproprietaire int(5) NOT NULL,
type varchar(128) NOT NULL,
PRIMARY KEY (idcompte),
KEY idproprietaire (idproprietaire)
);

CREATE TABLE IF NOT EXISTS operation (


idop int(5) NOT NULL,
idcompte int(5) NOT NULL,
montant decimal(10,2) NOT NULL,
informations text NOT NULL,
PRIMARY KEY (idop),
KEY idcompte (idcompte)
);

ALTER TABLE compte


ADD CONSTRAINT compte_ibfk_1 FOREIGN KEY (idproprietaire)
REFERENCES client (idclient) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE operation
ADD CONSTRAINT operation_ibfk_1 FOREIGN KEY (idcompte)
REFERENCES compte (idcompte) ON DELETE CASCADE ON UPDATE CASCADE;

La table client contient des informations de base sur les clients de la banque. La
table compte indique qui est le propritaire de chaque compte dans la banque. La table
operation contient toutes les oprations sur les comptes de la banque. Les contraintes
de cl trangres imposent que lidentifiant du client possdant un compte donn doit dj
appartenir la banque, et que les oprations doivent se faire sur un compte dj existant
galement. En effet, si on tente par exemple de crer directement un compte sans avoir
pralablement cr son propritaire, lopration sera refuse par le SGBD.
46

CHAPITRE 5. EXERCICES

Figure 5.6 Chargement dun schma et des donnes dune BD

Il faut ensuite remplir la base avec des donnes. Ceci peut tre fait manuellement, ou bien
en utilisant un fichier avec les donnes. Dans ce premier TP, nous allons utiliser des donnes
dj constitues et disponibles lURL : http://cassioppee.prism.uvsq.fr/cpge/
bd-banque-simple-data.sql sous le format dinstructions SQL de type INSERT INTO
.... Il est galement trs simple dinsrer des donnes dans la base, en utilisant linterface ou en
crivant les requtes SQL correspondantes. Lopration de chargement se fait par le mme menu
Importer que prcdemment. Il faut simplement choisir le fichier bd-banque-simple-data.sql
la place.

5.2.2

De la prsentation des exercices

Une fois le schma de la base de donnes cr et quelle a t peuple par des donnes, nous
sommes prts commencer les exercices ! Remplir la base de donnes prend du temps, si cest
fait la main, ce qui peut tre le cas pour les premiers exercices, puisque cest intressant de
permettre aux lves de voir les donnes pour se convaincre que le rsultat de leur requte est
correct. Toutefois, une fois ces premiers exemples passs, nous suggrons dutiliser une base de
donnes suffisamment grosse, dune part pour plus de ralisme, et dautre part puisque sur des
jeux de donnes trs petits il est parfois possible dobtenir la bonne rponse avec une requte
fausse. Il est possible de fournir le resultat de la requte llve, ce qui lui permet de contrler
que sa requte est correcte. Sur une base de donnes avec des milliers de lignes il y a de fortes
chances que si les rsultats sont les mmes, la requte soit bonne.
47

CHAPITRE 5. EXERCICES
Notons quil est possible dutiliser des logiciels pour gnrer automatiquement des donnes,
tels que http://www.generatedata.com/ (logiciel sous licence GNU) quil faudra ensuite
charger dans la base de donnes, en utilisant la fonction dimportation. Ces logiciels peuvent gnrer des donnes dans plusieurs formats (SQL, CSV, XML. . . ) en gnral tous ces formats sont
accepts par limport de MySQL. Nous fournissons, titre dexemple, les fichiers suivants gnrs automatiquement avec ce logiciel. Dans les exercices, nous utiliserons les donnes gnres
automatiquement pour tester les rsultats de nos requtes.
http://cassioppee.prism.uvsq.fr/cpge/bd-banque-simple-random-data-client.
sql
http://cassioppee.prism.uvsq.fr/cpge/bd-banque-simple-random-data-compte.
sql
http://cassioppee.prism.uvsq.fr/cpge/bd-banque-simple-random-data-operation.
sql

5.2.3

Mthodologie pour rpondre une question

Nous proposons une mthodologie simple pour rpondre une requte basique exprime en
franais. Il peut tre ncessaire dappliquer plusieurs fois cette mthodologie sur des parties de la
requte, puis de les recombiner ensuite laide doprateurs ensemblistes. E.g. la requte Trouver les noms de personnes ne possdant pas de livret A peut se dcomposer en deux requtes
basiques R1 = Trouver les noms de toutes les personnes et R2 = Trouver les noms de toutes
les personnes possdant un livret A combines par loprateur diffrence ensembliste 6 .
Notons que cette requte pourrait galement scrire directement, mais dans ce cas, la clause
WHERE serait plus complique, puisquelle devrait exprimer le fait quune personne donne ne
possde aucun Livret A, ce qui se fera galement avec une sous requte.
Cette mthodologie se propose de remplir une requte de type SELECT ...FROM ...WHERE...
de la manire suivante.
1. Construction de la clause SELECT
(a) Identifier les attributs qui doivent tre affichs, et les tables les contenant.
(b) Mettre ces tables dans la clause FROM et donner un nom de vari able chaque table.
(c) Mettre les attributs affichs, prfixs par le nom de variable de la table correspondante dans la clause SELECT

(d) Identifier les fonctions calculer, et les attributs ncessaires au calcul de ces fonctions,
puis si ncessaire, ajouter des tables supplmentaires dans la clause FROM, et enfin
ajouter la fonction dans la clause SELECT
2. Construction des Groupes
(a) Identifier les attributs utiliss pour le partitionnement et les mettre dans la clause
GROUP BY.
(b) Complter si ncessaire les tables de la clause FROM.
(c) Complter la clause SELECT en rajoutant les attributs utiliss pour le partitionnement. En gnral, ces attributs auront dj t identifis car ils vont a priori apparaitre dans le rsultat final, puisquils sagissent de critres de regroupement. En effet,
est ce quune requte qui calculerait le revenu moyen en fonction de la ville et qui
nafficherait pas le nom de la ville de chaque groupe aurait une quelconque utilit ?
3. Construction des restrictions
(a) Regarder sur quels attributs (ou groupes dattributs) de quelles tables portent les
restrictions.
6. Malheureusement, cet oprateur nest pas implment dans MySQL !

48

CHAPITRE 5. EXERCICES
(b) Rajouter ces tables, si elles ne sont pas encore prsentes, dans la clause FROM.
(c) Rajouter les restrictions sur les attributs en question dans la clause WHERE. Attention,
il est capital de noter quune condition de restriction peut tout fait sexprimer en
utilisant une sous-requte. E.g. Voir exemple idproprietaire sans livret A
(d) Rajouter les restrictions qui portent sur des valeurs agrges dans la clause HAVING.
4. Construction des jointures
(a) Rajouter dans la clause WHERE les conditions de jointure, permettant de lier toutes
les tables de la clause FROM les unes aux autres. Une telle jointure se fait en utilisant
les cls trangres des tables en question. Il peut arriver quil ne soit pas possible de
lier une table aux autres. Cela signifie quil faudra introduire une ou plusieurs autres
tables intermdiaires permettant de lier cette table par le biais dun chemin compos
de cls trangres. En gnral, une cl trangre est mono-value, donc si on a n
tables dans la clause FROM il faudra avoir n 1 conditions de jointure dans la clause
WHERE.
5. Construction des sous-requtes
(a) Pour chaque sous requte utilise dans la clause WHERE, vrifier quelle a besoin
ou non dtre paramtre. Une sous requte non paramtre signifie que sa valeur ne
dpend pas du moment o elle est calcule e.g. une sous requte peut tre utilise pour
calculer le salaire moyen. Une sous requte paramtre signifie que sa valeur dpend
de la ligne qui est en train dtre traite e.g. le fait quun idproprietaire donn possde
un compte de type Livret A est une sous requte paramtre. Dans le cas dune sous
requte paramtre, celle-ci devra avoir une condition de paramtrisation dans la
clause WHERE. Cette condition de paramtrisation fera intervenir un identifiant de
table de la requte extrieure. (Voir exemples plus bas).

5.2.4

Requtes sur une base de donnes existante

Aprs avoir install le serveur de base de donnes, chaque lve peut linterroger via le web.
Attention, nous navons pas configur les droits daccs , ce qui signifie que si vous donnez le
login et mot de passe qui a t utilis pour crer la base, un lve pourrait tout effacer !
Linterrogation se fait en ouvrant la fentre de requte (voir Figure 5.7) et en tapant le
code de la requte dans cette fentre. Les rsultats apparaissent dans la fentre principale du
navigateur.

Questions sans jointure


Pour tous les exercices, on peut demander lcriture avec le calcul, lalgbre ou SQL. Notons
que pour les requtes avec des agrgats, on ne peut demander que lcriture algbrique ou SQL.
Dans nos corrections, nous donnons la version SQL, qui correspond ce qui est demand dans
le programme. Notons quil est possible de complexifier les questions loisir en rajoutant des
tables et des conditions de restriction varies. Pour plus de clart dans la difficult de chaque
exercice, nous nous restreignons un schma avec seulement trois tables.

Exercices sans jointure.


Exercice 1
Donnez les nom et prenom de tous les clients de la base.
indication : Ceci est une petite indication

49

CHAPITRE 5. EXERCICES

Figure 5.7 Ouverture de la fentre de requtes

Exercice 2
Donnez les nom et prenom de tous les clients de la base habitant Paris.
Exercice 3
Donnez les identifiants de tous les comptes de type Livret A

Exercice 4
Donnez les idop de type dbit sur le compte didcompte 1
Exercice 5
Donnez les idproprietaire des personnes possdant un Livret A
Exercice 6
Donnez les idproprietaire des personnes ne possdant aucun Livret A.

Exercices utilisant des fonctions


Exercice 7
Donnez le solde (= somme de toutes les oprations effectues) de chaque compte
Exercice 8
Donnez le solde de chaque compte, uniquement pour les comptes dbiteurs.
50

CHAPITRE 5. EXERCICES

Exercice 9
Donnez le solde des comptes didentifiant compris entre 1 et 10 qui sont dbiteurs.
Exercice 10
Calculez le nombre moyen de comptes possd par un client.
Exercice 11
Affichez pour chaque opration son montant en dollars, en supposant que le taux de conversion soit une constante valant 1.3. Nommez cette colonne montantUSD

Exercices mettant en jeu une ou plusieurs jointures.


Exercice 12
Donnez, pour chaque personne dfinie par son couple nom, prenom, la liste de ses comptes
(identifis par leur idcompte).
indication : On voit ici quon a besoin dafficher des informations prsentes dans deux
tables : client et compte. Il faut identifier galement lattribut qui va permettre de faire le
lien (jointure) entre une ligne de la premire table et une ligne de la deuxime.
Exercice 13
Donnez la liste des idcompte qui ont pour propritaire une personne sont le prnom est
Marie.
indication : Ici, bien quon nait pas besoin dafficher des informations de la table client,
on souhaite faire un test sur ces donnes :il faudra donc intgrer cette table la requte,
puisquon en a besoin dans la clause WHERE.
Exercice 14
Donnez la liste des oprations (montant et informations) sur chaque compte de Sylvie
Moulin.
indication : Les informations recherches se trouvent dans la table operation, et les
valeurs tester dans la tableclient. Il faut de plus russir relier ces informations. Ce
nest possible quen utilisant la table compte.
Exercice 15
Donnez le nom et prnom des clients ayant fait au moins une opration de dbit sur lun
de leurs comptes.
indication : Les informations recherches se trouvent dans la table operation, et les
valeurs tester dans la tableclient. Il faut de plus russir relier ces informations. Ce
nest possible quen utilisant la table compte.
Exercice 16
Donnez pour chaque client identifi par son nom et prenom le nombre de comptes quil
possde.
indication : Il sagit ici de compte le nomdre didcompte distinct associ chaque client.
Exercice 17
Donnez pour chaque type de compte la somme totale disponible. Que faire si un type nest
associ aucune opration ?
51

CHAPITRE 5. EXERCICES

Exercices mettant en jeu une auto-jointure


Exercice 18
Donnez pour chaque idcompte la valeur maximale de dpt et de dbit. Sil ny a aucune
valeur de dpt ou de dbit, alors le champ devra tre NULL.

Exercices mettant en jeu une table ou requte imbrique pour un calcul annexe
Exercice 19
Donnez lidproprietaire possdant le compte avec le plus grand numro didcompte.
indication : Il faut que la requte fonctionne quel que soit le contenu de la base ! Il ne sagit
donc pas de regarder manuellement la plus grande valeur (e.g. 9) et de la mettre en dur
dans la requte.
Exercice 20
Donnez les idproprietaire des personnes possdant moins de comptes que la moyenne
calcule sur lensemble de la base de donnes.
indication : Comme la valeur quon veut tester (le nombre de comptes) est un agrgat, il
faudra utiliser la clause HAVING.

5.3

Corrigs des exercices

Corrig de lexercice 1 :
SELECT c.nom, c.prenom
FROM client c
Corrig de lexercice 2 :
SELECT nom, prenom
FROM client
WHERE ville = Paris

Corrig de lexercice 3 :
SELECT idcompte
FROM compte
WHERE type = Livret A
Corrig de lexercice 4 :
SELECT idop
FROM operation
WHERE montant < 0
AND idcompte = 1
Corrig de lexercice 5 :
SELECT idproprietaire
FROM compte c1
WHERE c1.type = LivretA
Corrig de lexercice 6 : Solution 1 : en utilisant ALL
52

CHAPITRE 5. EXERCICES
SELECT idproprietaire
FROM compte c1
WHERE Livret A <> ALL (
SELECT type
FROM compte c2
WHERE c1.idproprietaire =c2.idproprietaire
)
Il faut comprendre que la sous requte est excute est excut pour chaque ligne de la
table compte, et qu chaque fois, la sous requte va prendre une valeur diffrente pour
c1.idproprietaire, qui est la valeur de la ligne courante ! Cest une sous requte paramtre.
Solution 2 : avec une diffrence. On construit lensemble de tous les idproprietaires, puis lensemble des idproprietaires ayant un Livret A et on soustrait.
SELECT idproprietaire
FROM compte
EXCEPT
SELECT idproprietaire
FROM compte
WHERE type = Livret A
Solution 3 : en utilisant NOT IN (ce qui est une autre manire dcrire la solution 2, cette fois
accepte par MySQL). Notons que cette sous requte a toujours la mme valeur, quel que soit
le moment o elle est calcule : cest une sous requte non-paramtre.
SELECT idproprietaire
FROM compte c1
WHERE c1.idproprietaire NOT IN (
SELECT idproprietaire
FROM compte c2
WHERE c2.type = LivretA
)
Corrig de lexercice 7 :
SELECT idcompte, SUM(montant)
FROM operation
GROUP BY idcompte
Corrig de lexercice 8 : Il est important de noter que le fait quun compte soit dbiteur est
une condition sur un agrgat de lignes, et scrit donc laide de la clause HAVING. La clause
WHERE ne peut svaluer que sur une seule ligne.
SELECT idcompte, SUM(montant)
FROM operation
GROUP BY idcompte
HAVING SUM(montant) < 0
Corrig de lexercice 9 : Solution 1 : en numrant les valeurs possibles.
SELECT idcompte, SUM(montant)
FROM operation
WHERE idcompte IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
GROUP BY idcompte
HAVING SUM(montant) < 0
Solution 2 : avec des ingalits.
53

CHAPITRE 5. EXERCICES
SELECT idcompte, SUM(montant)
FROM operation
WHERE idcompte >= 1
AND idcompte <= 10
GROUP BY idcompte
HAVING SUM(montant) < 0
Corrig de lexercice 10 :
SELECT COUNT(DISTINCT co1.idcompte) / COUNT(DISTINCT co1.
idproprietaire)
FROM compte co1
Corrig de lexercice 11 :
SELECT op.idop, op.montant1.3 as montantUSDFROM operation op
Corrig de lexercice 12 :
SELECT cl.nom, cl.prenom, co.idcompte
FROM client cl, compte co
WHERE cl.idclient = co.idproprietaire
Corrig de lexercice 13 :
SELECT co.idcompte
FROM client cl, compte co
WHERE cl.idclient = co.idproprietaire
AND cl.prenom = Marie
Corrig de lexercice 14 :
SELECT op.idcompte, op.montant, op.informations
FROM client cl, compte co, operation op
WHERE cl.idclient = co.idproprietaire
AND co.idcompte = op.idcompte
AND cl.prenom = Sylvie
AND cl.nom = Moulin

Corrig de lexercice 15 :
SELECT DISTINCT cl.nom, cl.prenom
FROM client cl, compte co, operation op
WHERE cl.idclient = co.idproprietaire
AND co.idcompte = op.idcompte
AND op.montant < 0
Corrig de lexercice 16 :
SELECT cl.nom, cl.prenom, COUNT(DISTINCT idcompte)
FROM client cl, compte co
WHERE cl.idclient = co.idproprietaire
GROUP BY cl.nom, cl.prenom
Corrig de lexercice 17 : Solution 1 :
SELECT co.type, SUM(op.montant)
FROM compte co, operation op
WHERE co.idcompte = op.idcompte
GROUP BY co.type
54

CHAPITRE 5. EXERCICES
Cette solution prsente un problme : si un type de compte na aucune opration dessus, il
napparaitra pas. Par exemple le type Plan Epargne Actions est filtr par la jointure. Il faut
donc utiliser une jointure externe (gauche) pour conserver tous les types de comptes. Toutefois
la valeur apparaissant sera NULL. Solution 2 :
SELECT co.type, SUM(op.montant)
FROM compte co LEFT OUTER JOIN operation op on co.idcompte = op.
idcompte
GROUP BY co.type
Solution 3 : construire une solution en faisant lunion de la solution 1, et dune autre table quon
aura construite la main qui contiendra les types de comptes napparaissant pas, et la constante
0.
SELECT co.type, SUM(op.montant)
FROM compte co, operation op
WHERE co.idcompte = op.idcompte
GROUP BY co.type
UNION
SELECT co.type, 0
FROM compte co
WHERE co.type NOT IN (
\> SELECT co1.type
\> FROM compte co1, operation op
\> WHERE co1.idcompte = op.idcompte)
Corrig de lexercice 18 : Ide 1 : Problme : on prend le min et le max algbriques, donc
on ne teste pas pour savoir si la valeur est nulle ou pas.
SELECT op1.idcompte , MAX(op1.montant), MIN(op2.montant)
FROM operation op1, operation op2
WHERE op1.idop = op2.idop
GROUP BY op1.idcompte
Solution 2 : On va faire deux requtes, lune qui calcule le MIN sur les valeurs ngatives, et
lautre qui calcule le max sur les valeurs positives, puis faire la jointure !
SELECT T1.id, T1.maxi, T2.mini
FROM
(SELECT op1.idcompte as id, MAX(op1.montant) as maxi
FROM operation op1
WHERE op1.montant >0
GROUP BY op1.idcompte) AS T1 FULL OUTER JOIN
(SELECT op2.idcompte as id, MIN(op2.montant) as mini
FROM operation op2
WHERE op2.montant <0
GROUP BY op2.idcompte) AS T2 on T1.id = T2.id
Seul petit soucis ... le FULL OUTER JOIN nest pas support par MySQL, en tous cas dans
sa version actuelle ! (Cest une lacune). Comme LEFT OUTER JOIN et RIGHT OUTER JOIN
sont supports, on peut nanmoins proposer une solution, qui est la suivante : Solution 3 : Une
manire de rcrire le FULL OUTER JOIN est de faire lUNION (ensembliste) du LEFT OUTER
JOIN et du RIGHT OUTER JOIN (NB lunion multi-ensembliste est loprateur UNION ALL),
en prenant bien garder daller chercher idcompte dans la bonne table (celle du ct de la jointure
externe.)
55

CHAPITRE 5. EXERCICES
SELECT T1.id, T1.maxi, T2.mini
FROM
(SELECT op1.idcompte as id, MAX(op1.montant) as
FROM operation op1
WHERE op1.montant >0
GROUP BY op1.idcompte) AS T1 LEFT OUTER JOIN
(SELECT op2.idcompte as id, MIN(op2.montant) as
FROM operation op2
WHERE op2.montant <0
GROUP BY op2.idcompte) AS T2 on T1.id = T2.id
UNION
SELECT T2.id, T1.maxi, T2.mini
FROM
(SELECT op1.idcompte as id, MAX(op1.montant) as
FROM operation op1
WHERE op1.montant >0
GROUP BY op1.idcompte) AS T1 RIGHT OUTER JOIN
(SELECT op2.idcompte as id, MIN(op2.montant) as
FROM operation op2
WHERE op2.montant <0
GROUP BY op2.idcompte) AS T2 on T1.id = T2.id

maxi

mini

maxi

mini

Corrig de lexercice 19 :
SELECT idproprietaire
FROM compte co
WHERE co.idcompte = (
\> SELECT MAX(co1.idcompte)
\> FROM compte co1)
Corrig de lexercice 20 :

SELECT idproprietaire
FROM compte co
GROUP BY idproprietaire
HAVING COUNT(DISTINCT idcompte) < (
\> SELECT COUNT(DISTINCT co1.idcompte) / COUNT(DISTINCT co1.
idproprietaire)
\> FROM compte co1)

5.4

Exercices hors programme

56

Bibliographie
[ABB+ 11] J.-P. Archambault, E. Baccelli, S. Boldo, D. Bouhineau, P. Cgielski, T. Clausen,
I. Guessarian, S. Lops, L. Mounier, B. Nguyen, F. Quessette, A. Rasse, B. Rozoy,
C. Timsit, T. Viville, and J.-M. Vincent. Introduction la science informatique
pour les enseignants de la discipline au lyce. CRDP Paris, 2011.
[AHV95]

S. Abiteboul, R. Hull, and V. Vianu. Foundations of databases. Addison-Wesley,


1995. http ://www.webdam.inria.fr/Alice.

[Che76]

Peter P.-S. Chen. The Entity-Relationship Model, Toward a Unified View of Data.
ACM Transactions on Database Systems (TODS), 1(1), 1976.

[Cod70]

E.F. Codd. A relational model of Data For Large Shared Data Banks. Communications of the ACM (CACM), 13(6), 1970.

57

Vous aimerez peut-être aussi