Vous êtes sur la page 1sur 78

Introduction aux bases de donnes

Informatique pour tous en MPSI

Anne scolaire 2013-2014

Table des matires


1 Introduction aux bases de donnes

2 Algbre relationnelle
2.1 Le modle relationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Relations et bases de donnes . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 Interrogation dune table (ou dune relation) . . . . . . . . . . . . . . . .
2.2 Algbre relationnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Projection (extraction de colonnes dune table) . . . . . . . . . . . . . .
2.2.2 Slection (extraction de lignes dune table) . . . . . . . . . . . . . . . . .
2.2.3 Oprations ensemblistes : union, intersection, diffrence . . . . . . . . . .
2.2.4 Produit cartsien de tables . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.5 Jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Interrogation de plusieurs tables . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Agrgation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.1 Formalisme de lalgbre relationnelle . . . . . . . . . . . . . . . . . . . .
2.5.2 Fonctions dagrgation dans le langage SQL . . . . . . . . . . . . . . . .
2.5.3 Complments : slection en amont et en aval dune agrgation . . . . . .
2.5.4 Utilisation des fonctions dagrgation au sein dune requte . . . . . . . .
2.6 Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6.1 Utilisation dalias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6.2 Ordonner les lignes de la tables rsultant dune requte . . . . . . . . . .
2.7 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7.1 Cration de la relation Notes_ABCD dans la base de donnes Base_Notes
2.7.2 Fonction dagrgation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.8 TD : interrogation de tables dune base de donnes . . . . . . . . . . . . . . . .
2.9 Correction des exercices du chapitre 2 . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

7
8
8
9
10
10
14
20
21
24
25
25
26
26
27
33
34
35
35
35
41
46
47
47
48
49

3 Base de donnes relationnelle


3.1 Dfinition . . . . . . . . . . . . . . . . .
3.2 Gnalogie de la MPSI 1-221 (2013-2014)
3.3 Interrogation de la base Fruits_d_ete .
3.4 Illustration de lintrt dune jointure . .
3.5 TD Bases de donnes relationnelles . . .
3.6 Correction des exercices du chapitre 3 . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

51
51
56
61
64
66
67

.
.
.
.

69
69
75
77
77

4 Cration dune base de donnes


4.1 Exemple du cours . . . . . . . . . .
4.2 Cration de la base MPSI_Fermat .
4.3 Sauvegarder une base de donnes .
4.4 Correction des exercices du chapitre

.
.
.
4

.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

TABLE DES MATIRES

1
Introduction aux bases de donnes

Chapitre

Voyons, partir des deux exemples suivants le genre de difficult que lon peut rencontrer lorsque lon
cherche structurer des donnes qui, dans nos exemples seront de petite taille mais quil conviendra
dimaginer systmatiquement de trs grande taille.
Premier exemple.
Vous souhaitez informatiser le contenu de votre propre bibliothque. Dans un premier temps, vous
envisagez la cration dun tableau prsent de la manire suivante :
rfrence de luvre
dans ma bibliothque
1
2
...

titre

auteur

anne de publication

Les Perses ESCHYLE


Le Feu
Henri BARBUSSE
...
...

472
1916
...

Un inconvnient de ce mode de prsentation des donnes est que lordre dacquisition des ouvrages
dtermine lordre de saisie dans le tableau, ce qui ne permettra pas de proposer un inventaire de la
bibliothque faisant apparatre conscutivement les uvres dun mme auteur. Une ide pour remdier
cela consiste reprer les uvres dabord par leur auteur et ensuite par leur titre pour proposer un
tableau de la forme suivante :
rfrence de luvre
dans ma bibliothque
1
2
...

auteur

livre 1

anne de
livre 2
anne de
...
publication
publication
ESCHYLE Les Perses
472
Victor Hugo Les chtiments 1853
Les contemplations 1856
...
...
...

mais le gros problme de cette faon de structurer les informations vient du fait que le nombre de
colonnes du tableau peut augmenter avec les achats de livres successifs (tout nouvelle acquisition dun
ouvrage de Victor HUGO ncessitera deux colonnes supplmentaires !)
Lidal serait de pouvoir saisir dans leur ordre dachat les ouvrages successifs de votre bibliothque
sous une forme approprie permettant ensuite, par des oprations ad hoc sur les bases donnes, de
pouvoir
savoir si un ouvrage dont on donne le titre est prsent dans la bibliothque,
obtenir la liste et le nombre des uvres de la bibliothque crites par un ou plusieurs auteurs
donns,
obtenir la liste et le nombre des uvres de la bibliothque publies entre deux annes donnes,
obtenir la reprsentation des uvres regroupes par auteurs, les auteurs tant rangs dans lordre
alphabtique (par exemple),
...
Deuxime exemple.
Vous devez grer administrativement les lves de PCSI et MPSI du lyce Fermat, comment pourriezvous prsenter lensemble des lves de ces classes ?
Vous envisageriez peut-tre de regrouper les lves par classe dans un grand tableau de la forme
suivante

1. INTRODUCTION AUX BASES DE DONNES

Intitul de la classe
MPSI 1
MPSI 2
MPSI 3
PCSI 1
PCSI 2

Nb lves (NOM, prnom, date naissance, LV1, LV2, Lyce Term., Boursier)
47
[(ANTIBI, Anouk, 21/9/96, Ang, Esp, Jolimont, NON), . . .]
45
...
45
...
45
...
45
...

tablir la liste des lves dune classe donne est immdiat, il suffit de reprendre les informations de
lune des 5 lignes du tableau. En revanche, calculer le taux dlves boursiers en MPSI et PCSI est
plus difficile car il faut parcourir lintgralit du tableau. De mme dresser les listes des lves pour les
professeurs de langue (LV1 et LV2) semble assez compliqu !
Lidal serait de pouvoir saisir les lves et les diffrentes informations qui les concernent sous une
forme approprie permettant ensuite, par des oprations ad hoc sur les bases donnes, de pouvoir
obtenir
les listes alphabtiques des lves de chaque classe,
les listes alphabtiques des lves ayant la mme LV2,
le taux dlves boursiers par classe et globalement pour les trois classes,
le nombre dlves de MPSI issus des classes de terminale dun lyce donn,
...
Prsenter des donnes sous la forme dun tableau fait explicitement apparatre des choix concernant
limportance des diffrentes informations reprsentes (les colonnes sont ordonnes de gauche droite,
les lignes sont ordonnes de haut en bas) et ce mode de reprsentation privilgie certaines relations
entre les donnes devant dautres relations : dans lexemple 1 et le second mode de reprsentation, un
ouvrage est avant tout pens comme appartenant luvre dun auteur, dans lexemple 2, un lve est
avant tout pens comme appartenant sa classe si bien que les informations indpendantes de la classe
des lves ne sont pas facilement lisibles sur le tableau). Lide de lalgbre relationnelle qui permet
de formaliser les bases de donnes consiste reprsenter les informations connues (cest dire
les donnes) sous la forme de plusieurs tableaux appels tables ou relations (dans lesquels il ny
a pas de lignes et ni de colonnes privilgies, contrairement un tableau crit ) dont la saisie est
peu contraignante (les lignes dune table sont saisies les unes la suite des autres sans soucier dun
ordre de saisie de chaque ligne) puis de tisser des liens entre ces tables ce qui permet (grce des
algorithmes performants dont ltude dpasse le cadre de cet expos et du programme dinformatique
pour tous en CPGE) de les interroger pour pouvoir rpondre efficacement la plupart les
questions susceptibles dtre poses partir des donnes de la base.

Chapitre

2
Algbre relationnelle

Sommaire
2.1

2.2

Le modle relationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.1

Relations et bases de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.2

Interrogation dune table (ou dune relation) . . . . . . . . . . . . . . . . . .

Algbre relationnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.2.1

Projection (extraction de colonnes dune table) . . . . . . . . . . . . . . . . .

10

2.2.2

Slection (extraction de lignes dune table) . . . . . . . . . . . . . . . . . . .

14

2.2.3

Oprations ensemblistes : union, intersection, diffrence . . . . . . . . . . . .

20

2.2.4

Produit cartsien de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

2.2.5

Jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

2.3

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

25

2.4

Interrogation de plusieurs tables . . . . . . . . . . . . . . . . . . . . . . . .

25

2.5

Agrgation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

2.6

2.5.1

Formalisme de lalgbre relationnelle . . . . . . . . . . . . . . . . . . . . . . .

26

2.5.2

Fonctions dagrgation dans le langage SQL . . . . . . . . . . . . . . . . . . .

27

2.5.3

Complments : slection en amont et en aval dune agrgation . . . . . . . . .

33

2.5.4

Utilisation des fonctions dagrgation au sein dune requte . . . . . . . . . .

34

Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.6.1

Utilisation dalias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.6.2

Ordonner les lignes de la tables rsultant dune requte . . . . . . . . . . . .

35

Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

2.7.1

Cration de la relation Notes_ABCD dans la base de donnes Base_Notes . . .

46

2.7.2

Fonction dagrgation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

2.7.3

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

47

2.8

TD : interrogation de tables dune base de donnes . . . . . . . . . . . . .

48

2.9

Correction des exercices du chapitre 2 . . . . . . . . . . . . . . . . . . . . .

49

2.7

Dans ce chapitre nous allons dfinir la notion abstraite de table (on dit aussi relation)
Nous verrons aussi comment exploiter une table. Dans un premier temps, les oprations sur les
tables seront exprimes de manire abstraite en utilisant le formalisme de lalgbre relationnelle. Par
la suite, nous traduirons ces oprations dans le language SQL 1 qui consiste les exprimer sous la forme
de requtes. Pour cela nous utiliserons le gestionnaire de bases de donnes mySQL avec lequel nous
travaillerons en ligne de commande .
Prsentons un formalisme abstrait pour structurer une reprsentation informatique des donnes : le
modle relationnel.
1. SQL est labrviation de Structured Query Language .

2. ALGBRE RELATIONNELLE

2.1

Le modle relationnel

2.1.1

Relations et bases de donnes

Dfinition 2.1.1.
Soient n N et D1 , . . . , Dn des ensembles.
Une table ou une relation, note R, sur le produit cartsien D1 . . . Dn est une partie de
D1 . . . Dn .
t R (a1 , . . . , an ) D1 . . . Dn : t = (a1 , . . . , an )
Pour tout i [[1, n]],
llment ai est lattribut dindice i de llment t de la table que lon notera t.atti ,
Di est le domaine de lattribut dindice i.
Le schma relationnel de la table R est
R(att1 : D1 , att2 : D2 , . . . , attn : Dn )

Exemples 2.1.1.
1.
2.
Dfinition 2.1.2.
Une base de donnes est un ensemble structur de donnes informatiques (chanes de caractres,
valeurs numriques, dates, . . .) dans lequel
les donnes sont enregistres sur un support permanent,
les donnes ne figurent quune seule fois (pas de redondance de linformation),
chaque objet ou entit possde un identifiant unique.
Une base de donnes relationnelle est une base de donne constitue dun ensemble de relations
(aussi appeles tables).
Le schma dune base de donne relationnelle est lensemble des schmas des relations qui
forment la base de donnes.
Exemple 2.1.1.
Dans ce la suite de ce cours, nous illustrerons les concepts tudis partir de la base de donnes
Fruits_d_ete constitue des trois tables Stock, Clients et Commandes ci-dessous :
id
1
2
3
4
Stock 5
6
7
8
9
10

fruit
origine
varit
conditionnement poids (kg) quantite
fraises France
gariguette
barquette
0, 25
125
fraises France
gariguette
barquette
0, 5
44
fraises France
gariguette
cagette
2
39
fraises Espagne andalouse dhiver
cagette
2
86
fraises France
mara des bois
barquette
0, 25
53
fraises France
charlotte
barquette
0, 25
0
cerises France
burlat
cagette
2
48
cerises Espagne
burlat
cagette
5
0
cerises France
coeur de pigeon
cagette
2
15
cerises France
napoleon
cagette
5
13

2.1. Le modle relationnel

id
nom
ville_livraison
departement
courriel
1
M. PLANES
GAILLAC
81
totoplane@laposte.net
2
M. FAURE
CARCASSONNE
11
faurepi@free.fr
3
M. BOUTY
AGEN
47
abouty@voila.fr
4
M. LAVIRON
TOULOUSE
31
titilaviron@voila.fr
5
M. LEONARDI
TOULOUSE
31
leonardimain@laposte.net
6
M. PECATTE
CASTRES
81
bp4@laposte.net
Clients
7
M. SOLE-POMIES
REVEL
31
hkforever@voila.fr
8
M. CERDA
ALBI
81
remy.cerda@free.fr
9
M. JAUROU
CASTRES
81
ajaurou@laposte.net
10 Mlle PRENAT-VILLE
GAILLAC
81
clemprenatville@laposte.net
11
M. CHARRIER
PAMIERS
09
soldatfaupa@laposte.net
12
M. BROUHARD
PAMIERS
09
tb@free.fr
13
Mlle THIEYRE
BRIVE
19
binompmoins16@free.fr
id
1
2
3
4
5
6
7
8
Commandes 9
10
11
12
13
14
15
16
17
18

date
client produit quantite
10 5 2014
2
4
10
10 5 2014
6
3
20
12 5 2014
2
7
5
12 5 2014
2
8
10
14 5 2014
7
1
10
15 5 2014 12
6
15
15 5 2014
3
10
10
15 5 2014
7
10
10
15 5 2014
7
9
10
15 5 2014
8
6
10
20 5 2014
2
6
10
20 5 2014 11
4
5
20 5 2014 11
3
15
20 5 2014 12
1
10
23 5 2014
5
2
10
23 5 2014
5
3
10
23 5 2014 10
3
20
25 5 2014
9
4
30

Donnons les schmas relationnels des 3 tables ci-dessus :

2.1.2

Interrogation dune table (ou dune relation)

Le language utilis ici est le laguage SQL (Structured Query Language)

2. ALGBRE RELATIONNELLE

10

La cration dune base de donnes (data base) nest pas au programme.


Linteraction avec les donnes dune base de donnes est au programme, elle se fait via un logiciel de
gestion des bases de donnes.
Un systme de gestion des bases de donnes doit permettre de manipuler les donnes dune base de
donnes ce qui signifie quil rend possible les oprations suivantes :
CREATE (ajouter des donnes et donc crer une base de donnes),
READ (interroger la base : slectionner et afficher des informations tires de la base),
UPDATE (modifier des donnes),
DELETE (supprimer des donnes).
Les messages envoys par un utilisateur au systme de gestion de le base de donne sont appels
requtes .

2.2

Algbre relationnelle

Nous allons prsenter formellement les oprations usuelles sur les relations dune base de donnes.

2.2.1

Projection (extraction de colonnes dune table)

Dfinition 2.2.1.
Soient (n, q) N 2 fixs tels que q < n.
Soient 1 6 i1 < . . . < iq 6 n.
Loprateur de projection sur les attributs dindices (i1 , . . . , iq ), not i1 ,...,iq , est lapplication
i1 ,...,iq

P(D1 . . . Dn )
P(Di1 . . . Diq )
R
7 {(t.atti1 , . . . , t.attiq ) | t R}

La table i1 ,...,iq (R) na pas le mme schma relationnel que R, elle possde q colonnes alors que R en
possde n (en gnral q < n).
La requte crite dans le language de mySQL correspondant la slection des colonnes correspondant
aux attributs att_i_1,...,t.att_i_q
SELECT att_i_1 , att_i_2 , ... , a t t _ i _ q
FROM N o m _ t a b l e

1. Dans le cas particulier o on souhaite afficher lintgralit dune table, il suffit de lancer une
requte dans laquelle on slectionne tous les attributs des lments de la table, ce qui peut se
faire
soit en numrant les n attributs 2 dune table de n colonnes :
SELECT att_1 , att_2 , ... , att_n
FROM N o m _ t a b l e

soit en utilisant le racourci * qui signifie tous les attributs :


SELECT *
FROM N o m _ t a b l e

2. On remarquera que lordre des attributs dans laffichage du rsultat de la requte correspond lordre des attributs
dans lcriture de la requte (voir lexemple 2.2.1)

2.2. Algbre relationnelle

11

2. Puisquune relation est une partie dun ensemble, dans une table, il ny a jamais deux lignes identiques. En revanche, loprateur de projection nest pas injectif ! deux lignes diffrentes peuvent,
aprs slection de certaines colonnes (et donc limination des colonnes correspondant aux attributs permettant de les diffrencier), donner le mme mme objet de lensemble darrive. Dans
le langage de lalgbre relationnelle, si deux lignes de la table de dpart ont une mme image,
cette image est prsente une unique fois dans la table image 3 . En revanche, dans le langage SQL,
au cours dune projection, les images sont rptes avec multiplicit, mais il est possible de demander de ne rpter quune seule fois chaque image en ajoutant le mot DISTINCT entre SELECT
et la liste des atributs conserver.
3. Lorsque des attributs de tables diffrentes Nom_table_1 et Nom_table_2 ont le mme nom att, la
slection de lattribut att de la table 1 se fait avec Nom_table_1.att et la slection de lattribut
att de la table 2 se fait avec Nom_table_2.att (voir lexemple 2.2.4 dans lequel se produit ce
phnomne lorsquil faut slection les attributs nom des tables Prof_maths et Prof_phys).
Exemples 2.2.1.
Considrons les relations de la base de donnes Fruits_d_ete.
Slectionnons laffichage intgral de la table Clients.
En algbre relationnelle, cest la projection sur tous les attributs :
id, nom, ville_livraison, departement, courriel (Clients)
mysql > SELECT *
-> FROM C l i e n t s;
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+
| id | nom
| ville_livraison | departement | courriel
|
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+
| 1 | PLANES
| Gaillac
|
81 | t o t o p l a n @ l a p o s t e . net
|
| 2 | FAURE
| Carcassonne
|
11 | f a u r e p i @ f r e e . fr
|
| 3 | BOUTY
| Agen
|
47 | a b o u t y @ v o i l a . fr
|
| 4 | LAVIRON
| Toulouse
|
31 | t i t i l a v i r o n @ v o i l a . fr
|
| 5 | LEONARDI
| Toulouse
|
31 | l e o n a r d i m a i n @ v o i l a . fr
|
| 6 | PECATTE
| Castres
|
81 | b p 4 @ l a p o s t e. net
|
| 7 | SOLE - P O M M I E S | Revel
|
31 | h k f o r e v e r @ v o i l a . fr
|
| 8 | CERDA
| Albi
|
81 | r e m y z e r d a @ f r e e . fr
|
| 9 | JAUROU
| Castres
|
81 | z i z o u m y d r e a m @ l a p o s t e . net |
| 10 | PRENAT - VILLE | G a i l l a c
|
81 | c l e m 8 1 @ l a p o s t e . net
|
| 11 | C H A R R I E R
| Pamiers
|
9 | s o l d a t f a u p a @ l a p o s t e . net |
| 12 | B R O U H A R D
| Pamiers
|
9 | t b @ f r e e. fr
|
| 13 | T H I E Y R E
| Brive
|
19 | b i n o m p m o i n s 1 6 @ f r e e . fr
|
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+

Slectionnons la liste des identifiants et des noms des clients.


