Chapitre 14 Bases de données

Transcription

Chapitre 14 Bases de données
Chapitre 14
Bases de données
I
Présentation
Notre société utilise de plus en plus de données et un des enjeux de l’efficacité
économique mais aussi de la démocratie est d’en maîtriser l’exploitation.
Il n’est pas raisonnable d’écrire individuellement un programme d’accès aux
données car les différents problèmes sont cruciaux et demandent beaucoup
d’attention :
•
•
•
•
•
•
structuration des données
rapidité d’accès
gestion des autorisations d’accès
priorités d’accés
sauvegarde des modifications
gestion des pannes ...
Depuis 1970 deux modèles abstraits de structure des données et d’extraction
ont été étudiés : l’algèbre relationnelle et le calcul relationnel. Ils sont prouvés
comme équivalents et ont servi de base théorique aux logiciels de base de
données que les progrès de l’informatique ont permis d’écrire de manière
efficace. Nous allons étudier l’un de ces modèles : l’algèbre relationnelle.
Les bases de données sont articulées sous la forme client-serveur : l’utilisateur travaille sur un poste (client) qui peut être éloigné de l’ordinateur qui
gère les données (serveur). Il est nécessaire de permettre un dialogue entre
ces deux parties.
1
2
Client
SQL
Serveur
Une normalisation a permis d’unifier le langage utilisé dans les bases de
données : SQL. Ce langage permet d’unifier les différents systèmes du point
de vue des utilisateurs. Bien entendu la programmation en interne de ces gros
logiciels dépend de l’éditeur (Oracle, SAP, IBM, Microsoft, ...) Nous allons
en étudier les principales fonctions en commençant par les bases simples
(ou plates) puis en étudiant ce qui fait l’intérêt des bases, le croisement de
données.
On peut remarquer que ce langage n’est en fait pas visible pour les usagers.
En effet l’utilisation des bases de données se fait maintenant à travers une
architecture trois-tiers. Entre l’usager et la base de données se place l’application qui travaille au dessus du gestionnaire de bases de données.
Client
Client
interface html
Application
SQL
Serveur
Client
Le chapitre finit par une courte présentation de la conception d’une base
de données avec les fonctions SQL utiles à l’écriture de cette base. Nous ne
verrons qu’une toute petite partie de ce domaine très important car il induit
la rapidité et la facilité d’emploi des bases.
3
II
Structure
II.1
Tableau
Le modèle utilisé est relativement simple : c’est celui d’un tableau à deux
dimensions que nous avons tous souvent rencontré.
On regroupe plusieurs formulaires qui donnent tous les mêmes informations
sur les objets :
• répertoire (nom, téléphone, adresse, ...)
• fiche de bibliothèque (auteur, titre, année, pagination, ...)
• livre d’état-civil des naissances (père, mère, nom, lieu, ...)
• ...
Et on les représente dans un tableau, par exemple dans un tableur.
Nous ferons le choix que les données des différents éléments sont en ligne et
que les informations sont alignées par colonne.
Voici un exemple simple dont nous nous servirons. Ce sont les vainqueurs des
élections présidentielles.
nom
de Gaulle
de Gaulle
Pompidou
Giscard d’Estaing
Miterrand
Miterrand
Chirac
Chirac
Sarkozy
Hollande
II.2
prénom
Charles
Charles
Georges
Valery
François
François
Jacques
Jacques
Nicolas
François
études D_G année
Saint-Cyr D
1958
Saint-Cyr D
1964
ENS Ulm D
1969
X
D
1974
Droit
G
1981
Droit
G
1988
ENA
D
1995
ENA
D
2002
Droit
D
2007
ENA
G
2012
résultat
78,5
55,2
58,2
50,8
51,8
54,0
52,6
82,2
53,0
51,6
Vocabulaire
• Les différents titres de colonnes sont appelés attributs.
On notera formellement A1 , A2 , . . . , Ap les attributs.
• L’ensemble des valeurs possibles d’un attribut A est son domaine Dom(A).
• Chaque ligne s’appelle un n-uplet (ou tuple en anglais).
C’est donc un élément de Dom(A1 ) × Dom(A2 ) × · · · × Dom(Ap ).
Une structure de donnée élémentaire, appelée schéma relationnel ou plus
simplement relation, est déterminée par un ensemble fini et fixé d’attributs et de leur domaines (le sort de la relation) et l’ensemble des tuples
(l’extension de la relation).
4
II.3
Contraintes
On va reprendre certaines phrases énoncées ci-dessus et en tirer des conséquences. Certaines de ces conséquences devront être assurées par l’utilisateur d’autres seront contrôlées par le logiciel.
Définition 14.1. Les attributs forment un ensemble
• Il n’y a pas d’attribut en double : il ne peut être question qu’il y ait deux
attributs de même nom, ils risqueraient d’être affectés de valeurs différentes
dans des tuples.
• L’ordre des attributs n’est pas fixé : on ne parle pas du premier attribut
mais de l’attribut nom (par exemple).
• Les différentes données ne sont donc pas vraiment des tuples, ce sont plutôt
des fonctions depuis l’ensemble des attributs vers l’union des domaines avec
la condition que t[Ai ] appartient au domaine Ai (remarquer que l’on écrit
avec des crochets plutôt que des parenthèses).
• On peut alors restreindre une ligne à un sous-ensemble d’attributs :
t[A4 , A5 , A2 ]. Si S est une partie de {A1 , A2 , . . . , Ap } on notera t[S] l’ensemble des valeurs prises par le tuple t pour les attributs appartenant à S.
Définition 14.2. Les lignes forment un ensemble
• Il n’y a pas de ligne en double : si t[A1 , . . . , Ap ] = t0 [A1 , . . . , Ap ] alors t = t0 ;
cela correspond à l’aspect fonction des tuples.
• L’ordre des lignes n’est pas fixé.
Bien entendu une présentation des données dans un tableau aura un ordre
des attributs et un ordre des tuple mais ces ordres de présentations sont le
résultats des choix de l’utilisateur ou de l’ordre physique des données.
II.4
Clés
La contrainte de non-répétition des tuples est très importante ; la répétition
de données induirait des problème de rapidité d’accès et fausserait les calculs.
Pour cela les bases de données réelles contiennent un concept de clé qui doit
être pensé dès la conception des bases de données. On verra qu’il a aussi une
grande importance lors de l’utilisation de relations multiples.
Définition 14.3. Une super-clé
d’une
relation r est un ensemble S d’attributs tel que ∀t, t0 ∈ R
t[S] = t0 [S] ⇒ (t = t0 )
En raison de la contrainte d’ensemble pour les lignes l’ensemble de tous les
attributs est toujours une super-clé.
Dans l’exemple ci-dessus {année}, {nom, résultat}, {prénom, année} sont
des super-clés.
5
Définition 14.4. Une clé candidate d’une relation r est une super-clé de
taille minimale (pour l’inclusion).
K est donc une clé candidate si
1. K est une super-clé
2. Pour tout K 0 inclus dans K, K 0 n’est pas une super-clé.
Une super-clé qui ne contient qu’un seul attribut est toujours une clé candidate.
• {nom, résultat} n’est pas une clé primaire.
• {année} est une clé primaire.
• Lorsque vous vous identifiez sur un site sur lequel vous êtes inscrit, l’identifiant + le mot de passe est une clé candidate.
Définition 14.5. Parmi les clés candidates on en choisit une : c’est la clé
primaire
Pour indiquer la clé primaire on souligne les attributs correspondants dans
la table.
Indiquer au système une clé primaire pour chaque table permet une indexation des données à l’aide de cette clé, ce qui renforce l’efficacité des procédures
d’interrogation de la table.
Dans la pratique on évitera les clés primaires qui ne seraient primaires que
"par accident" : on pourrait insérer des données supplémentaires qui feraient
perdre le caractère primaire des clés.
Pour cela on introduira un attribut, souvent nommé id, dans la définition de
la relation qui sera un entier qu’on incrémentera à chaque ajout d’un tuple.
Ce sera la clé primaire.
idElec
nom
1
de Gaulle
2
de Gaulle
3
Pompidou
4
Giscard d’Estaing
5
Miterrand
6
Miterrand
7
Chirac
8
Chirac
9
Sarkozy
10
Hollande
prénom
Charles
Charles
Georges
Valery
François
François
Jacques
Jacques
Nicolas
François
études D_G
Saint-Cyr D
Saint-Cyr D
ENS Ulm D
X
D
Droit
G
Droit
G
ENA
D
ENA
D
Droit
D
ENA
G
année résultat
1958
78,5
1964
55,2
1969
58,2
1974
50,8
1981
51,8
1988
54,0
1995
52,6
2002
82,2
2007
53,0
2012
51,6
Nous connaissons déjà ce genre d’attributs : numéro de sécurité sociale,
plaque minéralogique, numéro de série . . .
6
III
Algèbre relationnelle simple
L’algèbre relationnelle sert à formaliser les questions que l’on peut poser à
une relation ou, comme plus tard, à un ensemble de relation. Elle exprime ce
que l’on fait ; le calcul relationnel exprime ce que l’on veut.
III.1
Définition
L’algèbre relationnelle est un ensemble d’opérateurs que l’on peut appliquer
à des relations, et dont le résultat est une relation.
Comme le résultat est toujours une relation on pourra combiner les opérateurs : on forme ainsi, à partir d’opérateurs élémentaires, des requêtes élaborées.
L’objectif est de pouvoir exprimer toute manipulation raisonnable par une
expression algébrique des opérateurs élémentaires.
Exemples :
• quels sont les présidents de droite ?
• quels sont les présidents qui sortent de l’ENA ?
• quels présidents ont gouverné plus de 10 ans ?
III.2
Opérateurs ensemblistes
Un premier type d’opérateur combine 2 relations qui ont le même schéma ;
on les utilisera surtout pour assembler les résultats d’autres requêtes.
r et r0 sont deux relations ayant le même schéma (c’est-à-dire les mêmes
attributs).
1. r ∪ r0 est la relation de même schéma dont les tuples sont ceux qui
appartiennent à r ou à r0 .
2. r ∩ r0 est la relation de même schéma dont les tuples sont ceux qui
appartiennent à r et à r0 .
3. r \ r0 est la relation de même schéma dont les tuples sont ceux qui
appartiennent à r mais pas à r0 .
III.3
Opérateurs spécifiques
Les opérateurs étudiés ici sont ceux qui utilisent la structure des relations.
Dans ce chapitre nous n’étudions que les opérateurs unaires, qui s’appliquent
à une relation unique.
Par exemple la question “Quels sont les présidents qui sortent de l’ENA ?”
se traduit par : donner les noms (projection) des présidents dont les études
se sont passées à l’ENA (sélection).
7
1. La SELECTION (ou restriction) consiste à ne garder que les tuples qui
vérifie une propriété. On note σF (r) la relation extraite de r avec les
mêmes attributs dont les tuples vérifient la propriété F .
n
o
σF (r) = t ∈ r ; F (t)
Les propriétés élémentaires sont de la forme P θ Q
où θ un opérateur de comparaison (=, <, ≤, >, ≥) et P et Q des
expression construites à partir des attributs et des constantes avec des
fonctions usuelles.
Une propriété composée avec des connecteurs logiques correspond à des
unions et intersections et peut être écrite directement.
Par exemple σF et F 0 (r) = σF (r) ∪ σF 0 (r).
On utilisera donc des conditions composées.
Exemple : F est la condition “prénom = François”, σF (r) est la relation
idElec
nom
prénom
5
Miterrand François
6
Miterrand François
10
Hollande François
études D_G année
Droit
G
1981
Droit
G
1988
ENA
G
2012
résultat
51,80
54,0
51,6
2. La PROJECTION consiste à ne garder qu’une partie des attributs. On
note πX (r) la relation extraite de r avec les mêmes tuples restreints à
l’ensemble X.
n
o
πX (r) = t[X]; t ∈ r
Exemple : X est l’ensemble {prénom ,nom, résultat},
nom
prénom résultat
de Gaulle
Charles
78,5
de Gaulle
Charles
55,2
Pompidou
Georges
58,2
Giscard d’Estaing Valery
50,8
πX (r) est la relation
Miterrand
François
51,8
Miterrand
François
54,0
Chirac
Jacques
52,6
Chirac
Jacques
82,2
Sarkozy
Nicolas
53,0
Hollande
François
51,6
8
Comme la projection doit être une relation les lignes ne sont pas répétées :
études
Saint-Cyr
ENS Ulm
si X={étude}, πX (r) donne
Polytechnique
Fac de droit
ENA
3. Le RENOMMAGE consiste à renommer un attribut. Ce sera utile lors de
produits de tables lorsque deux tables ont des attributs portant le même
nom mais correspondent à des données différentes.
Si A ∈ R où R est le sort de r et B 6∈ R on peut renommer A en B :
n
ρA→B (r) = t ; ∃s ∈ r, t[B] = s[A], ∀C ∈ R \ {A}, t[C] = s[C]
IV
IV.1
o
SQL
De quoi parle-t-on ?
La présentation des bases de données qui a été faite correspond à une abstraction. Dans la pratique chaque éditeur d’un logiciel de gestion de base de
données organise les données afin d’optimiser leur accès.
En général ces données sont stockées à distance et l’utilisateur envoie des
requêtes pour obtenir les informations souhaitées : c’est l’architecture clientserveur.
Dans la pratique il existe souvent un programme intermédiaire entre l’utilisateur et les données : c’est l’architecture trois tiers (3 intervenants).
Dans le cas de l’architecture client-serveur (et aussi entre le tiers intermédiaire
et le serveur de données) il s’est produit un événement inhabituel : une norme
universelle a été établie qui permet d’écrire des requêtes de la même façon
quel que soit le logiciel : c’est SQL, pour Structured Query Langage.
Ce langage reprend la structure de l’algèbre relationnelle en y ajoutant des
moyens de calculs et autres améliorations. Il le fait dans une formulation plus
proche d’un langage humain (l’anglais) en structurant les requêtes dans un
modèle simple.
Bien entendu chaque éditeur optimise les questions pour donner des réponses
le plus rapidement possible, ajoute des améliorations supplémentaires mais
presque tous contiennent le langage tel qu’il est normalisé.
9
IV.2
Syntaxe
Les représentations des relations se font avec le modèle du tableau.
En SQL on parlera de
• tables à la places de relations
• colonnes à la places d’attributs
• lignes à la places de tuples.
La forme générale d’une requête en SQL est
SELECT x1,x2,. . .,xp
FROM table
WHERE condition ;
1. Les mots-clés de SQL sont usuellement écrits en majuscule mais ce n’est
pas obligatoire.
2. SELECT correspond à la projection, les attributs ou colonnes à afficher
sont énumérés et séparés par une virgule.
Si on ne veut pas effectuer de projection, on garde toutes les colonnes
en signalant * qui signifie "tout".
Il y a toujours une projection.
Ce caractère * permet donc d’obtenir tous les noms des colonnes.
3. WHERE correspond à la sélection (attention au faux-ami, la sélection
n’est pas SELECT).
La condition peut être composée à l’aide des connecteurs logiques AND,
OR ou NOT.
Les comparateurs sont =, >, <, >=, <=, !=.
Les chaînes de caractères sont entourées de guillemets simples.
La clause WHERE est facultative. On peut ne pas faire de sélection.
4. FROM sélectionne le nom de la table à utiliser. Cela deviendra plus
signifiant lorsqu’on utilise plusieurs tables.
5. On peut renommer une colonne avec AS ou même en juxtaposant le
nouveau nom à droite de l’ancien.
6. Un requête se termine par un point-virgule.
7. Si on veut combiner plusieurs requêtes on peut les assemble avec UNION,
INTERSECT ou EXCEPT mais il est plus simple de combiner les conditions.
10
Exemple : quels sont les noms et prénoms des présidents ayant été élus avant
1970 ou étant passés par l’ENA ?
La question en algèbre relationnelle s’écrit
πnom,prénom σannée<1970 (r) ∪ πnom,prénom σétudes=EN A (r)
SELECT nom,prénom
FROM présidents
WHERE année < 1970
En SQL cela se traduit directement par UNION
SELECT nom,prénom
FROM présidents
WHERE études=’ENA’ ;
SELECT nom,prénom
ou, plus simplement FROM présidents
WHERE année < 1970 OR études=’ENA’ ;
nom
prénom
de Gaulle Charles
de Gaulle Charles
Dans tous les cas on obtient Pompidou Georges
Chirac
Jacques
Chirac
Jacques
Hollande François
SQL ne respecte pas la contrainte d’unicité des lignes.
Si on veut éviter les redondances il faut ajouter DISTINCT à SELECT :
nom
prénom
SELECT DISTINCT nom,prénom
de Gaulle Charles
FROM présidents
donne Pompidou Georges
WHERE année < 1970 OR études=’ENA’ ;
Chirac
Jacques
Hollande François
11
V
V.1
Statistiques
Fonctions
Les résultats d’une requête seront souvent utilisés ensuite, par exemple à des
fins statistiques.
SQL contient la possibilité de faire quelques uns de ces calculs.
Les fonctions disponibles (de base) sont
1. le comptage, c’est-à-dire le nombre de lignes : COUNT
2. le maximum des éléments dans une colonne : MAX
3. le minimum des éléments dans une colonne : MIN
4. la somme des éléments d’une colonne : SUM
5. la moyenne des éléments d’une colonne (sum/count) : AVG
Le résultat est un nombre, pas une table, que l’on peut utiliser comme valeur.
Si f est une de ces fonctions on l’emploie sous la forme
SELECT f(ligne) FROM table WHERE condition ;
Exemples
1. La moyenne des scores
SELECT AVG(resultat) FROM elections donne 58,79
2. Il y a eu deux résultats "hors normes", l’élection de De Gaulle en 1958
par un collège de grands électeurs et l’élection de Chirac en 2002 face
à Le Pen.
SELECT AVG(resultat) FROM elections WHERE resultat <70 ;
donne 54
3. Un résultat de fonction est un nombre
SELECT nom, année,resultat
FROM elections
WHERE resultat < (SELECT AVG(resultat)
FROM elections
WHERE resultat <70) ;
12
nom
Giscard d’Estaing
Miterrand
donne
Chirac
Sarkozy
Hollande
V.2
année resultat
1974
50,8
1981
51,8
1995
52,6
2007
53,0
2012
51,6
Agrégats
Avec les fonctions on est sorti du cadre de l’algèbre relationnelle car on ne crée
pas une nouvelle table. Cependant on peut utiliser ces fonctions en regroupant
les données par paquets pour obtenir une nouvelle table.
Si f est une fonction, X est un ensemble d’attributs d’une relation r et A un
attribut n’appartenant pas à X on note, pour chaque tuple t0 de valeurs de
X, f (t0 , A) la valeur de la fonction f appliquée à l’attribut A pour la relation
σt[X]=t0 (r) c’est-à-dire à l’ensemble des tuples qui prennent les valeurs t0 pour
les attributs de X.
On introduit une nouvelle opération, l’agrégation notée X γf (A) (r).
X γf (A) (r)
n
o
= t ; ∃s ∈ r, t[X] = s[X], t[A] = f s[X], A
En pratique : on regroupe la relation selon les valeurs des attributs de X et on
calcule f (A) pour tous les ensembles de lignes définies par ces regroupements.
D_G resultat
D
61,5
D_G γmoyenne(resultat) (r) donne
G
52,5
Dans SQL on regroupe les données par GROUP BY colonne1, colonne2, . . .,
colonnep après l’éventuelle clause WHERE. Il faut indiquer les colonnes regroupées aussi dans la clause SELECT qui contiendra aussi l’attribut calculé.
SELECT D_G, AVG(resultat)
La requête ci dessus s’écrit FROM elections
GROUP BY D_G ;
Autre exemple : calcul des moyennes des résultats des mandats.
SELECT nom, AVG(resultat) AS moyenne
FROM elections
GROUP BY nom ;
13
nom
de Gaulle
Pompidou
Giscard d’Estaing
Miterrand
Chirac
Sarkozy
Hollande
moyenne
66,9
58,2
50,8
52,9
67,4
53,0
51,6
On peut toujours filtrer avant les regroupements (en amont) :
nom
de Gaulle
SELECT nom, AVG(resultat) AS moyenne
Pompidou
FROM elections
Giscard d’Estaing
WHERE D_G =’D’
Chirac
GROUP BY nom ;
Sarkozy
moyenne
66,9
58,2
50,8
67,4
53,0
On peut aussi filtrer après les regroupements (en aval), quand le filtre porte
sur les valeurs calculées, avec HAVING placé à la fin. La syntaxe est la même
que pour WHERE.
SELECT nom, AVG(resultat) AS moyenne
nom
moyenne
FROM elections
Pompidou
58,2
WHERE D_G =’D’
Giscard d’Estaing
50,8
GROUP BY nom
Sarkozy
53,0
HAVING moyenne < 60 ;
14
VI
VI.1
Jointure dans l’algèbre relationnelle
Introduction
Ce qui précède décrit ce qui peut se faire avec un tableur évolué.
Dans ce cadre on considère un unique formulaire qui doit contenir tout ce
qui est pertinent. On risque alors la redondance des informations et la non
fiabilité des répétions.
On va maintenant étudier l’utilisation simultanée de plusieurs tables.
Exemple
On utilisera un exemple simple de 4 tables concernant le groupe de musique
électronique, Tangerine Dream.
1. une table Musiciens de SORT (idMusicien, nom, prénom)
idMusicien
nom
prénom
1
Froese
Edgar
2
Schulze
Klaus
3
Schnitzler Conrad
2. une table Disques de SORT (idDisque, titre, année)
idDisque
titre
1
Electronic Meditation
2
Alpha Centauri
3
Zeit
année
1970
1971
1972
3. une table Instruments de SORT (idMusicien,instrument)
idMusicien instrument
1
Claviers
La clé primaire est {idMusicien,instrument}
1
Guitare
1
Synthés
4. une table JoueDans de SORT (idMus,idDis)
idMus idDis
1
1
La clé primaire est {idMus,idDis}
1
2
1
3
15
VI.2
Produit
Le premier moyen d’assembler deux relations est d’en faire le produit cartésien.
Définition 14.6. Produit de deux relations
1. Si r est une relation de sort R
2. si r0 est une relation de sort R0
3. si R et R0 sont disjoints
alors le produit de r net r0 est la relation r × ro0 de sort R ∪ R0
définie par r × r0 = u ; u[R] ∈ r, u[R0 ] ∈ r0
Exemple : Musiciens × Disques
idMusicien
nom
prénom idDisque
titre
1
Froese Edgar
1
Electronic Meditation
1
Froese Edgar
2
Alpha Centauri
1
Froese Edgar
3
Zeit
année
1970
1971
1972
Tous les musiciens sont associés à tous les disques.
La condition R ∩ R0 = ∅ n’est pas très contraignante, il suffit de renommer
les noms des attributs ; en général on notera r.nom tous les attributs de r et
r’.nom tous les attributs de r0 pour éviter les homonymies.
On pourrait imaginer aplatir tout ensemble de tables en en faisant le produit :
le principal inconvénient est la taille qu’on obtiendrait, très lourde, et donc
le temps nécessaire aux recherche et modification.
De plus chaque modification devrait se faire sur un grand nombre de tuples.
VI.3
Division
Il existe une fonction réciproque du produit, la division, dans l’algèbre relationnelle.
Définition 14.7. Division de deux relations
1. Si r est une relation de sort R
2. si r0 est une relation de sort R0
3. si R0 ⊂ R0
alors la division de r par r0 est la relation r ÷ r0 de sort R \ R0 définie par
n
r ÷ r0 = u ; ∀t0 ∈ r0 , (u, t0 ) ∈ r
o
C’est l’ensemble des tuples sur R \ R0 que l’on peut prolonger sur R avec tous
les tuples de r0 en obtenant toujours un tuple de r.
On a (r × r0 ) ÷ r0 = r et (r ÷ r0 ) × r0 ⊂ r.
16
VI.4
Jointure naturelle
Cependant il est utile d’avoir des tables différentes qui réfèrent à des objets
identiques, dans ce cas l’identifiant de l’objet peut être le même dans les deux
tables. La contrainte d’ensemble des attributs impose alors qu’un produit ne
répète pas deux colonnes identiques : on parle alors de jointure naturelle.
Définition 14.8. Jointure naturelle
1. Si r est une relation de sort R
2. si r0 est une relation de sort R0
3. si R = R1 ∪ R3 et R0 = R2 ∪ R3 avec R1 et R2 disjoints
alors la jointure naturelle de r et r0 est la relation r ./ r0 de sort R ∪ R0
définie par
n
r ./ r0 = u ; u[R] ∈ r, u[R0 ] ∈ r0
o
Exemple : Musiciens ./ Instruments
idMusicien
1
1
1
nom
prénom instrument
Froese Edgar
claviers
Froese Edgar
guitare
Froese Edgar
synthés
La colonne idMusicien n’est pas répétée.
Seuls les instruments joués par un musicien sont associés à celui-ci.
Alors que le produit Musiciens × Instruments aurait donné
idMusicien
nom
prénom idMusicien instrument
1
Froese
Edgar
1
claviers
2
Schulze
Klaus
1
claviers
3
Schnitzler Conrad
1
claviers
Les deux colonnes idMusiciens correspondent ici aux attributs des deux tables
(ils sont supposés distincts).
Klaus Schulze ne joue pas de clavier dans le disque de Tangerine Dream
auquel il a participé.
Il y a deux cas particuliers
• si R ∩ R0 = ∅ on retrouve le produit
• si R = R0 on retrouve l’intersection
17
VI.5
Jointure
La jointure n’est, d’un point de vue algébrique, qu’une abréviation :
on sélectionne dans le produit.
Définition 14.9. Jointure
1. Si r est une relation de sort R
2. si r0 est une relation de sort R0
3. si R et R0 sont disjoints
4. si F est une condition portant sur R ∪ R0
alors la jointure de r et r0 selon F est la relation r ./F r0 de sort R ∪ R0
définie par
r ./F r0 = σF (r × r0 )
Exemple : pour associer les artistes avec les identifiants des disques on calcule
Musiciens ./F joueDans où F est le filtre idMusicien = idMus
idMusicien
nom
prénom idMus idDis
1
Froese Edgar
1
1
1
Froese Edgar
1
2
1
Froese Edgar
1
3
Remarquer que les identifiants égaux apparaissent dans deux colonnes.
Si on veut le titre des disques il faut une double jointure :
(Musiciens ./F joueDans) ./F 0 Disques, où F 0 est idDis = idDisque
Pour éviter lesidentifiants on projette :
πnom,prénom,titre (Musiciens ./F joueDans)./F 0 Disques
nom
prénom
titre
Froese Edgar Electronic Meditation
Froese Edgar
Alpha Centauri
Froese Edgar
Zeit
Si F est la condition triviale vrai on retrouve le produit.
Si on considère que les noms des attributs d’une relation r sont r.A au lieu de
A alors la jointure naturelle pourrait sembler un cas particulier de jointure
où la condition F est la conjonction (liaison par ET) des égalités r.Ai = r0 .Ai
pour les attributs Ai appartenant à R ∩ R0 . Cependant il faut noter qu’alors
les colonnes égales sont répétées : la jointure naturelle est plus . . .naturelle.
18
VII
VII.1
Tables multiples dans SQL
Produit
La traduction du produit en SQL est très simple il suffit d’énumérer les
différentes tables dans la clause FROM. SQL considère les noms des colonnes
sous la forme table.nom, il n’y a pas de noms identiques.
Cependant, lors de l’affichage, le titre ne sera que nom et on peut croire que
la contrainte d’ensemble n’est pas respectée.
S’il n’y a pas d’ambiguïté il n’est pas nécessaire de donner le nom de la table.
Un appel simple comme
nom instrument
SELECT nom,instrument
Joliffe
claviers
FROM Musiciens,Instruments donne
Joliffe
claviers
WHERE nom="Joliffe" ;
Joliffe
claviers
on obtient tous les instruments (répétés) joués par tous les musiciens, ce n’est
en général pas ce que l’on souhaitait.
Pour obtenir le résultat attendu, les instruments joués par S. Joliffe, il faut
filtrer à l’aide des identifiants :
SELECT m.nom,i.instrument
nom instrument
FROM Musiciens AS m, Instruments AS i
donne Joliffe
claviers
WHERE nom="Joliffe"
Joliffe
synthés
AND m.idMusicien = i.idMusicien ;
On pourra remarquer qu’on a renommé les tables pour ne pas avoir à écrire
leur nom en entier. De plus il est utile de préfixer tous les champs même non
ambigus afin de rendre lisible leur table d’origine.
VII.2
Jointure naturelle
Dans l’exemple ci-dessus la condition m.idMusicien = i.idMusicien est une
condition d’identification, on est dans la cas d’une jointure naturelle.
Cette dernière s’écrit NATURAL JOIN
SELECT i.instrument
FROM Musiciens m NATURAL JOIN Instruments i
WHERE m.nom="Joliffe" ;
On pourra remarquer que le renommage peut se faire sans le mot-clé as.
19
VII.3
Division
La division n’est pas définie dans SQL, si on pouvait l’effectuer cela signifierait qu’on a très mal défini les tables.
VII.4
Jointure
La traduction de la jointure en SQL est
table1 JOIN table2 ON condition
Bien que cela soit possible il n’est pas recommandé de placer toutes les sélections dans la clause ON à la place de la clause WHERE.
Le premier intérêt des jointures est de structurer plus clairement les requêtes.
On écrira donc le plus souvent des équi-jointures :
• les conditions d’égalité entre des colonnes de tables différentes sont placées
dans la clause ON
• les autres conditions sont placées après WHERE
On retrouve ainsi une structure semblable à la jointure naturelle.
Exemple : quels sont les musiciens qui jouent dans Phaedra ?
SELECT m.nom, m.prénom
FROM (Musiciens AS m JOIN joueDans as j ON m.idMusicien =j.idMus)
JOIN Disques AS d ON j.idDis=d.idDisque
WHERE d.titre = "Phaedra" ;
nom
Froese
Franke
Baumann
prénom
Edgar
Christopher
Peter
La jointure est associative on peut aussi écrire
SELECT m.nom, m.prénom
FROM Musiciens m JOIN joueDans j JOIN Disques d
ON m.idMusicien =j.idMus AND j.idDis=d.idDisque
WHERE d.titre = "Phaedra" ;
20
VIII
Création de bases
VIII.1
Modèle entité-relation
On va traiter un exemple : la gestion des livraisons dans un entrepôt c’està-dire les arrivées de marchandises, objets livrés par un transporteur depuis
un fournisseur avec une date de livraison et une quantité.
On commence par définir les entités, objets uniques qui ont des caractéristiques communes
1. On va créer une table d’entreprise, fournisseurs ou transporteurs réunis,
qui contiendra les caractéristiques fixes. Il est inutile de créer deux
tables différentes car elles contiendraient les mêmes attributs.
entreprise(idEntreprise,nom,adresse,téléphone)
2. On crée ensuite une table des objets :
objet(idObjet,dénomination,poids,volume)
Comme le prix est susceptible de varier on ne l’indique pas.
On se place dans la cas simple où une pièce donnée ne peut être produite que par une entreprise, par exemple en donnant des identifiants
distincts à des pièces semblables selon leur origine.
On doit donc ajouter l’identifiant de l’entreprise dans les attributs :
objet(idObjet,dénomination,poids,volume,idEntreprise)
3. On va considérer les livraisons comme des entités abstraites :
livraison(idLivraison,date,idTransporteur)
On définit ensuite les associations entre ces entités. Ce sont des tables sans
clé primaire créée, ce sera l’ensemble des identifiants des entités associées.
Ici on va associer les objets et les livraisons par une table
contient(idLivraison,idObjet,quantité,prixTotal)
Il n’est pas utile de donner plus de renseignements (entreprise fournisseur,
poids total, volume, . . .) car ils se calculent à partir des données fournies.
Toute redondance augmente les risques d’erreurs donc d’incohérence.
VIII.2
SQL
Jusqu’à présent nous avons utilisé la partie de SQL qui manipule les données :
DML pour Data Manipulation Language. On va ici utiliser une autre partie,
de création de bases, DDL pour Data Definition Language.
Il faut signaler que nous ne voyons qu’une petite partie des instructions, que
ce soit pour la manipulation ou pour la création.
21
VIII.2.a
Création d’une base
Le programme SQL (SQLite, MySQL, . . .) ne s’ouvre qu’en l’appelant avec
une base de données. Si celle-ci n’existe pas encore il la crée automatiquement.
Un interface graphique permet de créer une base, en fait elle redémarre le
programme.
VIII.2.b
Création des tables
Pour créer une table il faut en énumérer les attributs en leur donnant un
type, comme pour les variables en python. Les types les plus courants sont
• INTEGER, un entier
• REAL, un réel
• CHAR(n), une chaîne de n caractères exactement
• VARCHAR(n), une chaîne de n caractères au plus
Il faut aussi spécifier la clé primaire.
Cela se fait en ajoutant la commande PRIMARY KEY à l’attribut concerné
CREATE TABLE entreprise(
idEntreprise INTEGER PRIMARY KEY,
nom VARCHAR(20),
adresse VARCHAR(20),
téléphone VARCHAR(14)) ;
Si un ensemble d’attributs définit la clé primaire on écrit cette contrainte
après les définitions des attributs. La commande PRIMARY KEY ne doit
apparaître qu’une fois.
CREATE TABLE contient(
idLivraison INTEGER,
idObjet INTEGER,
quantité INTEGER,
prixTotal REAL,
PRIMARY KEY(idLivraison,idObjet)) ;
VIII.2.c
Clé étrangère
L’utilisation efficace de la jointure demande qu’existent des identifiants égaux
dans plusieurs tables.
Il faut donc signaler qu’un attribut réfère à un attribut dans une autre table
et que sa valeur doit exister dans cette autre table. Le logiciel de base de données se chargera des vérifications. Dans la pratique les tables qui décrivent
22
des entités auront une clé primaire sous la forme d’une unique colonne d’identifiant et les tables qui décrivent les associations feront référence à ces
attributs : on donnera le nom de clé étrangère à ces colonnes.
On peut donc ajouter une telle contrainte par
FOREIGN KEY (attribut) REFERENCES autreTable (autreTable.attribut)
CREATE TABLE contient(
idLivraison INTEGER,
idObjet INTEGER,
quantité INTEGER,
prixTotal REAL,
PRIMARY KEY(idLivraison,idObjet)
FOREIGN KEY (idLivraison) REFERENCES livraison (idLivraison),
FOREIGN KEY (idObjet) REFERENCES objet (idObjet) ;
VIII.2.d
Création des tuples
On introduit les différents tuples par l’instruction INSERT INTO nomTable
suivie de VALUE (valeur1,. . .,valeurp) ;
On peut rentrer plusieurs tuples à la fois en les séparant par des virgules.
Si l’ordre d’entrée des valeurs n’est pas celui de la définition des tableson doit
préciser les colonnes après INTO nomTable.
INSERT INTO entreprises
VALUE (1,"Labelle vis",5 rue des Tonneaux 59435 CHETICHI","03.20.01.32.87"),
(2,"Beau et gond à la fois",17 rue Jacques Brel 59345 CHENINLA","03.20.33.32.64") ;
23
IX
SQLite manager
Le logiciel choisi pour expérimenter les bases de données est SQLite.
Il est disponible sur toutes les distribution (Windows, Mac et Linux),
il est facile à utiliser.
Pour obtenir une interface à son utilisation nous allons utiliser un plug-in de
Firefox : SQLite manager.
La première étape est d’avoir Firefox disponible.
IX.1
Installation
SQLite manager est un module complémentaire (en français) : on se place
dans la page de ces modules dans Firefox :
Dans cette page on fait une recherche, par exemple sur le mot SQLite
Parmi les modules proposés on choisit SQLite manager que l’on installe, il
faut ensuite redémarrer Firefox.
24
IX.2
Utilisation
Pour lancer le module on le choisit dans le menu Outils
Il se lance dans une fenêtre séparée.
On choisit alors sa structure dans le menu Base de donnée (on s’y connecte).
Dans l’onglet "Exécuter le SQL" on peut alors rentrer ses requètes
que l’on exécute par "Exécuter les commandes SQL".