Bases de données relationnelles
Bases de données relationnelles
Chapitre 12
Bases de donnes
relationnelles
Introduction
Au sens premier du terme, linformatique est la science du traitement automatique de linformation ; ce titre,
la structuration des donnes en est un lment essentiel. Jusqu prsent, nous avons essentiellement manipul
des tableaux, qui supposent lexistence dun ordre permettant le classement de linformation. Mais un tel
classement prsente des limites : plusieurs critres peuvent tre galement pertinents, et ranger ces donnes
dans un tableau exige den privilgier certains au dtriments dautres.
Notons que le problme de lordonnancement de linformation nest pas nouveau et prcde la naissance de
linformatique de plusieurs sicles : encore aujourdhui les bibliothques publiques utilisent un systme de
classification invent au xixe sicle : la classification dcimale de Dewey. Les documents sont rpartis en 10
classes, chaque classe est divise en 10 divisions, chaque division en 10 subdivisions, et ainsi de suite. Cette
classification permet depuis bientt 150 ans de ranger nos bibliothques, mais nen prsente pas moins de
nombreux dfauts : linformation est hirarchise suivant des critres qui taient pertinents au moment de
llaboration de ce systme mais qui ne le sont plus forcment aujourdhui mais surtout, si elle facilite le
travail du classificateur, elle ne contribue pas faciliter la tche du chercheur, moins que ce dernier ne sache
trs prcisment quelle discipline rattacher lobjet de sa recherche. A contrario, les logiciels de gestion des
livres numriques grent sans peine des milliers de rfrences en autorisant des recherches multi-critres
(et multi-bibliothques) sans quil soit ncessaire pour lutilisateur de connatre la structuration interne des
donnes.
Ces outils informatiques utilisent tous des bases de donnes relationnelles (BDR) qui offrent un moyen dorganiser
efficacement les donnes et de les manipuler grce des requtes. Schmatiquement, une base de donnes est
un ensemble de tables contenant des donnes relies entre elles par des relations ; on y extrait de linformation
par le biais de requtes exprimes dans un langage spcifique.
Architecture trois-tiers
Sur un rseau informatique, des informations sont en permanence changes entre deux machines, un logiciel
assurant le traitement des informations sur chacune dentre elles. On distingue le logiciel client install sur la
machine qui envoie des requtes du logiciel serveur install sur la machine qui traite les requtes. Par extension,
les machines sont galement dsignes par les noms de client et serveur. Ce mode de communication est appel
architecture deux niveaux. Cest lune des architectures client-serveur possibles.
Larchitecture trois-tiers 1 est une architecture client-serveur qui ajoute un niveau supplmentaire dans lenvironnement prcdemment dcrit. Un serveur de donnes transmet les informations un serveur dapplication
qui, son tour, transmet les informations traites vers un client. Ce modle darchitecture prsente plusieurs
avantages :
meilleure prise en compte de lhtrognit des plates-formes ;
amlioration de la scurit des donnes en supprimant le lien entre le client et les donnes ;
meilleure rpartition des tches entre les diffrentes couches logicielles.
1. De langlais tier, qui signifie niveau.
http://info-llg.fr
12.2
informatique commune
rponse
rponse
requte
Client
requte
BDR
Serveur
Client
Serveur
dapplication
BDR
Serveur
Considrons titre dexemple la base de donnes mondial que nous allons utiliser pour illustrer ce cours. Il
sagit dune BDR qui compile un certain nombre de donnes gographiques et qui est gre par luniversit
de Gttingen. Il est possible dinteragir avec elle en utilisant un formulaire que lon trouve ladresse :
http://www.semwebtech.org/sqlfrontend/
12.3
Python et sql
SQLite est un autre SGBD qui prsente lavantage dtre prsent dans la bibliothque standard de Python.
Cela signifie que vous pouvez crire en Python une application contenant son propre SGBD intgr laide du
module sqlite3. Dans ce cas, il ne sagit plus proprement parl dune interface client-serveur puisque les
donnes sont intgralement stockes dans un fichier indpendant. Vous trouverez en annexe un script Python
rudimentaire mais suffisant pour pouvoir interagir avec une base de donne enregistre sur votre disque dur.
Enfin, on notera quil existe quelques diffrences entre les dialectes SQL utiliss par Oracle et par SQLite. Ces
diffrences seront indiques dans ce document mais de toute faon, elles ne concernent que des notions hors
programme.
Remarque. Durant ce cours on pourra remarquer des diffrences entre les rponses fournies par la base
de donnes suivant que lon interroge la base en ligne ou celle enregistre sous la forme dun fichier sur le
disque dur. Ces diffrences sexpliquent bien entendu par le fait que la premire est mise jour rgulirement,
contrairement la seconde.
1.
Le langage SQL
1.1
Relations
Nous lavons dit, une base de donnes est un ensemble de tables 2 que lon peut reprsenter sous la forme de
tableaux bi-dimensionnels. Par exemple, la base de donnes mondial contient (entre autre) une table nomme
country 3 qui possde six attributs :
Name
Code
Capital
Province
Area
Population
Chaque attribut est un objet typ appel ici domaine. Par exemple le domaine des quatre premiers attributs est
une chane de caractres, le domaine du cinquime attribut est un nombre flottant et le domaine de lattribut
Population un entier.
Les attributs dsignent les lments de chacune des colonnes du tableau qui reprsente la relation ; les lignes en
forment les enregistrements : chacun deux est un n-uplet dont les lments appartiennent chaque colonne
de la table. En gnral, une table contient un grand nombre denregistrements, et le client de la BDR connat
uniquement les attributs et leurs domaines respectifs (ce quon appelle le schma de la relation) lorsquil
interagit avec elle.
NAME
CODE
CAPITAL
PROVINCE
AREA
POPULATION
France
Spain
Austria
Czech Republic
Germany
Hungary
Italy
Liechtenstein
F
E
A
CZ
D
H
I
FL
Paris
Madrid
Wien
Praha
Berlin
Budapest
Roma
Vaduz
Ile de France
Madrid
Wien
Praha
Berlin
Budapest
Lazio
Liechtenstein
547030.
504750.
83850.
78703.
356910.
93030.
301230.
160.
64933400
46815916
8499759
10562214
80219695
9937628
59433744
36636
Cl primaire
En gnral, une base de donnes contient plusieurs tables et lon peut souhaiter croiser les donnes prsentes
dans plusieurs dentre elles (nous verrons cela plus loin). Pour cela il est ncessaire de pouvoir identifier par une
caractrisation unique chaque enregistrement dune table ; cest le rle de la cl primaire. En gnral constitue
dun attribut (mais ce nest pas une rgle, certaines cl primaires peuvent tre composes de plusieurs attributs),
elle garantit que deux enregistrements distincts ont deux cls primaires distinctes.
Dans le cas de la table country, la cl primaire est lattribut Code ; il est frquent que parmi les attributs dune
table on trouve un identifiant, en gnral dnu de signification, dont le seul rle est de jouer le rle de cl
primaire, comme cest le cas ici.
2. Ou de relations, les deux termes tant synonymes dans ce contexte.
3. Notons que les enregistrements de cette table ne sont pas tous des pays mais plus gnralement des entits politiques, ce qui explique
par exemple que lle de la Runion soit une entre distincte de la France.
http://info-llg.fr
12.4
1.2
informatique commune
Requtes de base
Commenons par extraire de cette table le nom de tous les pays quelle contient :
SELECT name FROM c o u n t r y
Les mots-cls SELECT ... FROM ralisent linterrogation de la table. Dans le cas de lexemple ci-dessus on ne liste
quun seul des attributs de la table, pour en avoir plusieurs on spare les attributs par une virgule ; pour les
avoir tous on les dsigne par une toile. Par exemple, les deux requtes qui suivent donnent pour la premire le
nom de chacun des pays ainsi que leurs capitales, pour la seconde lintgralit des donnes de la table :
SELECT name , c a p i t a l FROM c o u n t r y
SELECT * FROM c o u n t r y
Le mot-cl WHERE filtre les donnes qui rpondent un critre de slection. Par exemple, pour connatre le
nom de la capitale du Botswana on crira :
SELECT c a p i t a l FROM c o u n t r y WHERE name = ' Botswana '
Il se peut que certains attributs dun enregistrement soient manquants ; dans ce cas la valeur de cet attribut est
NULL. Par exemple, dans la table country un territoire ne possde pas de capitale ; pour le connatre on produit
la requte :
SELECT name FROM c o u n t r y WHERE c a p i t a l I S NULL
Diffrentes clauses permettent de formuler des requtes plus labores ; la figure 5 rassemble les instructions
les plus frquentes.
SELECT *
SELECT DISTINCT *
FROM table
WHERE condition
GROUP BY expression
HAVING condition
ORDER BY expression ASC / DESC
LIMIT n
OFFSET n
OFFSET n ROWS
FETCH FIRST n ROWS ONLY
Exercice 1 Rdiger une requte SQL pour obtenir :
a) la liste des pays dont la population excde 60 000 000 dhabitants ;
b) la mme liste trie par ordre alphabtique ;
c) la liste des pays et de leurs populations respectives, trie par ordre dcroissant de population ;
d) le nom des dix pays ayant la plus petite superficie ;
e) le nom des dix suivants.
1.3
12.5
Jointures
Lintrt dune base de donnes rside en particulier dans la possibilit de croiser des informations prsentes
dans plusieurs tables par lintermdiaire dune jointure. Dans la base de donnes qui nous occupe on trouve
une table nomme encompasses qui possde trois attributs :
Country
Continent
Percentage
Le premier attribut dun enregistrement est le code du pays, le deuxime le nom du continent et le dernier la
portion du pays prsente sur ce continent. La cl primaire de cette table est le couple (Country, Continent), et
la valeur du troisime argument ne peut pas tre nulle.
Cette seconde table possde un attribut en commun avec la premire table : lattribut Country de la table
encompasses est identique lattribut Code de la table country et va nous permettre par son intermdiaire de
croiser les informations de ces deux tables.
Par exemple, pour connatre la liste des pays dont une fraction au moins est en Europe on crira la requte :
SELECT c o u n t r y . name
FROM c o u n t r y JOIN encompasses
ON c o u n t r y . code = encompasses . c o u n t r y
WHERE encompasses . c o n t i n e n t = ' Europe '
Les mots-cls JOIN ... ON crent une table intermdiaire forme du produit cartsien des deux tables et applique
ensuite la requte sur la nouvelle relation.
Remarque. Linterrogation de plusieurs tables simultanment rend ncessaire le prfixage de lattribut par
le nom de la table pour le cas o certaines dentres-elles auraient des noms dattributs en commun. On peut
allger cette syntaxe laide dalias pour la rendre plus compacte. Par exemple, la requte prcdente peut
scrire plus succinctement :
SELECT c . name
FROM c o u n t r y c JOIN encompasses e
ON c . code = e . c o u n t r y
WHERE e . c o n t i n e n t = ' Europe '
Ainsi, raliser cette jointure revient crer une table (virtuelle) nomme :
country c JOIN encompasses e ON c.code = e.country
c.Name
c. Capital
c.Province
c.Area
c.Population
e.Continent
e.Percentage
NAME
CODE
CAPITAL
PROVINCE
AREA
POPULATION
COUNTRY
CONTINENT
PERCENTAGE
Bulgaria
Romania
Turkey
Turkey
Denmark
BG
RO
TR
TR
DK
Sofia
Bucuresti
Ankara
Ankara
Kobenhavn
Bulgaria
Bucuresti
Ankara
Ankara
Hovedstaden
110910.
237500.
780580.
780580.
43070.
7284552
20121641
75627384
75627384
5580516
BG
RO
TR
TR
DK
Europe
Europe
Asia
Europe
Europe
100
100
97
3
100
Country
Province
Population
Longitude
Latitude
http://info-llg.fr
12.6
1.4
informatique commune
Fonctions dagrgation
Il est possible de regrouper certains enregistrements dune table par agrgation laide du mot-cl GROUP BY
pour ensuite leur appliquer une fonction (on trouvera figure 7 quelques exemples de fonctions statistiques
disponibles). Par exemple, pour connatre le nombre de pays de chaque continent on crira :
SELECT e . c o n t i n e n t , COUNT ( * )
FROM c o u n t r y c JOIN encompasses e ON c . code = e . c o u n t r y
GROUP BY e . c o n t i n e n t
COUNT( )
MAX( )
MIN( )
SUM( )
AVG( )
nombre denregistrements
valeur maximale dun attribut
valeur minimale dun attribut
somme dun attribut
moyenne dun attribut
Exercice 3 La table language possde les attributs suivants :
Country
Name
Percentage
Lattribut Country est le code du pays, Name le nom dune langue parle dans celui-ci, et Percentage la
proportion dhabitants dont cest la langue maternelle 4 .
a) Donner la liste ordonne des dix langues parles dans le plus de pays diffrents.
b) Quelles sont les langues parles dans exactement six pays ? Et de quels pays sagit-t-il ?
c) Quelles sont les langues parles par moins de 30 000 personnes dans le monde ?
d) Quelles sont les cinq langues les plus parles en Afrique ? On prcisera pour chacune delles le nombre de
personnes qui la parlent.
1.5
Sous-requtes
Notons pour finir quil est possible dimbriquer une requte dans une clause SELECT, ou (le plus souvent) au sein
dun filtre WHERE ou HAVING, la sous-requte devant simplement tre encadre par une paire de parenthses.
Supposons par exemple que lon veuille dterminer les pays dont la densit de population est suprieure la
moyenne. Il y a clairement deux calculs effectuer : dabord le calcul de la moyenne, puis la dtermination des
pays dont la densit est suprieure cette moyenne. Ceci peut se traduire en une seule requte SQL :
SELECT name FROM c o u n t r y
WHERE p o p u l a t i o n / a r e a > ( SELECT AVG ( p o p u l a t i o n / a r e a ) FROM c o u n t r y )
Exercice 4 Dans la BDR mondial se trouve une table economy qui possde les attributs suivants : Country
(le code du pays), GDP (le PIB, en millions de dollars), agriculture (la part de lagriculture dans le PIB, en
pourcentage), Service (la part des services dans le PIB), Industry (la part de lindustrie dans le PIB), Inflation
(le taux dinflation) et Unemployment (le taux de chmage).
a) Dterminer les pays majoritairement agricoles dont le taux de chmage est infrieur la moyenne mondiale.
b) Dterminer pour chaque continent le pays au taux dinflation le plus faible parmi les pays majoritairement
industriels.
4. Attention, ces donnes ne sont pas disponibles pour tous les pays.
2.
12.7
Algbre relationnelle
SQL est le langage de prdilection pour interagir avec une BDR, mais ce lest pas le seul. Lalgbre relationnelle
fournit un cadre thorique indpendant du langage, proche de la thorie des ensembles. Les oprations sur les
BDR y sont dfinies de manire formelle et permettent de les composer efficacement entre-elles. La formulation
abstraite dans le cadre de lalgbre relationnelle permet dobtenir des requtes non seulement correctes mais
aussi et surtout efficaces.
De mme que lalgorithmique permet de formuler un problme informatique indpendamment dun langage
de programmation particulier, lalgbre relationnelle dfinit un cadre formel dans lequel exprimer des requtes
et des relations. Elle sappuie trs largement sur la thorie des ensembles et propose un ensemble doprations
formelles qui permettent de construire de nouvelles relations partir de relations existantes.
2.1
Oprations ensemblistes
Trois oprations ensemblistes de base peuvent tre effectues avec les relations : les oprations dunion (),
dintersection () et de diffrence ().
SELECT * FROM t1 UNION SELECT * FROM t2
A
a1
a2
C
c1
c2
A
a1
a3
R1 R2
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
2.2
R2
B
b1
b3
R1 R2
A B C
a1 b1 c1
C
c1
c3
R1 R2
A B C
a2 b2 c2
Projection
La projection extrait une relation dune relation donne en supprimant des attributs de cette dernire. Si
A1 , A2 , . . . , An sont des attributs dune relation R, la projection de R suivant A1 , A2 , . . . , An est lensemble des
enregistrements de R dont les attributs sont A1 , A2 , . . . , An et qui ne se rptent pas. On la note :
(A1 ,...,An ) (R)
En SQL la projection se traduit par la requte :
SELECT DISTINCT a1, a2, ... , an FROM table
A
a1
a2
a1
R
B
b1
b2
b1
C
c1
c2
c3
(A,B) (R)
A B
a1 b1
a2 b2
http://info-llg.fr
12.8
informatique commune
Slection
La slection permet dextraire les enregistrements dune relation R qui satisfont une expression logique E. On la
note :
E (R)
En SQL la slection se traduit par la requte :
SELECT * FROM table WHERE expression_logique
A
a1
a2
a3
a4
R
B
b1
b2
b3
b4
C
c1
c2
c3
c4
A
a2
a4
E (R)
B C
b2 c2
b4 c4
Renommage
Le renommage permet la modification du nom dun ou plusieurs attributs dune relation. Renommer lattribut a
en lattribut b dans la relation R scrit :
ab (R)
En SQL le renommage se traduit par la requte :
ALTER TABLE table RENAME COLUMN a TO b
Attention, le renommage nest pas possible avec SQLite (seule le renommage dune table est possible).
A
a1
a2
a3
R
B
b1
b2
b3
ad (R)
D B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
C
c1
c2
c3
Jointure
La jointure est une opration qui porte sur deux relations R1 et R2 et retourne une relation qui comporte les
enregistrements des deux premires relations qui satisfont une contrainte logique E. Cette nouvelle relation se
note :
R1 ZE R2
En SQL on ralise une jointure par la requte :
SELECT * FROM table1 JOIN table2 ON expression_logique
A
a1
a2
a3
R1
B
b1
b2
b3
R2
C
c1
c2
c3
D
a1
a2
R1 ZA=D R2
A B C E
a1 b1 c1 e1
a2 b2 c2 e2
E
e1
e2
A
a1
a2
R1
B
b1
b2
C
c1
c2
R2
D E
d1 e1
d2 e2
A
a1
a1
a2
a2
R1 R2
B C D
b1 c1 d1
b1 c1 d2
b2 c2 d1
b2 c2 d2
E
e1
e2
e1
e2
12.9
Effectuer le produit cartsien de deux tables de grandes tailles nest pas une opration toujours pertinente, mais
il constitue une opration de base pour dfinir dautres oprations plus complexes. Ainsi, la jointure est un
produit cartsien suivi dune slection :
R1 ZE R2 = E (R1 R2 ).
Enfin, la division cartsienne est encore une opration qui produit une relation partir de deux relations R1 et
R2 vrifiant R2 R1 . La relation obtenue possde tous les attributs de R1 que ne possde pas R2 ; on la note :
R1 R2
et se caractrise par : x R1 R2 , y R2 , xy R1 . Cette opration na pas dquivalent en SQL.
A
a1
a1
a2
a3
a3
R1
B C
b1 c1
b1 c2
b2 c3
b3 c1
b3 c2
R2
D
d1
d2
d3
d1
d2
C
c1
c2
D
d1
d2
R1 R2
A B
a1 b 1
a3 b 3
http://info-llg.fr
12.10
informatique commune
La mthode cursor applique la connexion que nous venons de crer cre un intermdiaire entre linterface
et la BDR destin mmoriser temporairement les donnes en cours de traitement ainsi que les oprations
que vous effectuez sur elles, avant leur transfert dfinitif vers la base de donnes. Son utilisation permet donc
dannuler si ncessaire plusieurs oprations qui se seraient rvles inadquates sans que la base de donnes
nen soit affecte.
cur = base.cursor()
Une fois le curseur cr, la mthode execute permet de transmettre des requtes rdiges en SQL sous forme
de chane de caractres :
cur.execute("ici on crit une requte en langage SQL")
Enfin, si des modifications ont t effectues sur la BDR, il faut appliquer la mthode commit la connexion
cre pour quelles deviennent dfinitives. On peut ensuite refermer le curseur et la connexion :
cur.close()
base.close()
Voici enfin un script permettant un dialogue interactif avec la base de donnes mondial.sq3 utilise dans ce
document :
import sqlite3
base = sqlite3.connect ("mondial.sq3")
cur = base.cursor ()
while True:
requete = input("Veuillez entrer une requte SQL (ou 'stop' pour terminer) :")
if requete == 'stop':
break
try:
cur.execute(requete)
except:
print('*** Requte SQL incorrecte ***')
else:
for enreg in cur:
print(enreg)
print()
cur.close()
base.close()