En algbre relationnelle, cest la projection sur les attributs id, nom :
id, nom (Clients)
mysql > SELECT id , nom
-> FROM C l i e n t s;
+ -- - -+ - - - - - - - - - - - - - -+
| id | nom
|
+ -- - -+ - - - - - - - - - - - - - -+
3. En particulier, cela signifie que le nombre de lignes de la table image peut tre strictement infrieur au nombre de
lignes de la table de dpart.

2. ALGBRE RELATIONNELLE

12
| 1 | PLANES
|
| 2 | FAURE
|
| 3 | BOUTY
|
| 4 | LAVIRON
|
| 5 | LEONARDI
|
| 6 | PECATTE
|
| 7 | SOLE - P O M M I E S |
| 8 | CERDA
|
| 9 | JAUROU
|
| 10 | PRENAT - VILLE |
| 11 | C H A R R I E R
|
| 12 | B R O U H A R D
|
| 13 | T H I E Y R E
|
+ -- - -+ - - - - - - - - - - - - - -+

Si nous souhaitons obtenir la table ci-dessus mais en disposant des noms des clients dans la
premire colonne et de leurs identifiants dans la seconde, il suffit de permuter lordre des attributs
slectionner dans lcriture de la requte, cest la projection sur les attributs nom, id :
nom, id (Clients)
mysql > SELECT nom , id
-> FROM C l i e n t s;
+ -- - - - - - - - - - - - -+ - - - -+
| nom
| id |
+ -- - - - - - - - - - - - -+ - - - -+
| PLANES
| 1 |
| FAURE
| 2 |
| BOUTY
| 3 |
| LAVIRON
| 4 |
| LEONARDI
| 5 |
| PECATTE
| 6 |
| SOLE - P O M M I E S | 7 |
| CERDA
| 8 |
| JAUROU
| 9 |
| PRENAT - VILLE | 10 |
| CHARRIER
| 11 |
| BROUHARD
| 12 |
| THIEYRE
| 13 |
+ -- - - - - - - - - - - - -+ - - - -+

Slectionnons la liste des noms, des courriers lectroniques et des villes de livraison des clients.
En algbre relationnelle, cest une projection sur les attributs nom, courriel, ville_livraison :
nom, courriel, ville_livraison(Clients)
mysql > SELECT nom , courriel , v i l l e _ l i v r a i s o n
-> FROM C l i e n t s;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| nom
| courriel
| ville_livraison |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| PLANES
| t o t o p l a n @ l a p o s t e . net
| Gaillac
|
| FAURE
| f a u r e p i @ f r e e . fr
| Carcassonne
|
| BOUTY
| a b o u t y @ v o i l a . fr
| Agen
|
| LAVIRON
| t i t i l a v i r o n @ v o i l a . fr
| Toulouse
|
| LEONARDI
| l e o n a r d i m a i n @ v o i l a . fr
| Toulouse
|
| PECATTE
| b p 4 @ l a p o s t e . net
| Castres
|
| SOLE - P O M M I E S | h k f o r e v e r @ v o i l a . fr
| Revel
|

2.2. Algbre relationnelle

13

| CERDA
| r e m y z e r d a @ f r e e . fr
| Albi
|
| JAUROU
| z i z o u m y d r e a m @ l a p o s t e . net | C a s t r e s
|
| PRENAT - VILLE | c l e m 8 1 @ l a p o s t e . net
| Gaillac
|
| CHARRIER
| s o l d a t f a u p a @ l a p o s t e . net | P a m i e r s
|
| BROUHARD
| t b @ f r e e. fr
| Pamiers
|
| THIEYRE
| b i n o m p m o i n s 1 6 @ f r e e . fr
| Brive
|
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+

Slectionnons les diffrents fruits proposs.


En algbre relationnelle, cest une projection sur lattribut fruit :
fruit (Stock)
mysql > SELECT fruit
-> FROM Stock ;
+ -- - - - - - - -+
| fruit
|
+ -- - - - - - - -+
| fraises |
| fraises |
| fraises |
| fraises |
| fraises |
| fraises |
| cerises |
| cerises |
| cerises |
| cerises |
+ -- - - - - - - -+

Le rsultat ne correspond pas celui de lopration fruit(Stock) qui est une table donc une partie
dun ensemble donc toutes les lignes sont distinctes deux deux.
La requte correspondante est
mysql > SELECT D I S T I N C T fruit
-> FROM Stock ;
+ -- - - - - - - -+
| fruit
|
+ -- - - - - - - -+
| fraises |
| cerises |
+ -- - - - - - - -+

Slectionnons la listes des fruits et des diffrentes varits proposes pour chacun deux.
En algbre relationnelle, cest une projection sur les attributs fruit, variete :
fruit, variete (Stock)
mysql > SELECT D I S T I N C T fruit , v a r i e t e
-> FROM Stock ;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fruit
| variete
|
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fraises | gariguette
|
| f r a i s e s | a n d a l o u s e d hiver |
| f r a i s e s | mara des bois
|
| fraises | charlotte
|
| c e r i s e s | burlat
|

2. ALGBRE RELATIONNELLE

14
| c e r i s e s | coeur de pigeon
|
| cerises | napoleon
|
+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

Observons pour confirmation ce que donne la mme requte sans DISTINCT :


mysql > SELECT fruit , v a r i e t e
-> FROM Stock ;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fruit
| variete
|
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fraises | gariguette
|
| fraises | gariguette
|
| fraises | gariguette
|
| f r a i s e s | a n d a l o u s e d hiver |
| f r a i s e s | mara des bois
|
| fraises | charlotte
|
| c e r i s e s | burlat
|
| c e r i s e s | burlat
|
| c e r i s e s | coeur de pigeon
|
| cerises | napoleon
|
+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

2.2.2

Slection (extraction de lignes dune table)

Dfinition 2.2.2.
Soit P un prdicat dfini sur le produit cartsien D1 . . . Dn ce qui signifie que, pour tout t
D1 . . . Dn , P (t) est soit vrai, soit faux.
Loprateur de slection selon le critre de slection P , not P , est lapplication
P

P(D1 . . . Dn ) P(D1 . . . Dn )
R
7
{t R | P (t)}

P (R) est donc une table qui possde le mme schma relationnel que R.
La requte crite dans le language de mySQL correspondant la slection de ligne est
SELECT *
FROM N o m _ t a b l e
WHERE c r i t e r e _ d e _ s e l e c t i o n _ p o r t a n t _ s u r _ l e s _ a t t r i b u t s ;

1. Le symbole * signifie tous les attributs , il est remplac par la liste des attributs prcis que
lon veut slectionner lorsque lon souhaite effectuer une projection la suite dune slection (ce
qui correspond une composition doprateurs dans lalgbre relationnelle).
2. Lorsque lexpression du critere_de_selection_portant_sur_les_attributs ncessite lusage
des oprateurs logiques usuels, il faut les transcrire dans le langage mySQL avec les correspondances naturelles suivantes
oprateur logique syntaxe mySQL
ou
OR
et
AND

3. En labsence de critre de slection, la requte

2.2. Algbre relationnelle

15

SELECT *
FROM N o m _ t a b l e;

provoque laffichage de la table dans son intgralit.


Exemples 2.2.2.
Considrons les relations de la base de donnes Fruits_d_ete.
1. Oprations de slection seule.
Affichons la table Stock.

mysql > SELECT *


-> FROM Stock ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |
| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |
| 5 | f r a i s e s | mara des bois
| barquette
| 0.250 |
53 | France |
| 6 | fraises | charlotte
| barquette
| 0.250 |
0 | France |
| 7 | c e r i s e s | burlat
| cagette
| 2.000 |
48 | France |
| 8 | c e r i s e s | burlat
| cagette
| 5.000 |
0 | Espagne |
| 9 | c e r i s e s | coeur de pigeon
| cagette
| 2.000 |
15 | France |
| 10 | c e r i s e s | n a p o l e o n
| cagette
| 5.000 |
13 | France |
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
10 rows in set (0.00 sec )

Slectionnons les diffrents lots proposs dorigine espagnole.


En algbre relationnelle, lopration est :
origine = espagne (Stock)

mysql > SELECT *


-> FROM Stock
-> WHERE o r i g i n e = e s p a g n e ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |
| 8 | c e r i s e s | burlat
| cagette
| 5.000 |
0 | Espagne |
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+

Slectionnons les diffrentes lots de fraises.


En algbre relationnelle, lopration est :
fruit = fraises (Stock)

mysql > SELECT *


-> FROM Stock
-> WHERE fruit = f r a i s e s ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |

16

2. ALGBRE RELATIONNELLE

| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |
| 5 | f r a i s e s | mara des bois
| barquette
| 0.250 |
53 | France |
| 6 | fraises | charlotte
| barquette
| 0.250 |
0 | France |
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+

Slectionnons les diffrentes lots de fraises gariguette.


En algbre relationnelle, lopration est :
fruit = fraises et variete = gariguette (Stock)
mysql > SELECT *
-> FROM Stock
-> WHERE fruit = f r a i s e s AND v a r i e t e = g a r i g u e t t e ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette | barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette | barquette
| 0.500 |
44 | France |
| 3 | fraises | gariguette | cagette
| 2.000 |
39 | France |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+

Slectionnons les diffrents lots de fraises disponibles en barquettes.


En algbre relationnelle, lopration est :
fruit = fraise et conditionnement = barquette (Stock)
mysql > SELECT *
-> FROM Stock
-> WHERE fruit = f r a i s e s AND c o n d i t i o n n e m e n t = b a r q u e t t e ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |
| 5 | f r a i s e s | mara des bois | b a r q u e t t e
| 0.250 |
53 | France |
| 6 | fraises | charlotte
| barquette
| 0.250 |
0 | France |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
4 rows in set (0.00 sec )

Slectionnons les diffrents lots de fruits franais vendus en quantits comprises au sens large
entre 250g et 2kg.
En algbre relationnelle, lopration est :
origine = france et poids >= 0.25 et poids <= 2 (Stock)
mysql > SELECT *
-> FROM Stock
-> WHERE o r i g i n e = France AND poids >= 0.25 AND poids <= 2 ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |
| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 5 | f r a i s e s | mara des bois
| barquette
| 0.250 |
53 | France |
| 6 | fraises | charlotte
| barquette
| 0.250 |
0 | France |
| 7 | c e r i s e s | burlat
| cagette
| 2.000 |
48 | France |
| 9 | c e r i s e s | coeur de pigeon | c a g e t t e
| 2.000 |
15 | France |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+

2.2. Algbre relationnelle

17

Slectionnons les produits qui sont conditionns en cagettes ou dont le stock compte, au sens
large, plus dune cinquantaine dunits.
En algbre relationnelle, lopration est :
conditionnement = cagette ou quantite >= 50 (Stock)

mysql > SELECT *


-> FROM Stock
-> WHERE c o n d i t i o n n e m e n t = c a g e t t e OR q u a n t i t e >= 50 ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |
| 5 | f r a i s e s | mara des bois
| barquette
| 0.250 |
53 | France |
| 7 | c e r i s e s | burlat
| cagette
| 2.000 |
48 | France |
| 8 | c e r i s e s | burlat
| cagette
| 5.000 |
0 | Espagne |
| 9 | c e r i s e s | coeur de pigeon
| cagette
| 2.000 |
15 | France |
| 10 | c e r i s e s | n a p o l e o n
| cagette
| 5.000 |
13 | France |
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+

Dressons la liste des commandes passes avant le 14 mai 2014 au soir.


En algbre relationnelle, lopration est :
date < 2014-05-15 (Commantdes)

ou

date <= 2014-05-14 (Commandes)

mysql > SELECT *


-> FROM C o m m a n d e s
-> WHERE date < 2014 -05 -15;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 1 | 2014 -05 -10 | 2
|
4 |
10 |
| 2 | 2014 -05 -10 | 6
|
3 |
20 |
| 3 | 2014 -05 -12 | 2
|
7 |
5 |
| 4 | 2014 -05 -12 | 2
|
8 |
10 |
| 5 | 2014 -05 -14 | 7
|
1 |
10 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT *
-> FROM C o m m a n d e s
-> WHERE date <= 2014 -05 -14;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 1 | 2014 -05 -10 | 2
|
4 |
10 |
| 2 | 2014 -05 -10 | 6
|
3 |
20 |
| 3 | 2014 -05 -12 | 2
|
7 |
5 |
| 4 | 2014 -05 -12 | 2
|
8 |
10 |
| 5 | 2014 -05 -14 | 7
|
1 |
10 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+

Dressons la liste des commandes passes entre le 13 mai 2014 au matin et le 20 mai 2014 au
soir.
En algbre relationnelle, lopration est :
date < 2014-05-21 et date > 2014-05-12 (Commantdes)

2. ALGBRE RELATIONNELLE

18

mysql > SELECT *


-> FROM C o m m a n d e s
-> WHERE date < 2014 -05 -21 AND date > 2014 -05 -12;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 5 | 2014 -05 -14 | 7
|
1 |
10 |
| 6 | 2014 -05 -15 | 12
|
6 |
15 |
| 7 | 2014 -05 -15 | 3
|
10 |
10 |
| 8 | 2014 -05 -15 | 7
|
10 |
10 |
| 9 | 2014 -05 -15 | 7
|
9 |
10 |
| 10 | 2014 -05 -15 | 8
|
6 |
10 |
| 11 | 2014 -05 -20 | 2
|
6 |
10 |
| 12 | 2014 -05 -20 | 11
|
4 |
5 |
| 13 | 2014 -05 -20 | 11
|
3 |
15 |
| 14 | 2014 -05 -20 | 12
|
1 |
10 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+

2. Composition de slections et de projections


Slectionnons les diffrentes varits de fraises disponibles.
En algbre relationnelle, lopration est la compose dune slection et dune projection :


variete fruit = fraise(Stock)


mysql > SELECT D I S T I N C T v a r i e t e
-> FROM Stock
-> WHERE fruit = f r a i s e s ;
+ -- - - - - - - - - - - - - - - - - -+
| variete
|
+ -- - - - - - - - - - - - - - - - - -+
| gariguette
|
| a n d a l o u s e d hiver |
| mara des bois
|
| charlotte
|
+ - - - - - - - - - - - - - - - - - - -+

Slectionnons les diffrentes varits de cerises proposes en donnant chaque fois leur mode
de conditionnement et le poids correspondant.
En algbre relationnelle, lopration est la compose dune slection et dune projection :


variete, conditionnement, poids fruit = cerise (Stock)


mysql > SELECT D I S T I N C T variete , c o n d i t i o n nem ent , poids
-> FROM Stock
-> WHERE fruit = c e r i s e s ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+
| variete
| c o n d i t i o n n e m e n t | poids |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+
| burlat
| cagette
| 2.000 |
| burlat
| cagette
| 5.000 |
| coeur de pigeon | c a g e t t e
| 2.000 |
| napoleon
| cagette
| 5.000 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+

2.2. Algbre relationnelle

19

Slectionnons les diffrentes varits de fruits proposs dans des barquettes de 250g.
En algbre relationnelle, lopration est la compose dune slection et dune projection :


fruit, variete (conditionnement = barquette) et (poids = 0.25) (Stock)

mysql > SELECT fruit , v a r i e t e


-> FROM Stock
-> WHERE ( c o n d i t i o n n e m e n t = b a r q u e t t e AND poids = 0.25) ;
+ -- - - - - - - -+ - - - - - - - - - - - - - - -+
| fruit
| variete
|
+ -- - - - - - - -+ - - - - - - - - - - - - - - -+
| fraises | gariguette
|
| f r a i s e s | mara des bois |
| fraises | charlotte
|
+ -- - - - - - - -+ - - - - - - - - - - - - - - -+

Slectionnons les diffrentes varits de fruits proposs dans cagettes de 2 kg.


En algbre relationnelle, lopration est la compose dune slection et dune projection :


fruit, variete (conditionnement = cagette) et (poids = 2) (Stock)


mysql > SELECT fruit , v a r i e t e
-> FROM Stock
-> WHERE ( c o n d i t i o n n e m e n t = c a g e t t e AND poids = 2) ;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fruit
| variete
|
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| fraises | gariguette
|
| f r a i s e s | a n d a l o u s e d hiver |
| c e r i s e s | burlat
|
| c e r i s e s | coeur de pigeon
|
+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

Slectionnons la quantit de cerises burlat franaise en stock.


En algbre relationnelle, lopration est :


quantite fruit = cerise et variete = burlat et origine = france (Stock)

mysql > SELECT q u a n t i t e


-> FROM Stock
-> WHERE fruit = c e r i s e s AND v a r i e t e = burlat AND o r i g i n e = france ;
+ -- - - - - - - - -+
| quantite |
+ -- - - - - - - - -+
|
48 |
+ -- - - - - - - - -+

On peut noter que la requte ci-dessus rpond la question car il ny a quun seul couple
(conditionnement, poids) possible pour les cerises burlat franaises.
En effet, si on effectue la requte


quantite fruit = fraise et variete = gariguette et origine = france (Stock)

destine connatre la quantit de cerises gariguette franaise en stock, on obtient comme


rsultat :

2. ALGBRE RELATIONNELLE

20

mysql > SELECT q u a n t i t e


-> FROM Stock
-> WHERE fruit = f r a i s e s AND v a r i e t e = g a r i g u e t t e AND o r i g i n e = france ;
+ -- - - - - - - - -+
| quantite |
+ -- - - - - - - - -+
|
125 |
|
44 |
|
39 |
+ -- - - - - - - - -+

Cela ne correspond pas la quantit totale de lots de fraises gariguette franaises disponibles ! La raison est simple, cest que la slection choisie sur les attributs fruits, varit et
origine donne une table qui compte 3 lignes et non une seule comme dans le cas prcdent.
Pour effectuer ce que lon souhaite, il faut raliser la somme des trois nombre des 3 lignes
de la table obtenue ci-dessus. Pour cela, il faut connatre la notion dagrgation et utiliser
la fonction dagrgation SUM (voir le paragraphe 2.5 et les exemples 2.7).

2.2.3

Oprations ensemblistes : union, intersection, diffrence

Dfinition 2.2.3.
Soient R et R deux relations de mme schma relationnel :
R(att1 : D1 , att2 : D2 , . . . , attp : Dn ) = R (att1 : D1 , att2 : D2 , . . . , attp : Dn ) .
La runion des relations R et R est la relation note R R , de mme schma relationnel
que R et R obtenue en ralisant lunion des deux parties de P(D1 . . . Dn ) correspondant R
et R :
R R = {s P(D1 . . . Dn ) | t R : s = t ou t R : s = t }
= {s P(D1 . . . Dn ) | s R ou s R }
La requte crite dans le language de mySQL correspondant la runion des relations Nom_table_1
et Nom_table_2 est
SELECT * FROM N o m _ t a b l e _ 1
UNION
SELECT * FROM N o m _ t a b l e _ 2

Lintersection des relations R et R est la relation note R R , de mme schma relationnel


que R et R obtenue en ralisant lintersection des deux parties de P(D1 . . . Dn ) correspondant
R et R :
R R = {s P(D1 . . . Dn ) | (t, t ) R R : s = t et s = t }
= {s P(D1 . . . Dn ) | s R et s R }
La requte crite dans le language de mySQL correspondant lintersection des relations Nom_table_1
et Nom_table_2 est
SELECT * FROM N o m _ t a b l e _ 1
INTERSECT
SELECT * FROM N o m _ t a b l e _ 2

2.2. Algbre relationnelle

21

La diffrence des relations R et R est la relation note R \ R , de mme schma relationnel


