Académique Documents
Professionnel Documents
Culture Documents
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
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
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
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
1.2
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
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
Film
Salle
Salle
Film
Film
Salle
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
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
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
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.
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
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}.
17
18
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
47 42 60 33
43 26 48 18
43 54 51 60
Georges V
Les 7 Parnassiens
Sance
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
19
20 :45
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.3.2
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
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
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
2.4.1
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 :
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
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
25
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
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
AD (C=1 (R) 1 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
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
(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
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
34
4.2
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
4.3
4.3.1
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
4.3.2
4.3.3
4.3.4
Exemple de requtes
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
Algbre
ce qui signifie
Calcul
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
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
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
42
CHAPITRE 5. EXERCICES
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
44
CHAPITRE 5. EXERCICES
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)
);
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
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
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
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
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.
49
CHAPITRE 5. EXERCICES
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.
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
CHAPITRE 5. EXERCICES
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
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
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]
[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