que R et R obtenue en ralisant la diffrence des deux parties de P(D1 . . . Dn ) correspondant
R et R :
R \ R = {s P(D1 . . . Dn ) | s R et s
/ R }
La requte crite dans le language de mySQL correspondant la diffrence de la relation Nom_table_1
et de la relation Nom_table_2 est
SELECT * FROM N o m _ t a b l e _ 1
EXCEPT
SELECT * FROM N o m _ t a b l e _ 2

Exemples 2.2.3.
Considrons les relations de la base de donnes Fruits_d_ete.

2.2.4

Produit cartsien de tables

Dfinition 2.2.4.
Soient (n, n ) N2 fixs, D1 , . . . , Dn , D1 , . . . , Dn n + n ensembles.
Soient R et R deux relations de schmas respectifs R(att1 : D1 , att2 : D2 , . . . , attn : Dn ) et
R (att1 : D1 , att2 : D2 , . . . , attn : Dn ).
Le produit cartsient des tables R et R est la tables note R R , de schma
R R (att1 : D1 , att2 : D2 , . . . , attn : Dn , att1 : D1 , att2 : D2 , . . . , attn : Dn )
dont une description formelle est
R R = {(t, t ) | t R , t R }
Remarque 2.2.4.1.
Le nombre de colonnes de R R est n + n (somme des nombres de colonnes de R et R ) tandis que
le nombre de lignes de R R est le produit du nombre de lignes de R par le nombre de lignes de R .
La requte permettant de raliser le produit cartsien des tables Nom_table1 et Nom_table2 est
SELECT *
FROM Nom_table1 , N o m _ t a b l e 2

Exemple 2.2.1.
Utilisons la base de donnes MPSI_Fermat compose des tables ClassesMP, Prof_maths et Prof_phys.
mysql > SELECT *
-> FROM C l a s s e s M P;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | MPSI -1
|
47 |
| 2 | MPSI -2
|
46 |
| 3 | MPSI -3
|
44 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT *
-> FROM P r o f _ m a t h s;
+ -- - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - -+ - - - - - - - -+

2. ALGBRE RELATIONNELLE

22
| M . Ginoux
| MPSI -2 |
| Mme Rhin
| PCSI -1 |
| Mme Cohen
| MPSI -3 |
| M . Bayle
| MPSI -1 |
| M . C h a t e l a i n | PCSI -2 |
+ -- - - - - - - - - - - - -+ - - - - - - - -+
mysql > SELECT *
-> FROM P r o f _ p h y s;
+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| M. BERNARD
| PCSI -1 |
| Mme G O U T E L A R D | MPSI -2 |
| M. GAILLARD
| MPSI -1 |
| M . VIGNON
| PCSI -2 |
| M . SALOME
| MPSI -3 |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+

Effectuons le produit cartsien des tables ClassesMP et Prof_maths :


ClassesMP Prof_maths
mysql > SELECT *
-> FROM ClassesMP , P r o f _ m a t h s ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e | nom
| classe |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - -+
| 1 | MPSI -1
|
47 | M . Ginoux
| MPSI -2 |
| 2 | MPSI -2
|
46 | M . Ginoux
| MPSI -2 |
| 3 | MPSI -3
|
44 | M . Ginoux
| MPSI -2 |
| 1 | MPSI -1
|
47 | Mme Rhin
| PCSI -1 |
| 2 | MPSI -2
|
46 | Mme Rhin
| PCSI -1 |
| 3 | MPSI -3
|
44 | Mme Rhin
| PCSI -1 |
| 1 | MPSI -1
|
47 | Mme Cohen
| MPSI -3 |
| 2 | MPSI -2
|
46 | Mme Cohen
| MPSI -3 |
| 3 | MPSI -3
|
44 | Mme Cohen
| MPSI -3 |
| 1 | MPSI -1
|
47 | M . Bayle
| MPSI -1 |
| 2 | MPSI -2
|
46 | M . Bayle
| MPSI -1 |
| 3 | MPSI -3
|
44 | M . Bayle
| MPSI -1 |
| 1 | MPSI -1
|
47 | M . C h a t e l a i n | PCSI -2 |
| 2 | MPSI -2
|
46 | M . C h a t e l a i n | PCSI -2 |
| 3 | MPSI -3
|
44 | M . C h a t e l a i n | PCSI -2 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - -+
15 rows in set (0.00 sec )

Comme prvu ce produit cartsien compte 3 5 = 15 lignes et elles nont en gnral aucun intrt !
En fait, les lignes pertinentes de ce produit cartsien sont celles pour lesquelle lattribut
nom_classe de la table ClassesMP concide avec lattribut classe de la table Prof_maths ce qui
suggre la slection suivante
ClassesMP.nom_classe = Prof_maths.classe(ClassesMP Prof_maths)
mysql > SELECT *
-> FROM ClassesMP , P r o f _ m a t h s
-> WHERE C l a s s e s M P. n o m _ c l a s s e = P r o f _ m a t h s. classe ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e | nom
| classe |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - -+
| 2 | MPSI -2
|
46 | M . Ginoux | MPSI -2 |

2.2. Algbre relationnelle

23

| 3 | MPSI -3
|
44 | Mme Cohen | MPSI -3 |
| 1 | MPSI -1
|
47 | M . Bayle | MPSI -1 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - -+

Pour obtenir une belle table indiquant pour chque classe le nombre dlves et le nom du professeur
de mathmatique, il suffit de faire une projection sur les attributs correspondants :


nom_classe,nom,nb_eleve ClassesMP.nom_classe = Prof_maths.classe (ClassesMP Prof_maths)


mysql > SELECT nom_classe , nom , n b _ e l e v e
-> FROM ClassesMP , P r o f _ m a t h s
-> WHERE C l a s s e s M P. n o m _ c l a s s e = P r o f _ m a t h s. classe ;
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+
| n o m _ c l a s s e | nom
| nb_eleve |
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+
| MPSI -2
| M . Ginoux |
46 |
| MPSI -3
| Mme Cohen |
44 |
| MPSI -1
| M . Bayle |
47 |
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - -+

Comment obtenir la table des classes de MPSI avec le nom de leur professeur de mathmatique et
celui de leur professeur de physique ?
Avec le formalisme de lalgbre relationnelle, on veut


nom_classe, Prof_maths.nom, Prof_phys.nom

ClassesMP.nom_classe = Prof_maths.classe
et ClassesMP.nom_classe = Prof_phys.classe

(ClassesMPProf_mathsProf_phys)

mysql > SELECT nom_classe , P r o f _ m a t h s. nom , P r o f _ p h y s . nom


-> FROM ClassesMP , Prof_maths , P r o f _ p h y s
-> WHERE C l a s s e s M P. n o m _ c l a s s e = P r o f _ m a t h s. classe
->
AND C l a s s e s M P. n o m _ c l a s s e = P r o f _ p h y s. classe ;
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| n o m _ c l a s s e | nom
| nom
|
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| MPSI -2
| M . Ginoux | Mme G O U T E L A R D |
| MPSI -1
| M . Bayle | M . G A I L L A R D
|
| MPSI -3
| Mme Cohen | M . SALOME
|
+ -- - - - - - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

et ensuite comment on accde aux atributs ? problme des noms ?


Exemples 2.2.4.
Considrons la table Fruits_d_ete.
1. Dresser la liste des commandes dont la livraison se fait dans le Tarn.

mysql > SELECT *


-> FROM Commandes , C l i e n t s
-> WHERE client = C l i e n t s. id AND d e p a r t e m e n t = 81 ;
+ -- -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+ - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+

| id | date
| client | p r o d u i t | q u a n t i t e | id | nom
|
ville_livraison | departement | courriel
|
+ -- -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+ - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
|

2 | 2014 -05 -10 | 6


|
3 |
|
81 | b p 4 @ l a p o s t e. net

20 |

6 | PECATTE
|

| Castres

2. ALGBRE RELATIONNELLE

24

| 10 | 2014 -05 -15 | 8


|
6 |
10 | 8 | CERDA
| Albi
|
81 | r e m y z e r d a @ f r e e . fr
|
| 17 | 2014 -05 -23 | 10
|
3 |
20 | 10 | PRENAT - VILLE | G a i l l a c
|
81 | c l e m 8 1 @ l a p o s t e . net
|
| 18 | 2014 -05 -25 | 9
|
4 |
30 | 9 | JAUROU
| Castres
|
81 | z i z o u m y d r e a m @ l a p o s t e . net |
+ -- -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+ - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+

2. Dresser la liste des dates de commande, client, ville de livraison des commantes dont la livraison
se fait dans le Tarn .
mysql > SELECT date , nom , v i l l e _ l i v r a i s o n
-> FROM Commandes , C l i e n t s
-> WHERE client = C l i e n t s. id AND d e p a r t e m e n t = 81 ;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| date
| nom
| ville_livraison |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| 2014 -05 -10 | P E C A T T E
| Castres
|
| 2014 -05 -15 | CERDA
| Albi
|
| 2014 -05 -23 | PRENAT - VILLE | G a i l l a c
|
| 2014 -05 -25 | JAUROU
| Castres
|
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+

3. Dresser la liste des commandes dont la livraison se fait en Haute Garonne.


4. Dresser la liste des commandes dont la livraison se fait en dehors du Tarn et de la Haute-Garonne.
5. Dterminer le nombre de commandes de fraises gariguette franaises en cagette de 2kg.
6. Dterminer le nombre total de cagettes e 2kg de fraises gariguette franaises qui ont t commandes.
7. Crer la table des clients ainsi que le nombre de commandes quils ont passes.
8. Crer la table des clients ainsi que le poids total de fruit quils ont commands.
9. Dresser la liste des commandes de fruits en cagettes.
Calculer le total des versements du client M. BOUTY au ngociant de fruits en 2013.
Calculer le montant total du relev mensuel envoy chaque client pour le mois de mai 2014 (slection
de la date)
ajouter une table prix ! !
Ide ajouter un attribut prix dans table Stock et demander le calcul des prix payer par chaque client
(sachant quun client passe autant de commandes quil veut de produit distinct de la table stock)

2.2.5

Jointure

Dfinition 2.2.5.
Une jointure est une opration qui ncessite deux tables R, R et qui rsulte de laction successive
de deux oprateurs : dabord un produit cartsien des deux tables puis ensuite une slection sur la
table R R partir du critre de slection P .
La relaion obtenue est note R R
RP R = P (R R )
Exemple 2.2.2.

2.3.

25

2.3
Une cl de T est
Une cl primaire de T
Un identifiant de T est une cl primaire forme dun seul attribut (en gnral, cet attribut porte le
nom id).
Une cl trangre de T est un attribut de T dont le domaine est lensemble des identifiants dune
autre table.

2.4

Interrogation de plusieurs tables

mais sans utiliser la notion de cl...

2. ALGBRE RELATIONNELLE

26

2.5

Agrgation

Le concept dagrgation permet de raliser une partition de lensemble des lignes dune relation R
(chaque lment de la partition constitue un agrgat) au moyen dun certain critre portant sur les
attributs de la relation pour ensuite effectuer une mme opration sur chacun des agrgats.

2.5.1

Formalisme de lalgbre relationnelle

Dfinition 2.5.1.
Considrons
R une relation de schma (att1 : D1 , att2 : D2 , . . . , attn : Dn ),
p et q deux entiers naturels de [[0, n]],
atti1 , . . ., attip , p attributs distincts de la relation R (on a donc 1 6 i1 < . . . < ip 6 n),
attj1 , . . ., attjq , q attributs distincts de la relation R (on a donc 1 6 j1 < . . . < jq 6 n),
f1 , . . ., fq , q fonctions (appeles fonctions dagrgation).
On note atti1 ,...,attip f1 (attj1 ),...,fq (attjq ) (R) la relation dont
les lignes correspondent aux classes dquivalence (appeles agrgats) qui partitionnent lensemble
des lignes de R pour la relation dquivalence i1 ,...,ip suivante :
(x, x ) R2 , x i1 ,...,ip x k [[1, p]] , x.attik = x .attik
ce qui signifie que deux lignes sont en relation si et seulement si leurs attributs atti1 , . . ., attip sont
identiques.
Notons alors N le nombre dagrgats obtenus. N est le nombre de lignes de la table qui rsulte de
lopration dagrgation.
Listons ces agrgats A1 , . . ., AN et notons a1 , . . ., aN leurs cardinaux respectifs.
les colonnes sont au nombre de q : pour tout k [[1, q]] et tout i [[1, N]], la valeur de lattribut
de la colonne dindice k pour la ligne correspondant lagrgat Ai est gale lvaluation de la
fonction fk en le ai -uplet constitu par les valeurs de lattribut attjk des lments de lagrgat Ai.
Par exemple,
lattribut f1 (attj1 ) de llment Ai est lvaluation de f1 en le ai -uplet constitu par les valeurs
des attributs attj1 des ai lignes de R qui constituent lensemble Ai ,
lattribut f2 (attj2 ) de llment Ai est lvaluation de f2 en le ai -uplet constitu par les valeurs
de lattribut attj2 des ai lignes de R qui constituent lensemble Ai ,
...
On peut reprsenter la table

atti1 ,...,attip f1 (attj1 ),...,fq (attjq ) (R)

par le tableau ci-dessous :

agrgat caractris par


f1 (attj1 )
les valeurs de (atti1 , . . . , attip )
A1
f1 ({x.attj1 |x A1 })
A2
f1 ({x.attj1 |x A2 })
..
...
.
AN
f1 ({x.attj1 |x AN })

...

fq (attjq )

. . . fq ({x.attjq |x A1 })
. . . fq ({x.attjq |x A2 })
..
.
. . . fq ({x.attjq |x AN })

Remarques 2.5.1.1.
1. Si p = 0 et q > 1, il ny a quune seule classe dquivalence (car la condition pour que deux lignes
soient en relation est vide donc toujours satisfaite), donc un seul agrgat donc f1 (attj1 ),...,fq (attjq ) (R)
est la relation une seule ligne et q colonnes obtenue en valuant les fonctions fk pour k [[1, q]]
en le m-uplet constitu par les valeurs de lattribut attjk dans les m lignes de la table R.

2.5. Agrgation

27

2. Si p = n (cest dire si p est gal au nombre dattributs de R) et q > 1, alors il y a autant de


classes dquivalences que de lignes de la relation si bien que att1 ,...,attn f1 (attj1 ),...,fq (attjq ) (R) est la
relation dont les lignes correspondent aux lments de R : llment t R, donne un lment de
att1 ,...,attn f1 (attj1 ),...,fq (attjq ) (R) dont lattribut dindice k [[1, q]] a pour valeur fk (t.attjk ).
3. Si p > 1 et q = 0, atti1 ,...,attip (R) est la relation de mme schma relationnel que R obtenue en
partitionnant les lignes de R laide de la relation dquivalence suivante : deux lignes sont en
relation si et seulement si leurs attributs atti1 , . . ., attip sont identiques.
Remarque 2.5.1.1.
Les lignes dune table ntant pas ordonnes, lors de la ralisation dune opration dagrgation, les
lments de la table R initiale ne sont pas ordonns, donc en tant qulments de lagrgat auquel ils
appartiennent, il ne sont pas ordonns non plus. Cela signifie que pour un agrgat de cardinal a N ,
il existe au plus 4 a! a-uplets possibles partir des a valeurs (non ncessairement distinctes) prises par
lattribut attj sur les lments de lagrgat. Or la dfinition 2.5.1 ci-dessus ne prcise pas lequel il faut
choisir. En fait, ce choix na aucune importance car une fonction dagrgation est symtrique : elle
prend la mme valeur sur les k! k-uplets obtenus en considrant tous les arrangements possibles de k
nombres rels fixs (voir le tableau des fonctions dagrgations dans le paragraphe 2.5.2).

2.5.2

Fonctions dagrgation dans le langage SQL

Nous utiliserons les fonctions dagrgation suivantes dfinies sur lensemble de tous les k-uplets de
nombres rels lorsque k parcourt N que lon notera U :
U=

Rk =

kN

{(v1 , . . . , vk ) | v1 R, . . . , vk R}

kN

fonction
U
7 N
comptage :
(v1 , . . . , vk ) 7 k
U

R
max :
(v1 , . . . , vk ) 7 max{v1 , . . . , vk }
U

R
min :
(v1 , . . . , vk ) 7 min{v1 , . . . , vk }
U

R
X
1 k
moyenne :
vi
(v1 , . . . , vk ) 7
k i=1
U

R
k
X
somme :
(v1 , . . . , vk ) 7
vi

Syntaxe SQL

valeur renvoye par la fonction

COUNT

le cardinal du k-uplet

MAX

le plus grand lment du k-uplet

MIN

le plus petit lment du k-uplet

AVG

la moyenne arithmtique des lments du k-uplet

SUM

la somme des lments du k-uplet

i=1

4. En effet, les lignes de la table R sont deux deux distinctes, mais au sein dun agrgat donn, certaines lignes peut
avoir des attributs gaux.

2. ALGBRE RELATIONNELLE

28

Soit R une relation de schma relationnel R(att1 : D1 , att2 : D2 , . . . , attn : Dn ).


formalisme de lagrgation
dans lalgbre relationnelle

syntaxe mySQL
en notant nom_table le nom de la table R

att1 ,...,attn f1 (attj1 ),...,fq (attjq ) (R)

SELECT * , f_1 ( a t t _ j _ 1) , f_2 ( a t t _ j _ 2) , ... , f_q ( a t t _ j _ q)


FROM n o m _ t a b l e

f1 (attj1 ),...,fq (attjq ) (R)

SELECT * , f_1 ( a t t _ j _ 1) , f_2 ( a t t _ j _ 2) , ... , f_q ( a t t _ j _ q)


FROM n o m _ t a b l e
c primaire
GROUP BY c l e _ p r i m;
# c l e _ p r i m est une cl

atti1 ,...,attip (R)

SELECT att_i_1 , att_i_2 , ... , a t t _ i _ p


FROM n o m _ t a b l e
GROUP BY att_i_1 , att_i_2 , ... , a t t _ i _ p;
SELECT att_i_1 ,... , att_i_p , f_1 ( a t t _ j _ 1) ,... , f_q ( a t t _ j _ q)

atti1 ,...,attip f1 (attj1 ),...,fq (attjq ) (R) FROM n o m _ t a b l e

GROUP BY att_i_1 , ... , a t t _ i _ p;

Dans le tableau ci-dessus, la correspondance nest pas tout fait exacte car dans la rdaction des
requte en langage SQL nous avons systmatiquement fait prcder laffichage des attributs des fonctions
dagrgation de la liste des attributs att_i_1,..., att_i_p qui permettent de raliser les agrgats
Exemples 2.5.1.
Considrons les relations de la base de donnes Fruits_d_ete.
Dterminons les valeurs de la plus grande et de la plus petite quantit de produits demands au
cours dune commande.
En algbre relationnelle, il sagit deffectuer
max(quantite), min(quantite) (Commande)
mysql > SELECT MAX ( q u a n t i t e) , MIN ( q u a n t i t e)
-> FROM C o m m a n d e s;
+ -- - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| MAX ( q u a n t i t e) | MIN ( q u a n t i t e) |
+ -- - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
|
30 |
5 |
+ -- - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

Dterminons le nombre de commandes enregistres, le nombre moyen de produits par commande


et le nombre total de produits commands.
En algbre relationnelle, il sagit deffectuer
comptage(id), moyenne(quantite), somme(quantite) (Commande)
mysql > SELECT COUNT ( id ) , AVG ( q u a n t i t e) , SUM ( q u a n t i t e)
-> FROM C o m m a n d e s;
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| COUNT ( id ) | AVG ( q u a n t i t e) | SUM ( q u a n t i t e) |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
|
18 |
12.2222 |
220 |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

2.5. Agrgation

29

Dterminons la table des diffrentes villes dans lesquelles rsident des clients ainsi que le nombre
de clients habitant dans chacune delles.
En algbre relationnelle, il sagit deffectuer
ville_livraison comptage(id) (Clients)

mysql > SELECT v i l l e _ l i v rai son , COUNT ( id )


-> FROM C l i e n t s
-> GROUP BY v i l l e _ l i v r a i s o n ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| v i l l e _ l i v r a i s o n | COUNT ( id ) |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| Agen
|
1 |
| Albi
|
1 |
| Brive
|
1 |
| Carcassonne
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Revel
|
1 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

Dterminons la table des diffrents dpartements dans lesquelles rsident des clients ainsi que le
nombre de clients habitant dans chacun deux.
En algbre relationnelle, il sagit deffectuer
departement comptage(id) (Clients)

mysql > SELECT departement , COUNT ( id )


-> FROM C l i e n t s
-> GROUP BY d e p a r t e m e n t ;
+ -- - - - - - - - - - - -+ - - - - - - - - - - -+
| d e p a r t e m e n t | COUNT ( id ) |
+ -- - - - - - - - - - - -+ - - - - - - - - - - -+
|
9 |
2 |
|
11 |
1 |
|
19 |
1 |
|
31 |
3 |
|
47 |
1 |
|
81 |
5 |
+ -- - - - - - - - - - - -+ - - - - - - - - - - -+

Dterminons le nombre total de produits commands par clients.


En algbre relationnelle, il sagit deffectuer
client somme(quantite) (Commandes)

mysql > SELECT client , SUM ( q u a n t i t e)


-> FROM C o m m a n d e s
-> GROUP BY client ;
+ -- - - - - - -+ - - - - - - - - - - - - - - -+
| client | SUM( q u a n t i t e) |
+ -- - - - - - -+ - - - - - - - - - - - - - - -+
| 10
|
20 |
| 11
|
20 |
| 12
|
25 |

2. ALGBRE RELATIONNELLE

30
| 2
|
35 |
| 3
|
10 |
| 5
|
20 |
| 6
|
20 |
| 7
|
30 |
| 8
|
10 |
| 9
|
30 |
+ -- - - - - - -+ - - - - - - - - - - - - - - -+

On peut regretter que les clients apparaissent par leur identifiant et non par leur nom. Lenvie
de voir les clients lists par leur nom peut tre satisfaite en procdant la mme aggration que
prcdemment mais sur la table obtenue par jointure des tables Clients et Commandes :
Clients.nom somme(quantite) (Clients Clients.id= Commandes.client Commandes)

mysql > SELECT C l i e n t s. nom , SUM ( q u a n t i t e)


-> WHERE C l i e n t s. id = C o m m a n d e s. client
-> GROUP BY C l i e n t s. id ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| nom
| SUM ( q u a n t i t e) |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| FAURE
|
35 |
| BOUTY
|
10 |
| LEONARDI
|
20 |
| PECATTE
|
20 |
| SOLE - P O M M I E S |
30 |
| CERDA
|
10 |
| JAUROU
|
30 |
| PRENAT - VILLE |
20 |
| CHARRIER
|
20 |
| BROUHARD
|
25 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

-> FROM Clients , C o m m a n d e s

Dterminons le nombre de commandes, le nombre de produits command, le nombre moyen de


produits commands par commande et le nombre maximal de produit pour une seule commande,
pour chaque clients.
En algbre relationnelle, il sagit deffectuer
client comptage(id), somme(quantite), moyenne(quantite), max(quantite) (Commandes)

mysql > SELECT client , COUNT ( id ) , SUM ( q u a n t i t e) , AVG ( q u a n t i t e) , MAX ( q u a n t i t e)


-> FROM C o m m a n d e s
-> GROUP BY client ;
+ -- - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| client | COUNT ( id ) | SUM ( q u a n t i t e) | AVG ( q u a n t i t e) | MAX ( q u a n t i t e) |
+ -- - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| 10
|
1 |
20 |
20.0000 |
20 |
| 11
|
2 |
20 |
10.0000 |
15 |
| 12
|
2 |
25 |
12.5000 |
15 |
| 2
|
4 |
35 |
8.7500 |
10 |
| 3
|
1 |
10 |
10.0000 |
10 |
| 5
|
2 |
20 |
10.0000 |
10 |
| 6
|
1 |
20 |
20.0000 |
20 |
| 7
|
3 |
30 |
10.0000 |
10 |
| 8
|
1 |
10 |
10.0000 |
10 |
| 9
|
1 |
30 |
30.0000 |
30 |
+ -- - - - - - -+ - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

2.5. Agrgation

31

Dterminons la liste des varits de fruits ainsi que le poids total disponible de chaque varit,
indpendamment du conditionnement.
En algbre relationnelle, il sagit deffectuer
fruit, variete somme(poids quantite ) (Stock)

mysql > SELECT fruit , variete , SUM ( poids * q u a n t i t e)


-> FROM Stock
-> GROUP BY fruit , v a r i e t e;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| fruit
| variete
| SUM ( poids * q u a n t i t e) |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| c e r i s e s | burlat
|
96.000 |
| c e r i s e s | coeur de pigeon
|
30.000 |
| cerises | napoleon
|
65.000 |
| f r a i s e s | a n d a l o u s e d hiver |
172.000 |
| fraises | charlotte
|
0.000 |
| fraises | gariguette
|
131.250 |
| f r a i s e s | mara des bois
|
13.250 |
+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+

2. ALGBRE RELATIONNELLE

32

Dterminons le client qui, en sommant toutes se commandes, a command le plus de produits


ainsi que celui qui commande le plus de produits en moyenne.
En algbre relationnelle, il sagit de composer deux oprations dagrgation :

client somme(quantite), moyenne(quantite) (Commandes)

Dterminons le nombre de dpartements dans lesquels des livraisons ont t effectues.


En algbre relationnelle, il sagit deffectuer
departement comptage(id) (Clients)

2.5. Agrgation

2.5.3

33

Complments : slection en amont et en aval dune agrgation

Supposons que lon souhaite connatre la liste des villes de livraison dans le Tarn ainsi que le nombre
de clients prsent dans chacune de ces villes.
Il semble naturel de faire agir loprateur dagrgation villecomptage(id) () sur la table obtenue en slectionnant les lignes de la table Clients correspondant des clients habitant dans le Tarn soit au
final
ville comptage(id) (departement = 81 (Clients))
Loprateur dagrgation est compos droite par un oprateur de slection, on parle de slection
en amont .
La requte en SQL est
mysql > SELECT v i l l e _ l i v rai son , COUNT ( id )
-> FROM C l i e n t s
-> WHERE d e p a r t e m e n t = 81
-> GROUP BY v i l l e _ l i v r a i s o n ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| v i l l e _ l i v r a i s o n | COUNT ( id ) |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| Albi
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

Supposons que lon souhaite connatre la liste des villes de livraison dans lesquelles habitent au moins
deux clients.
Il semble naturel de faire agir loprateur de slection associ au critre comptage(id) >= 2 sur la
table rsultant de lagrgation ville comptage(id) (Clients), soit au final
comptage(id)>=2

ville comptage(id) (Clients)

Loprateur dagrgation est compos gauche par un oprateur de slection, on parle de slection
en aval .
La requte en SQL est
mysql > SELECT v i l l e _ l i v rai son , COUNT ( id )
-> FROM C l i e n t s
-> GROUP BY v i l l e _ l i v r a i s o n
-> HAVING COUNT ( id ) >= 2;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| v i l l e _ l i v r a i s o n | COUNT ( id ) |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

Bien entendu, il est possible de raliser dans une mme requte une slection en amont et une autre
en aval, par exemple si lon souhaite obtenir la liste des villes du Tarn ou de Haute-Garonne dans
lesquelles habitent au moins deux clients :
comptage(id)>=2
La requte en SQL est

ville comptage(id)

(departement = 81 ou departement = 31 (Clients))

2. ALGBRE RELATIONNELLE

34

mysql > SELECT v i l l e _ l i v rai son , COUNT ( id )


-> FROM C l i e n t s
-> WHERE d e p a r t e m e n t = 81 OR d e p a r t e m e n t = 31
-> GROUP BY v i l l e _ l i v r a i s o n
-> HAVING COUNT ( id ) >= 2;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| v i l l e _ l i v r a i s o n | COUNT ( id ) |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| Castres
|
2 |
| Gaillac
|
2 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

2.5.4

Utilisation des fonctions dagrgation au sein dune requte

Exemples 2.5.2.
Dterminons la liste des commandes dont le nombre de produits demand est strictement suprieur la quantit moyenne de produit par commande.
En algbre relationnelle, il sagit deffectuer
quantite > moyenne(quantite) (Commandes) (Commandes)
mysql > SELECT *
-> FROM C o m m a n d e s
-> WHERE q u a n t i t e > ( SELECT AVG ( q u a n t i t e)
->
FROM C o m m a n d e s) ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 2 | 2014 -05 -10 | 6
|
3 |
20 |
| 6 | 2014 -05 -15 | 12
|
6 |
15 |
| 13 | 2014 -05 -20 | 11
|
3 |
15 |
| 17 | 2014 -05 -23 | 10
|
3 |
20 |
| 18 | 2014 -05 -25 | 9
|
4 |
30 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+

Dterminons la liste des commandes dont le nombre de produits demand est maximal parmi
toutes les commandes.
En algbre relationnelle, il sagit deffectuer
quantite = max(quantite) (Commandes) (Commandes)
mysql > SELECT *
-> FROM C o m m a n d e s
-> WHERE q u a n t i t e = ( SELECT MAX ( q u a n t i t e)
->
FROM C o m m a n d e s) ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 18 | 2014 -05 -25 | 9
|
4 |
30 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+

2.6. Complments

2.6

35

Complments

2.6.1

Utilisation dalias

2.6.2

Ordonner les lignes de la tables rsultant dune requte

Linstruction ORDER BY, place en fin de requte, permet de rpondre cette question.
Par dfaut, ORDER BY att trie les lignes dans lordre de lattribut att croissant :
mysql > SELECT quantite , date
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3
-> ORDER BY q u a n t i t e;
+ -- - - - - - - - -+ - - - - - - - - - - - -+
| q u a n t i t e | date
|
+ -- - - - - - - - -+ - - - - - - - - - - - -+
|
10 | 2014 -05 -23 |
|
15 | 2014 -05 -20 |
|
20 | 2014 -05 -10 |
|
20 | 2014 -05 -23 |
+ -- - - - - - - - -+ - - - - - - - - - - - -+

Il est possible dimposer le sens du tri par en ajoutant ASC pour obtenir un tri croissant et DESC
pour obtenir un tri dcroissant :
mysql > SELECT quantite , date
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3
-> ORDER BY q u a n t i t e ASC ;
+ -- - - - - - - - -+ - - - - - - - - - - - -+
| q u a n t i t e | date
|
+ -- - - - - - - - -+ - - - - - - - - - - - -+
|
10 | 2014 -05 -23 |
|
15 | 2014 -05 -20 |
|
20 | 2014 -05 -10 |
|
20 | 2014 -05 -23 |
+ -- - - - - - - - -+ - - - - - - - - - - - -+
mysql > SELECT quantite , date
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3
-> ORDER BY q u a n t i t e DESC ;
+ -- - - - - - - - -+ - - - - - - - - - - - -+
| q u a n t i t e | date
|
+ -- - - - - - - - -+ - - - - - - - - - - - -+
|
20 | 2014 -05 -10 |
|
20 | 2014 -05 -23 |
|
15 | 2014 -05 -20 |
|
10 | 2014 -05 -23 |
+ -- - - - - - - - -+ - - - - - - - - - - - -+

Lorsque lattribut att est de type numrique, la relation dordre prise en compte est lordre usuel sur
les nombres rels, lorsque lattribut est une chane de caractres, la relation dordre prise encompte
est lordre alphabtique : voici dans lordre alphabtique les villes de livraison du Tarn suivies du
nombre de client dans chacunes delles :
mysql > SELECT v i l l e _ l i vra iso n , COUNT ( id ) AS n b _ d e _ c l i e n t s

2. ALGBRE RELATIONNELLE

36
-> FROM C l i e n t s
-> WHERE d e p a r t e m e n t = 81
-> GROUP BY v i l l e _ l i v r a i s o n
-> ORDER BY v i l l e _ l i v r a i s o n ASC ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| ville_livraison | nb_de_clients |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| Albi
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

Listons maintenant toutes les villes de livraison suivies du nombre de clients qui y rsident, en
ordonnant le rsultat dabord par ordre alphabtique sur les villes puis par nombre de clients
dcroissant :
mysql > SELECT v i l l e _ l i vra iso n , COUNT ( id ) AS n b _ d e _ c l i e n t s
-> FROM C l i e n t s
-> GROUP BY v i l l e _ l i v r a i s o n
-> ORDER BY v i l l e _ l i v r a i s o n ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| ville_livraison | nb_de_clients |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| Agen
|
1 |
| Albi
|
1 |
| Brive
|
1 |
| Carcassonne
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Revel
|
1 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
mysql > SELECT v i l l e _ l i vra iso n , COUNT ( id ) AS n b _ d e _ c l i e n t s
-> FROM C l i e n t s
-> GROUP BY v i l l e _ l i v r a i s o n
-> ORDER BY n b _ d e _ c l i e n t s DESC ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| ville_livraison | nb_de_clients |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| Toulouse
|
2 |
| Castres
|
2 |
| Pamiers
|
2 |
| Gaillac
|
2 |
| Revel
|
1 |
| Albi
|
1 |
| Brive
|
1 |
| Carcassonne
|
1 |
| Agen
|
1 |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+

Enfin, il est possible de trier selon plusieurs attributs. Linstruction


ORDER BY atti1 DESC, atti2 ASC, ..., attip DESC
ralise un tri dcroissant selon lattribut atti1 , puis les lments ayant le mme attribut atti1 sont
tris selon lattribut atti2 croissant, puis les lments ayant les mmes attributs atti1 et atti2 sont
tris selon lattribut atti3 . . ., enfi les lments ayant les mmes attributs atti1 , . . . , attip1 sont tris
selon lattribut attip dcroissant.

2.6. Complments

mysql > SELECT produit , date , q u a n t i t e


-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3 OR p r o d u i t = 4 OR p r o d u i t = 6
-> ORDER BY p r o d u i t ASC ;
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| p r o d u i t | date
| quantite |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
|
3 | 2014 -05 -10 |
20 |
|
3 | 2014 -05 -23 |
20 |
|
3 | 2014 -05 -23 |
10 |
|
3 | 2014 -05 -20 |
15 |
|
4 | 2014 -05 -10 |
10 |
|
4 | 2014 -05 -20 |
5 |
|
4 | 2014 -05 -25 |
30 |
|
6 | 2014 -05 -20 |
10 |
|
6 | 2014 -05 -15 |
10 |
|
6 | 2014 -05 -15 |
15 |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT produit , date , q u a n t i t e
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3 OR p r o d u i t = 4 OR p r o d u i t = 6
-> ORDER BY p r o d u i t ASC , date ASC ;
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| p r o d u i t | date
| quantite |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
|
3 | 2014 -05 -10 |
20 |
|
3 | 2014 -05 -20 |
15 |
|
3 | 2014 -05 -23 |
20 |
|
3 | 2014 -05 -23 |
10 |
|
4 | 2014 -05 -10 |
10 |
|
4 | 2014 -05 -20 |
5 |
|
4 | 2014 -05 -25 |
30 |
|
6 | 2014 -05 -15 |
10 |
|
6 | 2014 -05 -15 |
15 |
|
6 | 2014 -05 -20 |
10 |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT produit , date , q u a n t i t e
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3 OR p r o d u i t = 4 OR p r o d u i t = 6
-> ORDER BY p r o d u i t ASC , date ASC , q u a n t i t e DESC ;
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| p r o d u i t | date
| quantite |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
|
3 | 2014 -05 -10 |
20 |
|
3 | 2014 -05 -20 |
15 |
|
3 | 2014 -05 -23 |
20 |
|
3 | 2014 -05 -23 |
10 |
|
4 | 2014 -05 -10 |
10 |
|
4 | 2014 -05 -20 |
5 |
|
4 | 2014 -05 -25 |
30 |
|
6 | 2014 -05 -15 |
15 |
|
6 | 2014 -05 -15 |
10 |
|
6 | 2014 -05 -20 |
10 |
+ -- - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - -+

37

38

2. ALGBRE RELATIONNELLE

Un peu difficile le suivant non ?


Bien entendu, il est possible de raliser simultanment une slection en amont et aval, par exemple
si lon
Dterminons la liste des villes du Tarn suivies du nombre livraisons qui y ont t effectues entre le
15 et le 23 mai 2014 :
..
La requte en SQL est
Dterminons la ou les villes dans laquelle ou lesquelles rsident le plus grand nombre de client ainsi
que ce plus grand nombre.
/
mysql > SELECT v i l l e _ l i v rai son , COUNT ( id ) AS nbc
-> FROM C l i e n t s
-> GROUP BY v i l l e _ l i v r a i s o n ;
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| v i l l e _ l i v r a i s o n | nbc |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| Agen
|
1 |
| Albi
|
1 |
| Brive
|
1 |
| Carcassonne
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Revel
|
1 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
9 rows in set (0.00 sec )
mysql > SELECT Max( nbc )
-> FROM ( SELECT v i l l e _ l i v rais on , COUNT ( id ) AS nbc
->
FROM C l i e n t s
->
GROUP BY v i l l e _ l i v r a i s o n ) ;
ERROR 1248 ( 4 2 0 0 0 ): Every d e r i v e d table must have its own alias
mysql > CREATE VIEW C l i e n t s v i l l e s AS SELECT v i l l e _ l i v rais on , COUNT ( id ) AS nbc
->
FROM C l i e n t s
->
GROUP BY v i l l e _ l i v r a i s o n ;
Query OK , 0 rows a f f e c t e d (0.11 sec )
mysql > SELECT * FROM C l i e n t s v i l l e s ;
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| v i l l e _ l i v r a i s o n | nbc |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| Agen
|
1 |
| Albi
|
1 |
| Brive
|
1 |
| Carcassonne
|
1 |
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Revel
|
1 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
9 rows in set (0.00 sec )
mysql > SELECT MAX( nbc ) AS maxi
-> FROM C l i e n t s v i l l e s ;

2.6. Complments

39

+ -- - - - -+
| maxi |
+ -- - - - -+
|
2 |
+ -- - - - -+
1 row in set (0.00 sec )
mysql > SELECT *
-> FROM C l i e n t s
-> FROM C l i e n t s ;
ERROR 1064 ( 4 2 0 0 0 ): You have an error in your SQL syntax ; check the manual that
c o r r e s p o n d s to your MySQL server v e r s i o n for the right syntax to use near FROM
C l i e n t s at line 3
mysql > SELECT *
-> FROM C l i e n t s v i l l e s
-> WHERE nbc = maxi ;
ERROR 1054 (42 S22 ) : U n k n o w n column maxi in where clause
mysql > SELECT *
-> FROM C l i e n t s v i l l e s
-> WHERE nbc = ( SELECT MAX( nbc )
->
FROM C l i e n t s v i l l e s ) ;
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| v i l l e _ l i v r a i s o n | nbc |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - -+

On y est donc arriv...en utilisant le CREATE VIEW et un alias pour donner un nom une table
intermdiaire...
En revanche je ne sais toujours pas comment donner un nom une valeur intermdiaire pour le
rutiliser ensuite... quoi que
mysql > CREATE VIEW Maxi AS ( SELECT MAX ( nbc ) AS m
->
FROM C l i e n t s v i l l e s ) ;
Query OK , 0 rows a f f e c t e d (0.17 sec )
mysql > SELECT *
-> FROM Maxi ;
+ -- - - - -+
| m
|
+ -- - - - -+
|
2 |
+ -- - - - -+
1 row in set (0.00 sec )
mysql > SELECT v i l l e _ l i v rai son , nbc
-> FROM C l i e n t s villes , Maxi
-> WHERE nbc = m ;
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| v i l l e _ l i v r a i s o n | nbc |
+ -- - - - - - - - - - - - - - - -+ - - - - -+
| Castres
|
2 |
| Gaillac
|
2 |
| Pamiers
|
2 |
| Toulouse
|
2 |
+ -- - - - - - - - - - - - - - - -+ - - - - -+

en effet lide a t de crer une seconde table temporaire ayant une seule ligne et une seule colonne
pour stocker la valeur du max.

2. ALGBRE RELATIONNELLE

40

Jai lu dans le livre dIPT Eyrolles quil tait possible dobtenir le rsultat en imbriquant les requtes
mais je ny suis pas parvenu ! !
savoir faire car CREATE VIEW est hors programme !
Exemples 2.6.1.
Dterminons le nombre total de commandes du produit dindentifiant 3 ainsi que le nombre total
de produits commands.
En algbre relationnelle, il sagit deffectuer


comptage(id), somme(quantite) produit = 3 (Commandes)


mysql > SELECT COUNT ( id ) , SUM ( q u a n t i t e)
-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3;
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+
| COUNT ( id ) | SUM ( q u a n t i t e) |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+
|
4 |
65 |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+

Dterminons le nombre total de commandes du produit dindentifiant 3 ainsi que le nombre total
de produits commands. Ces informations ne doivent concerner que la priode du 10 au 23 mai
2014.
En algbre relationnelle, il sagit deffectuer


comptage(id), somme(quantite) produit = 3 et 10-5-2014 6date 6 23-5-2014 (Commandes)

mysql > SELECT COUNT ( id ) , SUM ( q u a n t i t e)


-> FROM C o m m a n d e s
-> WHERE p r o d u i t = 3 AND date B E T W E E N 2014 -05 -10 AND 2014 -05 -23;
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+
| COUNT ( id ) | SUM ( q u a n t i t e) |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+
|
4 |
65 |
+ -- - - - - - - - - -+ - - - - - - - - - - - - - - -+

Dterminons le/les identifiant(s) du/des produit(s) le/les plus commands entre de 10 et le 14


mai 2014.
En algbre relationnelle, il sagit deffectuer
produit somme(quantit) (Commandes)

2.7. Exemples

2.7

41

Exemples

Exemples 2.7.1.
Reprenons les exemples 2.7 en crivant les oprations de lalgbre relationnelle dans le langage SQL.
1.
2.
Exemples 2.7.2.
Considrons les relations de la base de donnes Fruits_d_ete.
Calculons de nombre de formats de vente diffrents des fraises gariguette franaises.
En algbre relationnelle, il sagit deffectuer


comptage(id) fruit = fraise et variete = gariguette et origine = france (Stock)

mysql > SELECT COUNT ( id )


-> FROM Stock
-> WHERE fruit = f r a i s e s AND v a r i e t e = g a r i g u e t t e AND o r i g i n e = france ;
+ -- - - - - - - - - - - - - - - -+
| COUNT ( id )
|
+ -- - - - - - - - - - - - - - - -+
|
3 |
+ -- - - - - - - - - - - - - - - -+

Calculons la quantit totale de lots de fraises gariguette franaises disponibles.


En algbre relationnelle, il sagit deffectuer


somme(quantite) fruit = fraise et variete = gariguette et origine = france (Stock)

mysql > SELECT SUM ( q u a n t i t e)


-> FROM Stock
-> WHERE fruit = f r a i s e s AND v a r i e t e = g a r i g u e t t e AND o r i g i n e = france ;
+ -- - - - - - - - - - - - - -+
| SUM ( q u a n t i t e) |
+ -- - - - - - - - - - - - - -+
|
208 |
+ -- - - - - - - - - - - - - -+

Exemples 2.7.3.
1. Donner lopration algbrique qui permer de compter le nombre dlments (cest dire le nombre
de lignes) de la relation R :
comptage(att) (R)
o att est un attribut quelconque de la relation R.
2. Donner la requte qui permer de compter le nombre dlments (cest dire le nombre de lignes)
de la relation nom_table :
SELECT COUNT (*)
FROM n o m _ t a b l e;

2. ALGBRE RELATIONNELLE

42

3. BofBof, pas ici !


Donner lopration algbrique qui permet dafficher le tableau de la relation R dans lequel
toutes les valeurs de lattribut atti1 ont t multiplies par 1000 (en raison dun changement
dunit),
OK mais rien a voir avec lagrgation !
toutes les valeurs de lattribut atti2 ont t conserves lorsquelles taient positives ou nulles et
changes en 0 lorsquelles taient ngatives strictement,
je ne sais pas faire
toutes les valeurs de lattribut atti2 ont t changes en leur valeur absolue
je ne sais pas non plus !
(max(atti1 ,0) (R)
4.
mysql > SELECT eleve , 100 * n o t e _ c o l l e _ 1
-> FROM N o t e s _ A B C D
-> ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - -+
| eleve
| 100 * n o t e _ c o l l e _ 1 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - -+
| ANTIBI
|
1300 |
| BARBIER
|
1300 |
| BILFELD
|
1300 |
| BLERVAQUE
|
1400 |
| BOUAYAD
|
1300 |
| BOUTY
|
1500 |
| CANNAC
|
1400 |
| CASTEL
|
1400 |
| CERDA
|
1600 |
| CHANE - SANE
|
1500 |
| PRENAT - VILLE |
1300 |
| SOLE - POMIES |
1400 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - -+
12 rows in set (0.00 sec )
mysql > SELECT eleve , MAX ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY eleve ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| eleve
| MAX ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| ANTIBI
|
13 |
| BARBIER
|
13 |
| BILFELD
|
13 |
| BLERVAQUE
|
14 |
| BOUAYAD
|
13 |
| BOUTY
|
15 |
| CANNAC
|
14 |
| CASTEL
|
14 |
| CERDA
|
16 |
| CHANE - SANE
|
15 |
| PRENAT - VILLE |
13 |
| SOLE - POMIES |
14 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
12 rows in set (0.00 sec )

5.
6. Considrons la table Exercices ci-dessous appartenant la base de donnes Oraux :
id niveau concours theme

2.7. Exemples

43

7. Considrons
8. Considrons la table Animaux ci-dessous appartenant la base de donnes Animalerie :
id espece sexe date_naissance
1 chien
M
3-2-2014
2 chien
M
21-3-2014
3 chat
F
16-6-2013
4 chien
M
3-5-2012
5 chien
F
3-8-201
6 chat
F
16-11-2013
9.

2. ALGBRE RELATIONNELLE

44
Voici la table Notes_ABCD : son schema relationnel est

eleve
trinome groupe note_colle_1 note_colle_2 note_colle_3
ANTIBI
C
SI 4
13
13
11
BARBIER
C
SI 2
13
11
14
BILFELD
C
SI 4
13
13
14
BLERVAQUE
B
SI 2
14
12
13
BOUAYAD
B
SI 2
13
17
14
BOUTY
B
SI 4
15
16
14
CANNAC
D
SI 2
14
12
12
CASTEL
D
SI 4
14
17
17
CERDA
A
info
16
13
12
CHANE-SANE
D
SI 4
15
15
15
PRNAT-VILLE
A
SI 2
13
13
14
SOLE-POMMIS
A
SI 4
14
14
14
Donner les valeurs des diffrentes notes obtenues par les tves des trinmes A, B, C et D lors de la
colle 1 ainsi que le nombre de fois que chacune delles a t donnes.
mysql > SELECT D I S T I N C T note_colle_1 , COUNT ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY n o t e _ c o l l e _ 1 ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| n o t e _ c o l l e _ 1 | COUNT ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
|
13 |
5 |
|
14 |
4 |
|
15 |
2 |
|
16 |
1 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )
mysql > SELECT note_colle_1 , COUNT ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY n o t e _ c o l l e _ 1 ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
| n o t e _ c o l l e _ 1 | COUNT ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
|
13 |
5 |
|
14 |
4 |
|
15 |
2 |
|
16 |
1 |
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )

Le DISTINCT nest pas du tout ncessaire ! les rsultats sont automatiquement distincts deux deux
par dfinition de lagrgation.
Quelle est la note maximale/minimale lors de la premire colle ?
mysql > SELECT max( n o t e _ c o l l e _ 1 ) AS n o t e _ m a x i
-> FROM N o t e s _ A B C D;
+ -- - - - - - - - - -+
| note_maxi |
+ -- - - - - - - - - -+
|
16 |
+ -- - - - - - - - - -+
1 row in set (0.00 sec )

Qui a eu ces notes maximale et minimale ?

2.7. Exemples

45

mysql > SELECT eleve , n o t e _ c o l l e _ 1


-> FROM N o t e s _ A B C D
-> WHERE n o t e _ c o l l e _ 1 = ( SELECT max ( n o t e _ c o l l e _ 1 )
->
FROM N o t e s _ A B C D ) ;
+ -- - - - - -+ - - - - - - - - - - - - - -+
| eleve | n o t e _ c o l l e _ 1 |
+ -- - - - - -+ - - - - - - - - - - - - - -+
| CERDA |
16 |
+ -- - - - - -+ - - - - - - - - - - - - - -+
1 row in set (0.00 sec )

Quelle est la note maximale/minimale lors de chacune des trois premires colles ?
Quelle est la moyenne des notes de chaque trinme pour la premire colle ? ordonnez ces moyennes.
mysql > SELECT trinome , AVG ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY t r i n o m e;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| t r i n o m e | AVG ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| A
|
14.3333 |
| B
|
14.0000 |
| C
|
13.0000 |
| D
|
14.3333 |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )
mysql > SELECT trinome , AVG ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY t r i n o m e
-> ORDER BY AVG ( n o t e _ c o l l e _ 1 ) DESC ;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| t r i n o m e | AVG ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| D
|
14.3333 |
| A
|
14.3333 |
| B
|
14.0000 |
| C
|
13.0000 |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )
mysql > SELECT trinome , AVG ( n o t e _ c o l l e _ 1 )
-> FROM N o t e s _ A B C D
-> GROUP BY t r i n o m e
;+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| t r i n o m e | AVG ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| C
|
13.0000 |
| B
|
14.0000 |
| D
|
14.3333 |
| A
|
14.3333 |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )

-> ORDER BY AVG ( n o t e _ c o l l e _ 1 ) ASC

Quelle est la moyenne des notes de chaque groupe (option) pour la premire colle ? ordonnez ces
moyennes.
mysql > SELECT groupe , AVG ( n o t e _ c o l l e _ 1 )
;+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| groupe | AVG ( n o t e _ c o l l e _ 1 ) |

-> FROM N o t e s _ A B C D

-> GROUP BY groupe

2. ALGBRE RELATIONNELLE

46
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| info
|
16.0000 |
| SI 2
|
13.4000 |
| SI 4
|
14.0000 |
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
3 rows in set (0.00 sec )
mysql > SELECT groupe , AVG ( n o t e _ c o l l e _ 1 )
-> ORDER BY AVG ( n o t e _ c o l l e _ 1 ) ASC ;
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| groupe | AVG ( n o t e _ c o l l e _ 1 ) |
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| SI 2
|
13.4000 |
| SI 4
|
14.0000 |
| info
|
16.0000 |
+ -- - - - - - -+ - - - - - - - - - - - - - - - - - - -+
3 rows in set (0.00 sec )

-> FROM N o t e s _ A B C D

-> GROUP BY groupe

Prsenter le tableau des moyennes des notes des quatre trinmes lors de chacune des trois premires
colles.
mysql > SELECT trinome , AVG ( n o t e _ c o l l e _ 1 ) , AVG ( n o t e _ c o l l e _ 2 ) , AVG ( n o t e _ c o l l e _ 3 )
-> FROM N o t e s _ A B C D
-> GROUP BY t r i n o m e;
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| t r i n o m e | AVG ( n o t e _ c o l l e _ 1 ) | AVG ( n o t e _ c o l l e _ 2 ) | AVG ( n o t e _ c o l l e _ 3 ) |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| A
|
14.3333 |
13.3333 |
13.3333 |
| B
|
14.0000 |
15.0000 |
13.6667 |
| C
|
13.0000 |
12.3333 |
13.0000 |
| D
|
14.3333 |
14.6667 |
14.6667 |
+ -- - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )

Quelle est la moyenne des notes des 12 lves de la table pour chacune des trois colles ?
Quelle est la moyenne des notes de chacun des quatre trinmes pour chacune des trois colles ?
Combien de fois a t donne la note 14 lors de la premire colle ? et lors des 3 colles ?
trois notes diffrentes
au moins 2 notes gales
au moins 2 fois la mme note

2.7.1

Cration de la relation Notes_ABCD dans la base de donnes Base_Notes

(rappel le mot de passe de connection MySQL est vide, il suffit de valider !)


c
v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT / Bases de donn es/
Cours - Base - de - donnees -201
4/ B a s e _ N o t e $ mysql -u root -p
Enter p a s s w o r d:
W e l c o m e to the MySQL m o n i t o r. C o m m a n d s end with ; or \ g .
Your MySQL c o n n e c t i o n id is 40
Server v e r s i o n: 5.5.37 -0 u b u n t u 0 . 1 2 . 0 4 . 1 ( Ubuntu )
C o p y r i g h t ( c ) 2000 , 2014 , Oracle and / or its a f f i l i a t e s. All rights r e s e r v e d .
Oracle is a r e g i s t e r e d t r a d e m a r k of Oracle C o r p o r a t i o n and / or its
a f f i l i a t e s . Other names may be t r a d e m a r k s of their r e s p e c t i v e
owners .

2.7. Exemples
Type help ; or \ h for help . Type \ c to clear the c u r r e n t input s t a t e m e n t.
mysql >
mysql > CREATE D A T A B A S E B a s e _ N o t e s ;
Query OK , 1 row a f f e c t e d (0.00 sec )
mysql > USE B a s e _ N o t e s
Database changed
mysql > CREATE TABLE N o t e s _ A B C D (
-> eleve V A R C H A R (30) ,
-> t r i n o m e V A R C H A R (1) ,
-> groupe V A R C H A R (10) ,
-> n o t e _ c o l l e _ 1 S M A L L I N T UNSIGNED ,
-> n o t e _ c o l l e _ 2 S M A L L I N T UNSIGNED ,
-> n o t e _ c o l l e _ 3 S M A L L I N T U N S I G N E D) ;
Query OK , 0 rows a f f e c t e d (0.32 sec )
mysql > INSERT INTO N o t e s _ A B C D
-> VALUES ( ANTIBI , C , SI 4 , 13 , 13 , 11) ,
->
( B A R B I E R , C , SI 2 , 13 , 11 , 14) ,
->
( B I L F E L D , C , SI 4 , 13 , 13 , 14) ,
->
( B L E R V A Q U E , B , SI 2 , 14 , 12 , 13) ,
->
( B O U A Y A D , B , SI 2 , 13 , 17 , 14) ,
->
( BOUTY , B , SI 4 , 15 , 16 , 14) ,
->
( CANNAC , D , SI 2 , 14 , 12 , 12) ,
->
( CASTEL , D , SI 4 , 14 , 17 , 17) ,
->
( CERDA , A , info , 16 , 13 , 12) ,
->
( CHANE - SANE , D , SI 4 , 15 , 15 , 15) ,
->
( PRENAT - VILLE , A , SI 2 , 13 , 13 , 14) ,
->
( SOLE - POMIES , A , SI 4 , 14 , 14 , 14) ;
Query OK , 12 rows a f f e c t e d (0.10 sec )
R e c o r d s: 12 D u p l i c a t e s : 0 W a r n i n g s: 0
mysql > SELECT * FROM N o t e s _ A B C D;
+ -- - - - - - - - - - - - -+ - - - - - - - - -+ - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
| eleve
| t r i n o m e | groupe | n o t e _ c o l l e _ 1 | n o t e _ c o l l e _ 2 | n o t e _ c o l l e _ 3 |
+ -- - - - - - - - - - - - -+ - - - - - - - - -+ - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
| ANTIBI
| C
| SI 4
|
13 |
13 |
11 |
| BARBIER
| C
| SI 2
|
13 |
11 |
14 |
| BILFELD
| C
| SI 4
|
13 |
13 |
14 |
| BLERVAQUE
| B
| SI 2
|
14 |
12 |
13 |
| BOUAYAD
| B
| SI 2
|
13 |
17 |
14 |
| BOUTY
| B
| SI 4
|
15 |
16 |
14 |
| CANNAC
| D
| SI 2
|
14 |
12 |
12 |
| CASTEL
| D
| SI 4
|
14 |
17 |
17 |
| CERDA
| A
| info
|
16 |
13 |
12 |
| CHANE - SANE
| D
| SI 4
|
15 |
15 |
15 |
| PRENAT - VILLE | A
| SI 2
|
13 |
13 |
14 |
| SOLE - POMIES | A
| SI 4
|
14 |
14 |
14 |
+ -- - - - - - - - - - - - -+ - - - - - - - - -+ - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
12 rows in set (0.00 sec )

2.7.2
2.7.3

Fonction dagrgation

47

2. ALGBRE RELATIONNELLE

48

2.8

TD : interrogation de tables dune base de donnes

Exercice 2.8.1.
Exercice 2.8.2.
Exercice 2.8.3.

2.9. Correction des exercices du chapitre 2

2.9

Correction des exercices du chapitre 2

Corrig de lexercice 2.8.1


Corrig de lexercice 2.8.2
Corrig de lexercice 2.8.3

49

50

2. ALGBRE RELATIONNELLE

51

Chapitre

3
Base de donnes relationnelle

Sommaire
3.1
3.2
3.3
3.4
3.5
3.6

3.1

Dfinition . . . . . . . . . . . . . . . . . . .
Gnalogie de la MPSI 1-221 (2013-2014)
Interrogation de la base Fruits_d_ete . .
Illustration de lintrt dune jointure . .
TD Bases de donnes relationnelles . . .
Correction des exercices du chapitre 3 . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

51
56
61
64
66
67

Dfinition

Une base de donnes est un ensemble structur de donnes informatiques (chanes de caractres,
valeurs numriques, . . .) dans lequel
les donnes sont enregistres sur un support permanent,
les donnes ne figurent quune seule fois (pour viter toute redondance dinformations),
chaque objet ou entit possde un identifiant unique.
Une base de donnes relationnelle est une base de donnes forme dun ensemble de relations.
Le schema dune base de donnes relationnelle est lensemble des schemas des diffrentes relations qui
la constituent.
Dans le but dviter la redondance de linformation au sein dune base de donnes relationnelle, nous
crerons des liens entre les diffrentes tables la constituant. Voyons sur les exemples suivants comment
il est possible de tisser des liens entre les relations dune base de donnes.
Exemples 3.1.1.
1.
2.

52

3. BASE DE DONNES RELATIONNELLE

mysql > SELECT id , client , p r o d u i t


-> FROM C o m m a n d e s;
+ -- - -+ - - - - - - - -+ - - - - - - - - -+
| id | client | p r o d u i t |
+ -- - -+ - - - - - - - -+ - - - - - - - - -+
| 1 | 2
|
4 |
| 2 | 6
|
3 |
| 3 | 2
|
7 |
| 4 | 2
|
8 |
| 5 | 7
|
1 |
| 6 | 12
|
6 |
| 7 | 3
|
10 |
| 8 | 7
|
10 |
| 9 | 7
|
9 |
| 10 | 8
|
6 |
| 11 | 2
|
6 |
| 12 | 11
|
4 |
| 13 | 11
|
3 |
| 14 | 12
|
1 |
| 15 | 5
|
2 |
| 16 | 5
|
3 |
| 17 | 10
|
3 |
| 18 | 9
|
4 |
+ -- - -+ - - - - - - - -+ - - - - - - - - -+
mysql > SELECT C o m m a n d e s . id , C l i e n t s. nom , p r o d u i t
-> FROM C o m m a n d e s JOIN C l i e n t s
ON C o m m a n d e s. client = C l i e n t s. id ;+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - -+
| id | nom
| produit |
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - -+
| 1 | FAURE
|
4 |
| 2 | PECATTE
|
3 |
| 3 | FAURE
|
7 |
| 4 | FAURE
|
8 |
| 5 | SOLE - P O M M I E S |
1 |
| 6 | BROUHARD
|
6 |
| 7 | BOUTY
|
10 |
| 8 | SOLE - P O M M I E S |
10 |
| 9 | SOLE - P O M M I E S |
9 |
| 10 | CERDA
|
6 |
| 11 | FAURE
|
6 |
| 12 | C H A R R I E R
|
4 |
| 13 | C H A R R I E R
|
3 |
| 14 | B R O U H A R D
|
1 |
| 15 | L E O N A R D I
|
2 |
| 16 | L E O N A R D I
|
3 |
| 17 | PRENAT - VILLE |
3 |
| 18 | JAUROU
|
4 |
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - -+
mysql > SELECT C o m m a n d e s . id , variete , c o n d i t i o n nem ent , C o m m a n d e s. q u a n t i t e
-> FROM C o m m a n d e s JOIN Stock ON C o m m a n d e s. p r o d u i t = Stock . id ;
+ -- - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| id | v a r i e t e
| conditionnement | quantite |
+ -- - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | a n d a l o u s e d hiver | c a g e t t e
|
10 |
| 2 | gariguette
| cagette
|
20 |
| 3 | burlat
| cagette
|
5 |
| 4 | burlat
| cagette
|
10 |
| 5 | gariguette
| barquette
|
10 |
| 6 | charlotte
| barquette
|
15 |

3.1. Dfinition
| 7 | napoleon
| cagette
|
10 |
| 8 | napoleon
| cagette
|
10 |
| 9 | coeur de pigeon
| cagette
|
10 |
| 10 | c h a r l o t t e
| barquette
|
10 |
| 11 | c h a r l o t t e
| barquette
|
10 |
| 12 | a n d a l o u s e d hiver | c a g e t t e
|
5 |
| 13 | g a r i g u e t t e
| cagette
|
15 |
| 14 | g a r i g u e t t e
| barquette
|
10 |
| 15 | g a r i g u e t t e
| barquette
|
10 |
| 16 | g a r i g u e t t e
| cagette
|
10 |
| 17 | g a r i g u e t t e
| cagette
|
20 |
| 18 | a n d a l o u s e d hiver | c a g e t t e
|
30 |
+ - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT C o m m a n d e s . id , variete , nom
-> FROM C o m m a n d e s
-> JOIN Stock ON C o m m a n d e s. p r o d u i t = Stock . id
-> JOIN C l i e n t s ON C o m m a n d e s. client = C l i e n t s. id ;
+ -- - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
| id | v a r i e t e
| nom
|
+ -- - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+
| 1 | a n d a l o u s e d hiver | FAURE
|
| 2 | gariguette
| PECATTE
|
| 3 | burlat
| FAURE
|
| 4 | burlat
| FAURE
|
| 5 | gariguette
| SOLE - P O M M I E S |
| 6 | charlotte
| BROUHARD
|
| 7 | napoleon
| BOUTY
|
| 8 | napoleon
| SOLE - P O M M I E S |
| 9 | coeur de pigeon
| SOLE - P O M M I E S |
| 10 | c h a r l o t t e
| CERDA
|
| 11 | c h a r l o t t e
| FAURE
|
| 12 | a n d a l o u s e d hiver | C H A R R I E R
|
| 13 | g a r i g u e t t e
| CHARRIER
|
| 14 | g a r i g u e t t e
| BROUHARD
|
| 15 | g a r i g u e t t e
| LEONARDI
|
| 16 | g a r i g u e t t e
| LEONARDI
|
| 17 | g a r i g u e t t e
| PRENAT - VILLE |
| 18 | a n d a l o u s e d hiver | JAUROU
|
+ - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+

53

54

3. BASE DE DONNES RELATIONNELLE

c
v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT / Bases de donn es/
Cours - Base - de - donnees -201
4 $ mysql -u root -p
Enter p a s s w o r d:
W e l c o m e to the MySQL m o n i t o r. C o m m a n d s end with ; or \ g .
Your MySQL c o n n e c t i o n id is 50
Server v e r s i o n: 5.5.37 -0 u b u n t u 0 . 1 2 . 0 4 . 1 ( Ubuntu )
C o p y r i g h t ( c ) 2000 , 2014 , Oracle and / or its a f f i l i a t e s. All rights r e s e r v e d .
Oracle is a r e g i s t e r e d t r a d e m a r k of Oracle C o r p o r a t i o n and / or its
a f f i l i a t e s . Other names may be t r a d e m a r k s of their r e s p e c t i v e
owners .
Type help ; or \ h for help . Type \ c to clear the c u r r e n t input s t a t e m e n t.
c alogie
c
mysql > CREATE D A T A B A S E G n
-> ;
Query OK , 1 row a f f e c t e d (0.00 sec )
c alogie;
c
mysql > USE G n
Database changed
mysql > CREATE TABLE Valois (
-> id SMALLINT ,
-> nom V A R C H A R (20) ,
-> pre V A R C H A R (20) ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.73 sec )
mysql > INSERT INTO Valois
-> VALUES (1 , F r a n o i s Ier , 0)
-> ;
Query OK , 1 row a f f e c t e d (0.18 sec )
mysql > INSERT INTO Valois
-> VALUES (2 , Henri II , 1) ,
->
(3 , F r a n o i s II , 2) ,
->
(4 , C h a r l e s IX , 2) ,
->
(5 , Henri III , 2) ;
Query OK , 4 rows a f f e c t e d (0.40 sec )
R e c o r d s: 4 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM Valois ;
+ -- - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
| id | nom
| pre |
+ -- - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
| 1 | F r a n o i s Ier | 0
|
| 2 | Henri II
| 1
|
| 3 | F r a n o i s II
| 2
|
| 4 | C h a r l e s IX
| 2
|
| 5 | Henri III
| 2
|
+ -- - -+ - - - - - - - - - - - - - - -+ - - - - - - -+

mysql > SELECT *


-> FROM Valois AS V1
-> JOIN Valois AS V2 ON V1 . pre = V2 . id ;
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - -+ - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+
| id | nom
| pre | id | nom
| pre |
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - -+ - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+

3.1. Dfinition
| 2 | Henri II
| 1
| 1 | F r a n o i s Ier | 0
|
| 3 | F r a n o i s II | 2
| 2 | Henri II
| 1
|
| 4 | C h a r l e s IX
| 2
| 2 | Henri II
| 1
|
| 5 | Henri III
| 2
| 2 | Henri II
| 1
|
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - -+ - - - -+ - - - - - - - - - - - - - - -+ - - - - - - -+

Recherche des descendants de Henri II :


mysql > SELECT V1 . nom
-> FROM Valois AS V1
-> JOIN Valois AS V2 ON V1 . pre = V2 . id
-> WHERE V2 . nom = Henri II ;
+ -- - - - - - - - - - - - -+
| nom
|
+ -- - - - - - - - - - - - -+
| F r a n o i s II |
| C h a r l e s IX
|
| Henri III
|
+ -- - - - - - - - - - - - -+

55

3. BASE DE DONNES RELATIONNELLE

56

3.2

Gnalogie de la MPSI 1-221 (2013-2014)

mysql > CREATE D A T A B A S E G e n e a l o g i eMPS I1 -221;


ERROR 1064 ( 4 2 0 0 0 ): You have an error in your SQL syntax ; check the manual that
c o r r e s p o n d s to your MySQL server v e r s i o n for the right syntax to use near -221
at line 1
mysql > CREATE D A T A B A S E G e n e a l o g i e M P S I 1 _ 2 2 1 ;
Query OK , 1 row a f f e c t e d (0.00 sec )
mysql > USE G e n e a l o g i e M P S I 1 _ 2 2 1 ;
Database changed
mysql > CREATE TABLE Arbre (
-> id SMALLINT ,
-> nom V A R C H A R (30) ,
-> pere V A R C H A R (30) ,
-> mere V A R C H A R (30) ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.40 sec )
mysql > D E S C R I B E Arbre ;
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| Field | Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | 0
|
|
| nom
| v a r c h a r (30) | YES |
| NULL
|
|
| pere | v a r c h a r (30) | YES |
| NULL
|
|
| mere | v a r c h a r (30) | YES |
| NULL
|
|
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
4 rows in set (0.00 sec )
mysql > DROP Arbre ;
ERROR 1064 ( 4 2 0 0 0 ): You have an error in your SQL syntax ; check the manual that
c o r r e s p o n d s to your MySQL server v e r s i o n for the right syntax to use near
Arbre at line 1
mysql > DROP TABLE Arbre ;
Query OK , 0 rows a f f e c t e d (0.17 sec )
mysql > CREATE TABLE Arbre (
-> id SMALLINT ,
-> nom V A R C H A R (30) ,
-> pere SMALLINT ,
-> nom V A R C H A R (30) ,
-> P R I M A R Y KEY ( id )
-> ;
ERROR 1064 ( 4 2 0 0 0 ): You have
c o r r e s p o n d s to your MySQL
line 6
mysql > CREATE TABLE Arbre (
-> id SMALLINT ,
-> pere SMALLINT ,
-> nom V A R C H A R (30) ;
ERROR 1064 ( 4 2 0 0 0 ): You have
c o r r e s p o n d s to your MySQL
line 4
mysql > CREATE TABLE Arbre (
-> id SMALLINT ,
-> nom V A R C H A R (30) ;

an error in your SQL syntax ; check the manual that


server v e r s i o n for the right syntax to use near at

an error in your SQL syntax ; check the manual that


server v e r s i o n for the right syntax to use near at

3.2. Gnalogie de la MPSI 1-221 (2013-2014)

57

ERROR 1064 ( 4 2 0 0 0 ): You have an error in your SQL syntax ; check the manual that
c o r r e s p o n d s to your MySQL server v e r s i o n for the right syntax to use near at
line 3
mysql > CREATE TABLE Arbre (
-> id SMALLINT ,
-> nom V A R C H A R (30) ,
-> pere SMALLINT ,
-> mere SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.42 sec )
mysql > D E S C R I B E Arbre ;
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| Field | Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | 0
|
|
| nom
| v a r c h a r (30) | YES |
| NULL
|
|
| pere | s m a l l i n t (6) | YES |
| NULL
|
|
| mere | s m a l l i n t (6) | YES |
| NULL
|
|
+ -- - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
mysql > INSERT INTO Arbre
-> VALUES (1 , Choco , 0 , 0) ,
->
(2 , M a l l e t t e , 0 , 0) ,
->
(3 , Nain , 2 , 1) ,
->
(4 , 51 , 2 , 1) ,
->
(5 , Imz , 2 , 1) ,
->
(6 , Zdette , 2 , 1) ,
->
(7 , BDM , 3 , 13) ,
->
(8 , Droopy , 5 , 6) ,
->
(9 , P4 , 5 , 6) ,
->
(10 , XVI , 5 , 6) ,
->
(11 , Tonio , 7 , 8) ,
->
(12 , G a d e t t e , 7 , 8) ,
->
(13 , T o n i e t t e , 5 , 6) ;
Query OK , 13 rows a f f e c t e d (0.17 sec )
R e c o r d s: 13 D u p l i c a t e s : 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM Arbre ;
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+
| id | nom
| pere | mere |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+
| 1 | Choco
|
0 |
0 |
| 2 | Mallette |
0 |
0 |
| 3 | Nain
|
2 |
1 |
| 4 | 51
|
2 |
1 |
| 5 | Imz
|
2 |
1 |
| 6 | Zdette
|
2 |
1 |
| 7 | BDM
|
3 |
13 |
| 8 | Droopy
|
5 |
6 |
| 9 | P4
|
5 |
6 |
| 10 | XVI
|
5 |
6 |
| 11 | Tonio
|
7 |
8 |
| 12 | G a d e t t e |
7 |
8 |
| 13 | T o n i e t t e |
5 |
6 |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+

Et maintenant, interrogeons cette table !

3. BASE DE DONNES RELATIONNELLE

58

1. Donnons le nom des enfants de la mre didentifiant 1, suivi des identifiants de leur pre et de
leur mre.
mysql > SELECT *
-> FROM Arbre
-> WHERE mere = 1;
+ -- - -+ - - - - - - - -+ - - - - - -+ - - - - - -+
| id | nom
| pere | mere |
+ -- - -+ - - - - - - - -+ - - - - - -+ - - - - - -+
| 3 | Nain
|
2 |
1 |
| 4 | 51
|
2 |
1 |
| 5 | Imz
|
2 |
1 |
| 6 | Zdette |
2 |
1 |
+ -- - -+ - - - - - - - -+ - - - - - -+ - - - - - -+

2. Donnons la table des enfants dont le pre est Mallette.


Commenons par raliser une jointure de deux copies de la mme table Arbre (observer lutilisation de loprateur AS de renommage) :
mysql > SELECT *
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id ;
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+
| id | nom
| pere | mere | id | nom
| pere | mere |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+
| 3 | Nain
|
2 |
1 | 2 | Mallette |
0 |
0 |
| 4 | 51
|
2 |
1 | 2 | Mallette |
0 |
0 |
| 5 | Imz
|
2 |
1 | 2 | Mallette |
0 |
0 |
| 6 | Zdette
|
2 |
1 | 2 | Mallette |
0 |
0 |
| 7 | BDM
|
3 |
13 | 3 | Nain
|
2 |
1 |
| 8 | Droopy
|
5 |
6 | 5 | Imz
|
2 |
1 |
| 9 | P4
|
5 |
6 | 5 | Imz
|
2 |
1 |
| 10 | XVI
|
5 |
6 | 5 | Imz
|
2 |
1 |
| 11 | Tonio
|
7 |
8 | 7 | BDM
|
3 |
13 |
| 12 | G a d e t t e |
7 |
8 | 7 | BDM
|
3 |
13 |
| 13 | T o n i e t t e |
5 |
6 | 5 | Imz
|
2 |
1 |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+

Puis slectionnons les lignes de cette table obtenue par jointure sur le critre : le pre est Mallette.
mysql > SELECT A1 . nom
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id
-> WHERE A2 . nom = M a l l e t t e ;
+ -- - - - - - -+
| nom
|
+ -- - - - - - -+
| Nain
|
| 51
|
| Imz
|
| Zdette |
+ -- - - - - - -+

3. Donnons la table des enfants dont la mre est Zdette.


mysql > SELECT A1 . nom
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . mere = A2 . id
-> WHERE A2 . nom = Zdette ;
+ -- - - - - - - - -+
| nom
|

3.2. Gnalogie de la MPSI 1-221 (2013-2014)

59

+ -- - - - - - - - -+
| Droopy
|
| P4
|
| XVI
|
| Toniette |
+ -- - - - - - - - -+

4. Donnons la table du couple la racine de larbre.


mysql > SELECT nom
-> FROM Arbre
-> WHERE pere = 0;
+ -- - - - - - - - -+
| nom
|
+ -- - - - - - - - -+
| Choco
|
| Mallette |
+ -- - - - - - - - -+

5. Donnons la liste des noms des personnes de larbre gnalogique suivis des noms de leur pre
(pour ceux qui en ont un).
mysql > SELECT A1 . nom , A2 . nom
-> FROM Arbre ;
ERROR 1054 (42 S22 ) : U n k n o w n column A1 . nom in field list
mysql > SELECT A1 . nom , A2 . nom
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id ;
+ -- - - - - - - - -+ - - - - - - - - - -+
| nom
| nom
|
+ -- - - - - - - - -+ - - - - - - - - - -+
| Nain
| Mallette |
| 51
| Mallette |
| Imz
| Mallette |
| Zdette
| Mallette |
| BDM
| Nain
|
| Droopy
| Imz
|
| P4
| Imz
|
| XVI
| Imz
|
| Tonio
| BDM
|
| G a d e t t e | BDM
|
| T o n i e t t e | Imz
|
+ -- - - - - - - - -+ - - - - - - - - - -+

Modifions la requte prcdente en utilisant loprateur de renommage des attributs pour viter
lambiguit manifeste sur les attributs annoncs dans la table ci-dessus.
mysql > SELECT A1 . nom , A2 . nom AS n o m _ d u _ p e r e
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id ;
+ -- - - - - - - - -+ - - - - - - - - - - - - -+
| nom
| nom_du_pere |
+ -- - - - - - - - -+ - - - - - - - - - - - - -+
| Nain
| Mallette
|
| 51
| Mallette
|
| Imz
| Mallette
|
| Zdette
| Mallette
|
| BDM
| Nain
|
| Droopy
| Imz
|
| P4
| Imz
|
| XVI
| Imz
|

3. BASE DE DONNES RELATIONNELLE

60
| Tonio
| BDM
|
| G a d e t t e | BDM
|
| T o n i e t t e | Imz
|
+ -- - - - - - - - -+ - - - - - - - - - - - - -+

6. Donnons la liste des noms des personnes de larbre gnalogique suivis des noms de leur pre
(pour ceux qui en ont un) et de leur mre (pour ceux qui en ont une).
mysql > SELECT A1 . nom , A2 . nom AS nom_du_pere , A3 . nom AS n o m _ d e _ l a _ m e r e
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id
-> JOIN Arbre AS A3 ON A1 . mere = A3 . id ;
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| nom
| nom_du_pere | nom_de_la_mere |
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - -+
| Nain
| Mallette
| Choco
|
| 51
| Mallette
| Choco
|
| Imz
| Mallette
| Choco
|
| Zdette
| Mallette
| Choco
|
| BDM
| Nain
| Toniette
|
| Droopy
| Imz
| Zdette
|
| P4
| Imz
| Zdette
|
| XVI
| Imz
| Zdette
|
| Tonio
| BDM
| Droopy
|
| G a d e t t e | BDM
| Droopy
|
| T o n i e t t e | Imz
| Zdette
|
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - -+

7. Donnons la liste des noms des personnes de larbre gnalogique qui ont comme pre ou mre
Imz (en fait dans cette table, Imz est toujours un pre mais hermaphrodisme oblige...).
mysql > SELECT A1 . nom
-> FROM Arbre AS A1
-> JOIN Arbre AS A2 ON A1 . pere = A2 . id
-> JOIN Arbre AS A3 ON A1 . mere = A3 . id
-> WHERE A2 . nom = Imz OR A3 . nom = Imz ;
+ -- - - - - - - - -+
| nom
|
+ -- - - - - - - - -+
| Droopy
|
| P4
|
| XVI
|
| Toniette |
+ -- - - - - - - - -+

8. Donnons la liste des identifiants des pres suivis du nombre de leurs enfants.
mysql > SELECT pere , COUNT ( id )
-> FROM Arbre
-> GROUP BY pere ;
+ -- - - - -+ - - - - - - - - - - -+
| pere | COUNT ( id ) |
+ -- - - - -+ - - - - - - - - - - -+
|
0 |
2 |
|
2 |
4 |
|
3 |
1 |
|
5 |
4 |
|
7 |
2 |
+ -- - - - -+ - - - - - - - - - - -+

9. Donnons la liste des identifiants et des noms des pres, suivis des identifiants de leurs pre et
mre ainsi que du nombre de leurs enfants.

3.3. Interrogation de la base Fruits_d_ete

61

mysql > SELECT *


-> FROM Arbre
-> JOIN ( SELECT pere , COUNT ( id )
->
FROM Arbre
->
GROUP BY pere ) AS T ON T . pere = Arbre . id ;
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - - - -+ - - - - - - - - - - -+
| id | nom
| pere | mere | pere | COUNT ( id ) |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - - - -+ - - - - - - - - - - -+
| 2 | Mallette |
0 |
0 |
2 |
4 |
| 3 | Nain
|
2 |
1 |
3 |
1 |
| 5 | Imz
|
2 |
1 |
5 |
4 |
| 7 | BDM
|
3 |
13 |
7 |
2 |
+ -- - -+ - - - - - - - - - -+ - - - - - -+ - - - - - -+ - - - - - -+ - - - - - - - - - - -+

10. Donnons la liste des noms des individus qui nont pas de descendance.
mysql > SELECT nom
-> FROM Arbre
-> WHERE ( id NOT IN ( SELECT pere FROM Arbre ) )
AND ( id NOT IN ( SELECT mere FROM Arbre )
+ -- - - - - - - -+
| nom
|
+ -- - - - - - - -+
| 51
|
| P4
|
| XVI
|
| Tonio
|
| Gadette |
+ -- - - - - - - -+

3.3

);

Interrogation de la base Fruits_d_ete

1. Donnons la table des dates de commandes suivies du nom du client et de la ville de livraison.
mysql > SELECT date , nom , v i l l e _ l i v r a i s o n
-> FROM C l i e n t s
-> JOIN C o m m a n d e s ON C l i e n t s. id = C o m m a n d e s. client ;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| date
| nom
| ville_livraison |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+
| 2014 -05 -10 | FAURE
| Carcassonne
|
| 2014 -05 -10 | P E C A T T E
| Castres
|
| 2014 -05 -12 | FAURE
| Carcassonne
|
| 2014 -05 -12 | FAURE
| Carcassonne
|
| 2014 -05 -14 | SOLE - P O M M I E S | Revel
|
| 2014 -05 -15 | B R O U H A R D
| Pamiers
|
| 2014 -05 -15 | BOUTY
| Agen
|
| 2014 -05 -15 | SOLE - P O M M I E S | Revel
|
| 2014 -05 -15 | SOLE - P O M M I E S | Revel
|
| 2014 -05 -15 | CERDA
| Albi
|
| 2014 -05 -20 | FAURE
| Carcassonne
|
| 2014 -05 -20 | C H A R R I E R
| Pamiers
|
| 2014 -05 -20 | C H A R R I E R
| Pamiers
|
| 2014 -05 -20 | B R O U H A R D
| Pamiers
|
| 2014 -05 -23 | L E O N A R D I
| Toulouse
|
| 2014 -05 -23 | L E O N A R D I
| Toulouse
|
| 2014 -05 -23 | PRENAT - VILLE | G a i l l a c
|
| 2014 -05 -25 | JAUROU
| Castres
|
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+

3. BASE DE DONNES RELATIONNELLE

62

2. Donnons la table des noms des clients qui ont pass commande suivi de la date de la commande
et de la varit du fruit command.
mysql > SELECT C l i e n t s. nom , C o m m a n d e s . date , Stock . v a r i e t e
-> FROM C o m m a n d e s
-> JOIN C l i e n t s ON C l i e n t s. id = C o m m a n d e s. client
-> JOIN Stock ON Stock . id = C o m m a n d e s. p r o d u i t;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| nom
| date
| variete
|
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| FAURE
| 2014 -05 -10 | a n d a l o u s e d hiver |
| PECATTE
| 2014 -05 -10 | g a r i g u e t t e
|
| FAURE
| 2014 -05 -12 | burlat
|
| FAURE
| 2014 -05 -12 | burlat
|
| SOLE - P O M M I E S | 2014 -05 -14 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -15 | c h a r l o t t e
|
| BOUTY
| 2014 -05 -15 | n a p o l e o n
|
| SOLE - P O M M I E S | 2014 -05 -15 | n a p o l e o n
|
| SOLE - P O M M I E S | 2014 -05 -15 | coeur de pigeon
|
| CERDA
| 2014 -05 -15 | c h a r l o t t e
|
| FAURE
| 2014 -05 -20 | c h a r l o t t e
|
| CHARRIER
| 2014 -05 -20 | a n d a l o u s e d hiver |
| CHARRIER
| 2014 -05 -20 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -20 | g a r i g u e t t e
|
| LEONARDI
| 2014 -05 -23 | g a r i g u e t t e
|
| LEONARDI
| 2014 -05 -23 | g a r i g u e t t e
|
| PRENAT - VILLE | 2014 -05 -23 | g a r i g u e t t e
|
| JAUROU
| 2014 -05 -25 | a n d a l o u s e d hiver |
+ - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

3. Donnons la table des noms des clients qui ont pass des commandes de fraises suivi de la date de
la commande et de la varit de fraise commande.
mysql >
->
->
->
->

SELECT C l i e n t s. nom , C o m m a n d e s . date , Stock . v a r i e t e


FROM C o m m a n d e s
JOIN C l i e n t s ON C l i e n t s. id = C o m m a n d e s. client
JOIN Stock ON Stock . id = C o m m a n d e s. p r o d u i t
WHERE Stock . fruit = f r a i s e s ;

+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| nom
| date
| variete
|
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| FAURE
| 2014 -05 -10 | a n d a l o u s e d hiver |
| PECATTE
| 2014 -05 -10 | g a r i g u e t t e
|
| SOLE - P O M M I E S | 2014 -05 -14 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -15 | c h a r l o t t e
|
| CERDA
| 2014 -05 -15 | c h a r l o t t e
|
| FAURE
| 2014 -05 -20 | c h a r l o t t e
|
| CHARRIER
| 2014 -05 -20 | a n d a l o u s e d hiver |
| CHARRIER
| 2014 -05 -20 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -20 | g a r i g u e t t e
|
| LEONARDI
| 2014 -05 -23 | g a r i g u e t t e
|
| LEONARDI
| 2014 -05 -23 | g a r i g u e t t e
|
| PRENAT - VILLE | 2014 -05 -23 | g a r i g u e t t e
|
| JAUROU
| 2014 -05 -25 | a n d a l o u s e d hiver |
+ - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

4. Donnons la table des noms des clients qui ont pass des commandes de fraises entre le 14 mai 2014
et le 22 mai 2014 (inclus) suivi de la date de la commande et de la varit de fraise commande.
mysql > SELECT C l i e n t s. nom , C o m m a n d e s . date , Stock . v a r i e t e

3.3. Interrogation de la base Fruits_d_ete

63

->
->
->
->

FROM C o m m a n d e s
JOIN C l i e n t s ON C l i e n t s. id = C o m m a n d e s. client
JOIN Stock ON Stock . id = C o m m a n d e s. p r o d u i t
WHERE Stock . fruit = f r a i s e s AND ( C o m m a n d e s. date B E T W E E N 2014 -05 -14 AND
2014 -05 -22) ;
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| nom
| date
| variete
|
+ -- - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+
| SOLE - P O M M I E S | 2014 -05 -14 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -15 | c h a r l o t t e
|
| CERDA
| 2014 -05 -15 | c h a r l o t t e
|
| FAURE
| 2014 -05 -20 | c h a r l o t t e
|
| CHARRIER
| 2014 -05 -20 | a n d a l o u s e d hiver |
| CHARRIER
| 2014 -05 -20 | g a r i g u e t t e
|
| BROUHARD
| 2014 -05 -20 | g a r i g u e t t e
|
+ - - - - - - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+

5. Donnons la table des quantits totales de produits commands en fonction des jours o ont ts
passes les commandes.
mysql > SELECT date , SUM ( q u a n t i t e)
-> FROM C o m m a n d e s
-> GROUP BY date ;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| date
| SUM ( q u a n t i t e) |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+
| 2014 -05 -10 |
30 |
| 2014 -05 -12 |
15 |
| 2014 -05 -14 |
10 |
| 2014 -05 -15 |
55 |
| 2014 -05 -20 |
40 |
| 2014 -05 -23 |
40 |
| 2014 -05 -25 |
30 |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+

6. Donnons la table des quantits totales de produits commands en fonction des jours o ont ts
passes les commandes, suivis de la quantit de la plus grosse commande du jour, de la quantit
de la plus petite commande du jour et du nombre de commandes passes ce jour.
mysql > SELECT date , SUM ( q u a n t i t e) , MAX ( q u a n t i t e) , MIN ( q u a n t i t e) , COUNT ( id )
-> FROM C o m m a n d e s
-> GROUP BY date ;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| date
| SUM ( q u a n t i t e) | MAX ( q u a n t i t e) | MIN( q u a n t i t e ) | COUNT ( id ) |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| 2014 -05 -10 |
30 |
20 |
10 |
2 |
| 2014 -05 -12 |
15 |
10 |
5 |
2 |
| 2014 -05 -14 |
10 |
10 |
10 |
1 |
| 2014 -05 -15 |
55 |
15 |
10 |
5 |
| 2014 -05 -20 |
40 |
15 |
5 |
4 |
| 2014 -05 -23 |
40 |
20 |
10 |
3 |
| 2014 -05 -25 |
30 |
30 |
30 |
1 |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

7. Donnons la table des quantits totales de produits commands entre le 11 mai 2014 et le 20 mai
2014 inclus en fonction des jours o ont ts passes les commandes, suivis de la quantit de la
plus grosse commande du jour, de la quantit de la plus petite commande du jour et du nombre
de commandes passes ce jour.
mysql > SELECT date , SUM ( q u a n t i t e) , MAX ( q u a n t i t e) , MIN ( q u a n t i t e) , COUNT ( id )

3. BASE DE DONNES RELATIONNELLE

64

-> FROM C o m m a n d e s
-> WHERE date B E T W E E N 2014 -05 -11 AND 2014 -05 -20
-> GROUP BY date ;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| date
| SUM ( q u a n t i t e) | MAX ( q u a n t i t e) | MIN( q u a n t i t e ) | COUNT ( id ) |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| 2014 -05 -12 |
15 |
10 |
5 |
2 |
| 2014 -05 -14 |
10 |
10 |
10 |
1 |
| 2014 -05 -15 |
55 |
15 |
10 |
5 |
| 2014 -05 -20 |
40 |
15 |
5 |
4 |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

8. Donnons, pour les commandes passes entre le 11 mai 2014 et le 20 mai 2014 inclus, la table des
quantits totales de produits commands lorsque cette dernire dpasse 20, suivis de la quantit
de la plus grosse commande du jour, de la quantit de la plus petite commande du jour et du
nombre de commandes passes ce jour.
mysql > SELECT date , SUM ( q u a n t i t e) , MAX ( q u a n t i t e) , MIN ( q u a n t i t e) , COUNT ( id )
-> FROM C o m m a n d e s
-> WHERE date B E T W E E N 2014 -05 -11 AND 2014 -05 -20
-> GROUP BY date
-> HAVING SUM ( q u a n t i t e) >= 20;
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| date
| SUM ( q u a n t i t e) | MAX ( q u a n t i t e) | MIN( q u a n t i t e ) | COUNT ( id ) |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+
| 2014 -05 -15 |
55 |
15 |
10 |
5 |
| 2014 -05 -20 |
40 |
15 |
5 |
4 |
+ -- - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - -+ - - - - - - - - - - -+

3.4

Illustration de lintrt dune jointure

1. Rappel des tables de base MPSI_Fermat.


mysql > USE M P S I _ F e r m a t
R e a d i n g table i n f o r m a t i o n for c o m p l e t i o n of table and column names
You can turn off this f e a t u r e to get a q u i c k e r s t a r t u p with -A
Database changed
mysql > SELECT *
-> FROM C l a s s e s M P;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | MPSI -1
|
47 |
| 2 | MPSI -2
|
46 |
| 3 | MPSI -3
|
44 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT * FROM P r o f _ m a t h s;
+ -- - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - -+ - - - - - - - -+
| M . Ginoux
| MPSI -2 |
| Mme Rhin
| PCSI -1 |
| Mme Cohen
| MPSI -3 |
| M . Bayle
| MPSI -1 |
| M . C h a t e l a i n | PCSI -2 |
+ -- - - - - - - - - - - - -+ - - - - - - - -+

3.4. Illustration de lintrt dune jointure

65

mysql > SELECT * FROM P r o f _ p h y s;


+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| M. BERNARD
| PCSI -1 |
| Mme G O U T E L A R D | MPSI -2 |
| M. GAILLARD
| MPSI -1 |
| M . VIGNON
| PCSI -2 |
| M . SALOME
| MPSI -3 |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+

2. Ralisons laffichage de la table des noms des professeurs de maths suivis du nombre dlves de
leur classe.
mysql > SELECT nom , n b _ e l e v e
-> FROM P r o f _ m a t h s
-> JOIN C l a s s e s M P ON P r o f _ m a t h s. classe = C l a s s e s M P. n o m _ c l a s s e;
+ -- - - - - - - - - -+ - - - - - - - - - -+
| nom
| nb_eleve |
+ -- - - - - - - - - -+ - - - - - - - - - -+
| M . Ginoux |
46 |
| Mme Cohen |
44 |
| M . Bayle |
47 |
+ -- - - - - - - - - -+ - - - - - - - - - -+

3. Cette base de donnes vous semble-t-elle bien construite ?


Combien de table faut-il modifier si le recteur dacadmie dcide de changer la MPSI-1 en une
PCSI-3 ?
Comment modifieriez-vous cette base de donnes pour obtenir plus de flexibilit dans sa gestion
au cours des annes, des rformes, des volutions des noms de classes et des changements de
professeurs ?

3. BASE DE DONNES RELATIONNELLE

66

3.5

TD Bases de donnes relationnelles

Exercice 3.5.1.
Exercice 3.5.2.
Exercice 3.5.3.

3.6. Correction des exercices du chapitre 3

3.6

Correction des exercices du chapitre 3

Corrig de lexercice 3.5.1


Corrig de lexercice 3.5.2
Corrig de lexercice 3.5.3

67

68

3. BASE DE DONNES RELATIONNELLE

69

4
Cration dune base de donnes

Chapitre

4.1

Exemple du cours

Crons la base de donnes Fruits_d_ete constitue des trois tables Stock, Clients et Commandes
ci-dessous :

id
1
2
3
4
Stock 5
6
7
8
9
10

fruit
origine
varit
conditionnement poids (kg) quantite
fraises France
gariguette
barquette
0, 25
125
fraises France
gariguette
barquette
0, 5
44
fraises France
gariguette
cagette
2
39
fraises Espagne andalouse dhiver
cagette
2
86
fraises France
mara des bois
barquette
0, 25
53
fraises France
charlotte
barquette
0, 25
0
cerises France
burlat
cagette
2
48
cerises Espagne
burlat
cagette
5
0
cerises France
coeur de pigeon
cagette
2
15
cerises France
napoleon
cagette
5
13

id
nom
ville_livraison
departement
courriel
1
M. PLANES
GAILLAC
81
totoplane@laposte.net
2
M. FAURE
CARCASSONNE
11
faurepi@free.fr
3
M. BOUTY
AGEN
47
abouty@voila.fr
4
M. LAVIRON
TOULOUSE
31
titilaviron@voila.fr
5
M. LEONARDI
TOULOUSE
31
leonardimain@laposte.net
6
M. PECATTE
CASTRES
81
bp4@laposte.net
Clients
7
M. SOLE-POMIES
REVEL
31
hkforever@voila.fr
8
M. CERDA
ALBI
81
remy.cerda@free.fr
9
M. JAUROU
CASTRES
81
ajaurou@laposte.net
10 Mlle PRENAT-VILLE
GAILLAC
81
clemprenatville@laposte.net
11
M. CHARRIER
PAMIERS
09
soldatfaupa@laposte.net
12
M. BROUHARD
PAMIERS
09
tb@free.fr
13
Mlle THIEYRE
BRIVE
19
binompmoins16@free.fr

4. CRATION DUNE BASE DE DONNES

70

id
1
2
3
4
5
6
7
8
Commandes 9
10
11
12
13
14
15
16
17
18

date
nom_client produit quantite
10 5 2014
2
4
10
10 5 2014
6
3
20
12 5 2014
2
7
5
12 5 2014
2
8
10
14 5 2014
7
1
10
15 5 2014
12
6
15
15 5 2014
3
10
10
15 5 2014
7
10
10
15 5 2014
7
9
10
15 5 2014
8
6
10
20 5 2014
2
6
10
20 5 2014
11
4
5
20 5 2014
11
3
15
20 5 2014
12
1
10
23 5 2014
5
2
10
23 5 2014
5
3
10
23 5 2014
10
3
20
25 5 2014
9
4
30

Pour crer cette base de donnes :


c
v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT / Bases de donn es/
Cours - Base - de - donnees -201
4 $ mysql -u root -p
Enter p a s s w o r d:
W e l c o m e to the MySQL m o n i t o r. C o m m a n d s end with ; or \ g .
Your MySQL c o n n e c t i o n id is 60
Server v e r s i o n: 5.5.37 -0 u b u n t u 0 . 1 2 . 0 4 . 1 ( Ubuntu )
C o p y r i g h t ( c ) 2000 , 2014 , Oracle and / or its a f f i l i a t e s. All rights r e s e r v e d .
Oracle is a r e g i s t e r e d t r a d e m a r k of Oracle C o r p o r a t i o n and / or its
a f f i l i a t e s . Other names may be t r a d e m a r k s of their r e s p e c t i v e
owners .
Type help ; or \ h for help . Type \ c to clear the c u r r e n t input s t a t e m e n t.
mysql > CREATE D A T A B A S E F r u i t s _ d _ e t e ;
Query OK , 1 row a f f e c t e d (0.00 sec )

Table Stock.
mysql > USE F r u i t s _ d _ e t e ;
Database changed
mysql > CREATE TABLE Stock (
-> id S M A L L I N T NOT NULL ,
-> fruit V A R C H A R (20) ,
-> v a r i e t e V A R C H A R (30) ,
-> c o n d i t i o n n e m e n t V A R C H A R (30) ,
-> poids D E C I M A L (5 ,3) ,
-> q u a n t i t e SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.28 sec )
mysql > D E S C R I B E Stock ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+

4.1. Exemple du cours

71

| Field
| Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | NULL
|
|
| fruit
| v a r c h a r (20) | YES |
| NULL
|
|
| variete
| v a r c h a r (30) | YES |
| NULL
|
|
| c o n d i t i o n n e m e n t | v a r c h a r (30) | YES |
| NULL
|
|
| poids
| d e c i m a l (5 ,3) | YES |
| NULL
|
|
| quantite
| s m a l l i n t (6) | YES |
| NULL
|
|
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
6 rows in set (0.01 sec )

Mais il manque la colonne correspondant lattribut origine ! il faut donc ajouter une colonne
cette table :
mysql > ALTER TABLE Stock
-> ADD o r i g i n e V A R C H A R (20) ;
Query OK , 0 rows a f f e c t e d (0.70 sec )
R e c o r d s: 0 D u p l i c a t e s : 0 W a r n i n g s: 0
mysql > D E S C R I B E Stock ;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| Field
| Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | NULL
|
|
| fruit
| v a r c h a r (20) | YES |
| NULL
|
|
| variete
| v a r c h a r (30) | YES |
| NULL
|
|
| c o n d i t i o n n e m e n t | v a r c h a r (30) | YES |
| NULL
|
|
| poids
| d e c i m a l (5 ,3) | YES |
| NULL
|
|
| quantite
| s m a l l i n t (6) | YES |
| NULL
|
|
| origine
| v a r c h a r (20) | YES |
| NULL
|
|
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
7 rows in set (0.00 sec )

Saisissons les donnes de la table Stock :


mysql > INSERT INTO Stock
-> VALUES (1 , f r a i s e s , g a r i g u e t t e , b a r q u e t t e , 0.25 , 125 , France ) ;
Query OK , 1 row a f f e c t e d (0.11 sec )
mysql > SELECT *
-> FROM Stock ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette | barquette
| 0.250 |
125 | France |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
1 row in set (0.00 sec )
mysql > INSERT INTO Stock
-> VALUES (2 , f r a i s e s , g a r i g u e t t e , b a r q u e t t e , 0.5 , 44 , France ) ;
Query OK , 1 row a f f e c t e d (0.11 sec )
mysql > INSERT INTO Stock
-> VALUES (3 , f r a i s e s , g a r i g u e t t e , c a g e t t e , 2 , 39 , France ) ;
Query OK , 1 row a f f e c t e d (0.15 sec )
mysql > SELECT *
-> FROM Stock ;
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |
| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |

4. CRATION DUNE BASE DE DONNES

72

+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
4 rows in set (0.00 sec )
mysql > INSERT INTO Stock
-> VALUES (5 , f r a i s e s , mara des bois , b a r q u e t t e , 0.25 , 53 , France ) ;
Query OK , 1 row a f f e c t e d (0.10 sec )
mysql > INSERT INTO Stock
-> VALUES (6 , f r a i s e s , c h a r l o t t e , b a r q u e t t e , 0.25 , 0 , France ) ; Query OK ,
1 row a f f e c t e d (0.21 sec )
mysql > INSERT INTO Stock
-> VALUES (7 , c e r i s e s , burlat , c a g e t t e , 2 , 48 , France ) ; Query OK , 1 row
a f f e c t e d (0.11 sec )
mysql > INSERT INTO Stock
-> VALUES (8 , c e r i s e s , burlat , c a g e t t e , 5 , 0 , E s p a g n e ) ,
->
(9 , c e r i s e s , coeur de pigeon , c a g e t t e , 2 , 15 , France ) ,
->
(10 , c e r i s e s , n a p o l e o n , c a g e t t e , 5 , 13 , France ) ;
Query OK , 3 rows a f f e c t e d (0.13 sec )
R e c o r d s: 3 D u p l i c a t e s : 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM Stock ;
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| id | fruit
| variete
| c o n d i t i o n n e m e n t | poids | q u a n t i t e | o r i g i n e |
+ - - - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
| 1 | fraises | gariguette
| barquette
| 0.250 |
125 | France |
| 2 | fraises | gariguette
| barquette
| 0.500 |
44 | France |
| 3 | fraises | gariguette
| cagette
| 2.000 |
39 | France |
| 4 | f r a i s e s | a n d a l o u s e d hiver | c a g e t t e
| 2.000 |
86 | E s p a g n e |
| 5 | f r a i s e s | mara des bois
| barquette
| 0.250 |
53 | France |
| 6 | fraises | charlotte
| barquette
| 0.250 |
0 | France |
| 7 | c e r i s e s | burlat
| cagette
| 2.000 |
48 | France |
| 8 | c e r i s e s | burlat
| cagette
| 5.000 |
0 | Espagne |
| 9 | c e r i s e s | coeur de pigeon
| cagette
| 2.000 |
15 | France |
| 10 | c e r i s e s | n a p o l e o n
| cagette
| 5.000 |
13 | France |
+ -- - -+ - - - - - - - - -+ - - - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - -+ - - - - - - - - - -+ - - - - - - - - -+
10 rows in set (0.00 sec )

Table Clients.
mysql > CREATE TABLE C l i e n t s (
-> id S M A L L I N T NOT NULL ,
-> nom V A R C H A R (20) ,
-> v i l l e _ l i v r a i s o n V A R C H A R (20) ,
-> d e p a r t e m e n t SMALLINT ,
-> c o u r r i e l V A R C H A R (30) ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.25 sec )
mysql > D E S C R I B E C l i e n t s;
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| Field
| Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | NULL
|
|
| nom
| v a r c h a r (20) | YES |
| NULL
|
|
| v i l l e _ l i v r a i s o n | v a r c h a r (20) | YES |
| NULL
|
|
| departement
| s m a l l i n t (6) | YES |
| NULL
|
|
| courriel
| v a r c h a r (30) | YES |
| NULL
|
|
+ -- - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
mysql > INSERT INTO C l i e n t s

4.1. Exemple du cours

73

-> VALUES (1 , PLANES , G a i l l a c , 81 , t o t o p l a n @ l a p o s t e . net ) ,


->
(2 , FAURE , C a r c a s s o n n e , 11 , f a u r e p i @ f r e e . fr ) ,
->
(3 , BOUTY , Agen , 47 , a b o u t y @ v o i l a . fr ) ,
->
(4 , L A V I R O N , T o u l o u s e , 31 , t i t i l a v i r o n @ v o i l a . fr ) ,
->
(5 , L E O N A R D I , T o u l o u s e , 31 , l e o n a r d i m a i n @ v o i l a . fr ) ,
->
(6 , P E C A T T E , C a s t r e s , 81 , b p 4 @ l a p o s t e. net ) ,
->
(7 , SOLE - P O M M I E S , Revel , 31 , h k f o r e v e r @ v o i l a . fr ) ,
->
(8 , CERDA , Albi , 81 , r e m y z e r d a @ f r e e . fr ) ,
->
(9 , JAUROU , C a s t r e s , 81 , z i z o u m y d r e a m @ l a p o s t e . net ) ,
->
(10 , PRENAT - VILLE , G a i l l a c , 81 , c l e m 8 1 @ l a p o s t e . net ) ,
->
(11 , C H A R R I E R , P a m i e r s , 09 , s o l d a t f a u p a @ l a p o s t e . net ) ,
->
(12 , B R O U H A R D , P a m i e r s , 09 , t b @ f r e e. fr ) ,
->
(13 , T H I E Y R E , Brive , 19 , b i n o m p m o i n s 1 6 @ f r e e . fr ) ;
Query OK , 13 rows a f f e c t e d (0.09 sec )
R e c o r d s: 13 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM C l i e n t s;
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+
| id | nom
| ville_livraison | departement | courriel
|
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+
| 1 | PLANES
| Gaillac
|
81 | t o t o p l a n @ l a p o s t e . net
|
| 2 | FAURE
| Carcassonne
|
11 | f a u r e p i @ f r e e . fr
|
| 3 | BOUTY
| Agen
|
47 | a b o u t y @ v o i l a . fr
|
| 4 | LAVIRON
| Toulouse
|
31 | t i t i l a v i r o n @ v o i l a . fr
|
| 5 | LEONARDI
| Toulouse
|
31 | l e o n a r d i m a i n @ v o i l a . fr
|
| 6 | PECATTE
| Castres
|
81 | b p 4 @ l a p o s t e . net
|
| 7 | SOLE - P O M M I E S | Revel
|
31 | h k f o r e v e r @ v o i l a . fr
|
| 8 | CERDA
| Albi
|
81 | r e m y z e r d a @ f r e e . fr
|
| 9 | JAUROU
| Castres
|
81 | z i z o u m y d r e a m @ l a p o s t e . net |
| 10 | PRENAT - VILLE | G a i l l a c
|
81 | c l e m 8 1 @ l a p o s t e . net
|
| 11 | C H A R R I E R
| Pamiers
|
9 | s o l d a t f a u p a @ l a p o s t e . net |
| 12 | B R O U H A R D
| Pamiers
|
9 | t b @ f r e e. fr
|
| 13 | T H I E Y R E
| Brive
|
19 | b i n o m p m o i n s 1 6 @ f r e e . fr
|
+ -- - -+ - - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - - - - - - - - - - - - - - - - - - - - - -+

Table Commandes.
mysql > CREATE TABLE C o m m a n d e s (
-> id S M A L L I N T NOT NULL ,
-> date DATE ,
-> client V A R C H A R (20) ,
-> p r o d u i t SMALLINT ,
-> q u a n t i t e SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.40 sec )
mysql > D E S C R I B E C o m m a n d e s ;
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| Field
| Type
| Null | Key | D e f a u l t | Extra |
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
| id
| s m a l l i n t (6) | NO
| PRI | NULL
|
|
| date
| date
| YES |
| NULL
|
|
| client
| v a r c h a r (20) | YES |
| NULL
|
|
| p r o d u i t | s m a l l i n t (6) | YES |
| NULL
|
|
| q u a n t i t e | s m a l l i n t (6) | YES |
| NULL
|
|
+ -- - - - - - - - -+ - - - - - - - - - - - - -+ - - - - - -+ - - - - -+ - - - - - - - - -+ - - - - - - -+
mysql > INSERT INTO C o m m a n d e s
-> VALUES (1 , 2014 -05 -10 , 2 , 4 , 10) ,
->
(2 , 2014 -05 -10 , 6 , 3 , 20) ,

74

4. CRATION DUNE BASE DE DONNES


->
(3 , 2014 -05 -12 , 2 , 7 , 5) ,
->
(4 , 2014 -05 -12 , 2 , 8 , 10) ,
->
(5 , 2014 -05 -14 , 7 , 1 , 10) ,
->
(6 , 2014 -05 -15 , 12 , 6 , 15) ,
->
(7 , 2014 -05 -15 , 3 , 10 , 10) ,
->
(8 , 2014 -05 -15 , 7 , 10 , 10) ,
->
(9 , 2014 -05 -15 , 7 , 9 , 10) ,
->
(10 , 2014 -05 -15 , 8 , 6 , 10) ,
->
(11 , 2014 -05 -20 , 2 , 6 , 10) ,
->
(12 , 2014 -05 -20 , 11 , 4 , 5) ,
->
(13 , 2014 -05 -20 , 11 , 3 , 15) ,
->
(14 , 2014 -05 -20 , 12 , 1 , 10) ,
->
(15 , 2014 -05 -23 , 5 , 2 , 10) ,
->
(16 , 2014 -05 -23 , 5 , 3 , 10) ,
->
(17 , 2014 -05 -23 , 10 , 3 , 20) ,
->
(18 , 2014 -05 -25 , 9 , 4 , 30) ;
Query OK , 18 rows a f f e c t e d (0.09 sec )
R e c o r d s: 18 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM C o m m a n d e s;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| id | date
| client | p r o d u i t | q u a n t i t e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+
| 1 | 2014 -05 -10 | 2
|
4 |
10 |
| 2 | 2014 -05 -10 | 6
|
3 |
20 |
| 3 | 2014 -05 -12 | 2
|
7 |
5 |
| 4 | 2014 -05 -12 | 2
|
8 |
10 |
| 5 | 2014 -05 -14 | 7
|
1 |
10 |
| 6 | 2014 -05 -15 | 12
|
6 |
15 |
| 7 | 2014 -05 -15 | 3
|
10 |
10 |
| 8 | 2014 -05 -15 | 7
|
10 |
10 |
| 9 | 2014 -05 -15 | 7
|
9 |
10 |
| 10 | 2014 -05 -15 | 8
|
6 |
10 |
| 11 | 2014 -05 -20 | 2
|
6 |
10 |
| 12 | 2014 -05 -20 | 11
|
4 |
5 |
| 13 | 2014 -05 -20 | 11
|
3 |
15 |
| 14 | 2014 -05 -20 | 12
|
1 |
10 |
| 15 | 2014 -05 -23 | 5
|
2 |
10 |
| 16 | 2014 -05 -23 | 5
|
3 |
10 |
| 17 | 2014 -05 -23 | 10
|
3 |
20 |
| 18 | 2014 -05 -25 | 9
|
4 |
30 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - -+ - - - - - - - - -+ - - - - - - - - - -+

4.2. Cration de la base MPSI_Fermat

4.2

75

Cration de la base MPSI_Fermat

mysql > CREATE D A T A B A S E M P S I _ F e r m a t ;


Query OK , 1 row a f f e c t e d (0.00 sec )
mysql > USE M P S I _ F e r m a t
Database changed
mysql > CREATE TABLE C l a s s e s M P (
-> id SMALLINT ,
-> n o m _ c l a s s e V A R C H A R (10) ,
-> n b _ e l e v e SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.40 sec )
mysql > INSERT INTO C l a s s e s M P
-> VALUES (1 , MPSI -1 , 47) ,
->
(2 , MPSI -2 , 46) ,
->
(3 , MPSI -3 , 44) ;
ERROR 1054 (42 S22 ) : U n k n o w n column MPSI in field list
mysql > INSERT INTO C l a s s e s M P
-> VALUES (1 , MPSI -1 , 47) ,
->
(2 , MPSI -2 , 46) ,
->
(3 , MPSI -3 , 44) ;
Query OK , 3 rows a f f e c t e d (0.10 sec )
R e c o r d s: 3 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM C l a s s e s M P;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | MPSI -1
|
47 |
| 2 | MPSI -2
|
46 |
| 3 | MPSI -3
|
44 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > CREATE TABLE C l a s s e s P C (
-> id SMALLINT ,
-> n o m _ c l a s s e V A R C H A R (10) ,
-> n b _ e l e v e SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.31 sec )
mysql > INSERT INTO C l a s s e s P C
-> VALUES (1 , PCSI -1 , 48) ,
->
a f f e c t e d (0.13 sec )
R e c o r d s: 2 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM C l a s s e s P C;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | PCSI -1
|
48 |
| 2 | PCSI -2
|
47 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > CREATE TABLE C l a s s e s B C P S T (
-> id SMALLINT ,

(2 , PCSI -2 , 47) ; Query OK , 2 rows

76

4. CRATION DUNE BASE DE DONNES

-> n o m _ c l a s s e V A R C H A R (10) ,
-> n b _ e l e v e SMALLINT ,
-> P R I M A R Y KEY ( id )
-> ) ;
Query OK , 0 rows a f f e c t e d (0.28 sec )
mysql > INSERT INTO C l a s s e s B C P S T
-> VALUES (1 , BCPST -11 , 42) ,
->
Query OK , 2 rows a f f e c t e d (0.10 sec )
R e c o r d s: 2 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM C l a s s e s B C P S T ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | BCPST -11
|
42 |
| 2 | BCPST -12
|
41 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > SELECT * FROM C l a s s e s M P
-> UNION
-> SELECT * FROM C l a s s e s P C
-> AS C l a s s e s _ M a t h P h y s ;
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| id | n o m _ c l a s s e | n b _ e l e v e |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
| 1 | MPSI -1
|
47 |
| 2 | MPSI -2
|
46 |
| 3 | MPSI -3
|
44 |
| 1 | PCSI -1
|
48 |
| 2 | PCSI -2
|
47 |
+ -- - -+ - - - - - - - - - - - -+ - - - - - - - - - -+
mysql > INSERT INTO P r o f _ m a t h s
-> VALUES ( M . Ginoux , MPSI -2 ) ,
->
( Mme Rhin , PCSI -1 ) ,
->
( Mme Cohen , MPSI -3 ) ;
->
( M . Bayle , MPSI -1 ) ,
->
( M . C h a t e l a i n , PCSI -2 ) ;
Query OK , 5 rows a f f e c t e d (0.16 sec )
R e c o r d s: 5 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM P r o f _ m a t h s;
+ -- - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - -+ - - - - - - - -+
| M . Ginoux
| MPSI -2 |
| Mme Rhin
| PCSI -1 |
| Mme Cohen
| MPSI -3 |
| M . Bayle
| MPSI -1 |
| M . C h a t e l a i n | PCSI -2 |
+ -- - - - - - - - - - - - -+ - - - - - - - -+
5 rows in set (0.00 sec )
mysql > CREATE TABLE P r o f _ p h y s (
-> nom V A R C H A R (20) ,
-> classe V A R C H A R (10)
-> ) ;
Query OK , 0 rows a f f e c t e d (0.32 sec )
mysql > INSERT INTO P r o f _ p h y s
-> VALUES ( M . B E R N A R D , PCSI -1 ) ,
->
( Mme G O U T E L A R D , MPSI -2 ) ,

(2 , BCPST -12 , 41) ;

4.3. Sauvegarder une base de donnes

77

->
( M . G A I L L A R D , MPSI -1 ) ,
->
( M . VIGNON , PCSI -2 ) ,
->
( M . SALOME , MPSI -3 ) ;
Query OK , 5 rows a f f e c t e d (0.11 sec )
R e c o r d s: 5 D u p l i c a t e s: 0 W a r n i n g s: 0
mysql > SELECT *
-> FROM P r o f _ p h y s;
+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| nom
| classe |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+
| M. BERNARD
| PCSI -1 |
| Mme G O U T E L A R D | MPSI -2 |
| M. GAILLARD
| MPSI -1 |
| M . VIGNON
| PCSI -2 |
| M . SALOME
| MPSI -3 |
+ -- - - - - - - - - - - - - -+ - - - - - - - -+

4.3

Sauvegarder une base de donnes

v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT$ m y s q l d u m p -u root -p F r u i t s _ d _ e t e >


F r u i t s _ d _ e t e . mysql
Enter p a s s w o r d:
v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT$ m y s q l d u m p -u root -p M P S I _ F e r m a t >
M P S I _ F e r m a t . mysql
Enter p a s s w o r d:
v i n c e n t @ T r a v a i l :~/ D o c u m e n t s/ Cours / IPT$ m y s q l d u m p -u root -p B a s e _ N o t e s > B a s e _ N o t e s
. mysql
Enter p a s s w o r d:

4.4

Correction des exercices du chapitre 4

78

4. CRATION DUNE BASE DE DONNES

Vous aimerez peut-être aussi