Está en la página 1de 42

BASES de DONNEES

Introduction : lapproche Bases de donnes


1.1
Approche par application
1.2
Approche Bases de Donnes
Le modle relationnel
2.1
Rappels mathmatiques
2.2
Concept de Relation
2.3
Concept de Domaine
2.4
Concept dAttribut
2.5
Double vision dune relation
2.6
Concepts complmentaires
2.7
Schma relationnel et Contraintes dIntgrit
Algbre relationnelle
3.1
Projection
3.2
Slection
3.3
Jointure
Structured Query Language (SQL)
4.1
SQL LDD
4.1.1
Types syntaxiques (presque les domaines)
4.1.2
Cration de table
4.1.3
Modification de la structure d'une table
4.1.4
Consultation de la structure d'une base
4.1.5
Destruction de table
4.2
SQL LMD
4.2.1
Interrogation
4.2.2
Insertion de donnes
4.2.3
Modification de donnes
4.2.4
Suppression de donnes
Les clauses de SELECT
5.1
Expression des projections
5.2
Expression des slections
5.3
Calculs horizontaux
5.4
Calculs verticaux (fonctions agrgatives)
5.5
Expression des jointures sous forme prdicative
5.6
Autre expression de jointures : forme imbrique
5.7
Tri des rsultats
5.8
Test dabsence de donnes
5.9
Classification ou partitionnement
5.10 Recherche dans les sous-tables
5.11 Recherche dans une arborescence
5.12 Expression des divisions
5.13 Gestion des transactions
SQL comme langage de contrle des donnes
6.1
Gestion des utilisateurs et de leurs privilges
6.1.1
Cration et suppression dutilisateurs
6.1.2
Cration et suppression de droits
6.2
Cration d'index
6.3
Cration et utilisation des vues

1 Introduction : lapproche Bases de donnes


1.1 Approche par application

Automatisation des tches et enchanement de traitements


Avantages :
- Facilit de mise en uvre
- Vision globale non ncessaire
Inconvnients :
- Redondance des donnes
o dperdition de stockage
o danger dincohrence
- Dpendances des niveaux logique et physique
- Dpendances des donnes et des traitements

1.2 Approche Bases de Donnes


Bases de Donnes : Rservoir unique de donnes, commun aux diffrents utilisateurs
SGBD : Systme de Gestion de Bases de Donnes
Avantages :
- Trs nombreux
Inconvnients :
- Difficult de mise en uvre
- Nouveaux problmes de scurit
- Difficult de conception

2 Le modle relationnel
Dfini par Codd (IBM) en 1970
- Bas sur la thorie ensembliste
- Structure et langage trs simple

2.1 Rappels mathmatiques


Produit cartsiens :

A x B = { (a1b1), (a1b2), (a2b1), (a2b2), (a3b1), (a3b2) } = { (ai bj) / ai A et bj B }


Le produit cartsien de deux ensembles A et B, est lensemble A x B de tous les couples
possibles forms dun lment de A et dun lment de B.

2.2 Concept de Relation


Relation entre 2 ensembles : sous-ensemble du produit cartsien R A x B
Exemple : R1 = { (a1b1), (a2b2) }
R2 = { (a3b2) }
R3 = { (a1b1), (a1b2), (a2b1), (a2b2), (a3b1), (a3b2) } = A x B
Relation : un sous-ensemble du produit cartsien des n ensembles de valeurs qui sont
appels des domaines
Exemple : Compagnie arienne
AVION

D_NUMAV

D_NOMAV

D_CAP

D_LOC

Avion = { (100, A300, 350, Bordeaux), (101, A320, 500, Paris) }


Une relation peut-tre vue comme un ensemble de n-uplets ou tuples.
Chaque tuple dcrit un objet de lunivers rel.
La relation permet de stocker des objets de mme nature ayant les mmes donnes
descriptives

2.3 Concept de Domaine


Domaine : ensemble de valeurs dot dune smantique.
Diffrence par rapport aux types syntaxique :
des valeurs peuvent tre comparables syntaxiquement (deux entiers, deux chanes)
mais pourtant leur comparaison est absurde
Exemple : D_AGE = [0..200]
D_NBPERS = [0..200]
Question : O est la smantique ?

2.4 Concept dAttribut


Le mme domaine peut tre utilis plusieurs fois dans une relation.
Exemple : VOL D_NUMVOL x D_NUMPIL x D_NUMAV x D_VILLE x D_VILLE x
D_HEURE x D_HEURE

D_VILLE et D_HEURE apparaissent deux fois !


Attribut : explicite le rle jou par un domaine dans une relation => Deux attributs dans
une relation ne peuvent pas avoir le mme nom.
Exemple : VOL( NUMVOL :D_NUMVOL, NUMPIL :D_NUMPIL,
NUMAV :D_NUMAV, VILLE_DEP :D_VILLE,
VILLE_ARR :D_VILLE, H_DEP :D_HEURE, H_ARR :D_VILLE )
Deux attributs dont la comparaison na pas de sens doivent tre dfinis sur deux
domaines diffrents.
Deux attributs dfinis sur le mme domaine sont dits smantiquement comparables,
compatibles.

2.5 Double vision dune relation


- structure i.e. lensemble de ses attributs avec leur domaine respectif :
R( A1 :D1, A2 :D2, , An :Dn)
- ses donnes i.e. lensemble de ses tuples :
R = { t / t(A1) D1, , t(An) Dn }
Cette double vision est perceptible quand on voit la relation sous forme de table de valeurs
AVION
NUMAV
NOMAV
CAP
LOC
100
A300
350
Bordeaux
101
A320
500
Paris
PILOTE

VOL

NUMPIL
1
2

NOMPIL
Smith
Scott

ADRESSE
Bordeaux
Toulouse

NUMVOL NUMAV NUMPIL H_DEP H_ARR V_DEP


V_ARR
1
100
1
12h00
13h20 Bordeaux
Paris
2
100
2
14h00
15h00
Paris
Toulouse
3
101
1
16h00
17h30
Paris
Toulouse

2.6 Concepts complmentaires


Clef primaire : attribut ou ensemble dattributs permettant didentifier un tuple dune
relation.
Exemple : NUMAV, NUMVOL, NUMPIL
N Etudiant, N Personne
Toute relation doit avoir une clef primaire
Question : Pourquoi besoin dune clef primaire ?
Domaine primaire : domaine dfini dun attribut de la clef
Clef trangre : attribut dfini sur un domaine primaire et qui nest pas clef primaire dans
sa relation.
Exemple : VOL( , NUMPIL :D_NUMPIL, NUMAV :D_NUMAV , )
VOL
NUMVOL NUMAV NUMPIL H_DEP H_ARR V_DEP
V_ARR
1
100
1
12h00
13h20 Bordeaux
Paris
2
100
2
14h00
15h00
Paris
Toulouse
3
101
1
16h00
17h30
Paris
Toulouse

100
1
12h00
13h20 Bordeaux
Paris
Question : diffrence de smantique entre NUMPIL dans PILOTE et VOL ?
Degr dune relation : nombre dattribut
Cardinalit dune relation : nombre de tuples
Relation dynamique : possde une clef trangre
Relation statique : pas de clef trangre, indpendante des autres

2.7 Schma relationnel et Contraintes dIntgrit


Schma relationnel (schma de la BD) : ensemble de relations smantiquement lies (par
des couples clefs primaires / clefs trangres ou simplement des attributs compatibles).
En fait, dans une BD relationnelle, des rgles de cohrence doivent tre constamment
vrifies pour garantir la validit des donnes.
Ces rgles de cohrence sont appeles Contrainte dIntgrit
On distingue deux catgories de CI :
- Dpendantes de lapplication
- Lie aux concepts du relationnel
o CI de domaine : toute valeur dun attribut doit appartenir son domaine de
dfinition
o CI de relation : toute valeur de clef primaire doit exister et tre unique
Remarque : une valeur inexistante dans la base de donnes est appele valeur nulle
(NULL) (valeur impossible ou valeur inconnue)
o CI de rfrence : toute valeur de clef trangre doit exister pour la clef primaire
associe, i.e.
NUMAV dans VOL

NUMAV dans AVION

Exemple : impossible de crer un VOL si lavion et le pilote nexiste pas dj dans la base
de donnes.
Ordre dans linsertion de tuples : dabord les relations statiques puis les relations
dynamiques
Ordre dans la suppression de tuples
Ordre dans la cration des relations
CI applicatives ou dynamiques : toute contrainte de cohrence lie lapplication
Exemples :
- Pas de recouvrement de vols faits par le mme pilote ou le mme avion
- Dure dun vol tjrs > 30 minutes
- Salaire ne peut pas dcrotre.

3 Algbre relationnelle
Nous prsentons lalgbre relationnelle par lexemple
Exemple dinstance de la Base de Donnes Cinma :
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

CINE

NOM
Franais
Gaumont
Trianon
UGC Ariel

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
ADRESSE
9, rue Montesquieu
9, Cours Clemenceau
6, rue Franklin
20, rue Judaique

PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
TELEPHONE
05 56 44 11 87
05 56 52 03 54
05 56 44 35 17
05 56 44 31 17
HORAIRE
18h00
20h00
22h00
16h00
18h00

3.1 Projection
Notation : Projection( Relation / Attr )

Extraire tous les titres de tous les films :


R1 = Projection( FILM / TITRE )
FILM

TITRE
Speed 2

METTEUR EN SCENE
Jan de Bont

ACTEUR
S. Bullock

Speed 2
Speed 2
Marion
Marion
Marion
R1

Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

TITRE
Speed 2
Marion

Extraire les titres des films laffiche :


R2 = Projection( PROGRAMME / TITRE )
PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon
R2

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

HORAIRE
18h00
20h00
22h00
16h00
18h00

TITRE
Speed 2
Marion

3.2 Slection
Notations :
- Slection( Relation / Attr op Valeur ) o op est un oprateur de comparaison,
Valeur une constante.
- Slection( Relation / Attr op Attr ) o op est un oprateur de comparaison, Attr
un autre attribut de la relation.
Extraire les informations concernant les films dont le titre est Speed 2 :
R3 = Slection( FILM / TITRE = Speed 2 )
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R3

TITRE
Speed 2
Speed 2
Speed 2

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont

ACTEUR
S. Bullock
J. Patrick
W. Dafoe

Extraire les films dont un acteur est le metteur en scne de ce film :


R4 = Slection( FILM / METTEUR EN SCENE = ACTEUR )
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R4

TITRE
Marion

METTEUR EN SCENE
M. Poirier

ACTEUR
M. Poirier

Extraire les informations concernant la programmation aprs 18h00 du film Marion :


R5 = Slection( PROGRAMME / HORAIRE >= 18h00 ET TITRE = Marion )
Ou
R5_1 = Slection( PROGRAMME / HORAIRE >= 18h00 )
R5 = Slection( R5_1 / TITRE = Marion )
Ou
R5_1 = Slection( PROGRAMME / HORAIRE >= 18h00 )
R5_2 = Slection( PROGRAMME / TITRE = Marion )
R5 = Intersection( R5_1, R5_2 )
PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon
R5_1

NOM-CINE
Franais
Franais

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
TITRE
Speed 2
Speed 2

HORAIRE
18h00
20h00
22h00
16h00
18h00
HORAIRE
18h00
20h00

R5

Franais
Trianon

Speed 2
Marion

22h00
18h00

NOM-CINE
Trianon

TITRE
Marion

HORAIRE
18h00

Extraire la programmation des films dont le titre est Marion ou qui passent lUGC :
R6 = Slection( PROGRAMME / TITRE = Marion OU NOM-CINE = UGC )
Ou
R6_1 = Slection( PROGRAMME / TITRE = Marion )
R6_2 = Slection( PROGRAMME / NOM-CINE = UGC )
R6 = Union( R6_1, R6_2 )
PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

HORAIRE
18h00
20h00
22h00
16h00
18h00

R6_1

NOM-CINE
Franais
Trianon

TITRE
Marion
Marion

HORAIRE
16h00
18h00

R6_2

NOM-CINE

TITRE

HORAIRE

R6

NOM-CINE
Franais
Trianon

TITRE
Marion
Marion

HORAIRE
16h00
18h00

Extraire les cinmas qui projettent le film Marion aprs 18h00 :


R7_1 = Slection( PROGRAMME / TITRE = Marion )
R7_2 = Slection( R7_1 / HORAIRE >= 18h00 )
R7 = Projection( R7_2 / NOM-CINE, HORAIRE )
PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

HORAIRE
18h00
20h00
22h00
16h00
18h00

R7_1

NOM-CINE
Franais
Trianon

TITRE
Marion
Marion

HORAIRE
16h00
18h00

R7_2

NOM-CINE
Trianon

TITRE
Marion

HORAIRE
18h00

R7

NOM-CINE
Trianon

HORAIRE
18h00

Donner les films dans lesquels MF Pisier ne joue pas : (version 1)


R8 = Slection( FILM / ACTEUR <> MF Pisier )
Ou
R8_1 = Slection( FILM / ACTEUR = MF Pisier )
R8 = Diffrence( FILM, R8_1 )
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R8_1

TITRE
Marion

METTEUR EN SCENE
M. Poirier

ACTEUR
MF Pisier

R8

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
M. Poirier

Ceci ne rpond pas la question !

3.3 Jointure
Notation : Jointure( Relation1, Relation2 / Attr1 op Attr2 ) o op est un oprateur de
comparaison, Attr1 est un attribut de Relation1 et Attr2 est un attribut de Relation2.

Exemple:
R_A

A1
*
?
+

A2
a1
a2
a3

R_B

B1
*
*
+

Produit cartsien (R_A x R_B)

A1
*
*
*
*
?
?
?
?
+
+
+
+

A2
a1
a1
a1
a1
a2
a2
a2
a2
a3
a3
a3
a3

B1
*
*
+
*
*
+
*
*
+

B2
b1
b2
b3
b4
b1
b2
b3
b4
b1
b2
b3
b4

Jointure( R_A, R_B / A1 = B1 )

A1
*
*
+

A2
a1
a1
a3

B1
*
*
+

B2
b1
b3
b4

A1
*
*
?
?
?
?
+
+
+

A2
a1
a1
a2
a2
a2
a2
a3
a3
a3

B1
+
*
*
+
*
*

B2
b2
b4
b1
b2
b3
b4
b1
b2
b3

ATTENTION:
Jointure( R_A, R_B / A1 <> B1 )

Donner les films dans lesquels MF Pisier ne joue pas : (version 2)


FILM

TITRE
Speed 2
Speed 2

METTEUR EN SCENE
Jan de Bont
Jan de Bont

ACTEUR
S. Bullock
J. Patrick

B2
b1
b2
b3
b4

Speed 2
Marion
Marion
Marion

Jan de Bont
M. Poirier
M. Poirier
M. Poirier

W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R8_1 = Slection( FILM / ACTEUR = MF Pisier )


R8_1

TITRE
Marion

METTEUR EN SCENE
M. Poirier

ACTEUR
MF Pisier

R8_2 = Projection( R8_1 / TITRE )


R8_2

TITRE
Marion

R8_3 = Jointure( FILM, R8_2 / FILM.TITRE <> R8_2.TITRE )


FILM x R8_2

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R8_2.TITRE
Marion
Marion
Marion
Marion
Marion
Marion

R8_3

TITRE
Speed 2
Speed 2
Speed 2

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont

ACTEUR
S. Bullock
J. Patrick
W. Dafoe

R8_2.TITRE
Marion
Marion
Marion

R8 = Projection( R8_3 / TITRE )


R8

TITRE
Speed 2

Ce rsultat est exact mais ceci ne rpond toujours pas la question !


Donner les films dans lesquels MF Pisier ne joue pas : (version 3)
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_1 = Slection( FILM / ACTEUR = MF Pisier )


R8_1

TITRE
Marion
La patinoire

METTEUR EN SCENE
M. Poirier
JP Toussaint

ACTEUR
MF Pisier
MF Pisier

R8_2 = Projection( R8_1 / TITRE )


R8_2

TITRE
Marion
La patinoire

R8_3 = Jointure( FILM, R8_2 / FILM.TITRE <> R8_2.TITRE )


FILM x R8_2

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_2.TITRE
Marion
Marion
Marion
Marion
Marion
Marion
Marion
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire

R8_3

TITRE
Speed 2
Speed 2
Speed 2
La patinoire
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
JP Toussaint
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
MF Pisier
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R8_2.TITRE
Marion
Marion
Marion
Marion
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire

R8 = Projection( R8_3 / TITRE )


R8

TITRE
Speed 2

La patinoire
Marion
Ceci ne rpond toujours pas la question !
Donner les films dans lesquels MF Pisier ne joue pas : (version 4)
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_1 = Slection( FILM / ACTEUR = MF Pisier )


R8_1

TITRE
Marion
La patinoire

METTEUR EN SCENE
M. Poirier
JP Toussaint

ACTEUR
MF Pisier
MF Pisier

R8_2 = Projection( R8_1 / TITRE )


R8_2

TITRE
Marion
La patinoire

R8_3 = Jointure( FILM, R8_2 / FILM.TITRE = R8_2.TITRE )


FILM x R8_2

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_2.TITRE
Marion
Marion
Marion
Marion
Marion
Marion
Marion
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire
La patinoire

R8_3

TITRE
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_2.TITRE
Marion
Marion
Marion
La patinoire

R8_4 = Projection( R8_3 / FILM.TITRE, FILM.MES, FILM.ACTEUR )


R8_4

TITRE
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_5 = Diffrence( FILM, R8_4 )


R8_5

TITRE
Speed 2
Speed 2
Speed 2

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont

ACTEUR
S. Bullock
J. Patrick
W. Dafoe

R8 = Projection( R8_5 / TITRE )


R8

TITRE
Speed 2

Ce rsultat est exact et ceci rpond bien la question mais il y a plus simple.
Donner les films dans lesquels MF Pisier ne joue pas : (version 4 bis)
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion
La patinoire

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier
JP Toussaint

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier
MF Pisier

R8_1 = Slection( FILM / ACTEUR = MF Pisier )


R8_1

TITRE
Marion
La patinoire

METTEUR EN SCENE
M. Poirier
JP Toussaint

ACTEUR
MF Pisier
MF Pisier

R8_2 = Projection( R8_1 / TITRE )


R8_2

TITRE
Marion
La patinoire

R8_3 = Projection( FILM, TITRE)


R8_3

TITRE
Speed 2
Marion
La patinoire

R8 = Diffrence( R8_3, R8_2 )


R8_3

TITRE
Speed 2

Ce rsultat est exact et ceci rpond bien la question.


Donner les cinmas qui projettent un film dans lequel MF Pisier est actrice (pour chaque
cinma donner le titre du film et lhoraire) :
R9_1 = Slection( FILM / ACTEUR = MF Pisier )
R9_2 = Jointure( R9_1, PROGRAMME / TITRE = TITRE )
R9 = Projection( R9_2 / NOM-CINE, TITRE, HORAIRE )
FILM

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion
Marion

METTEUR EN SCENE
Jan de Bont
Jan de Bont
Jan de Bont
M. Poirier
M. Poirier
M. Poirier

ACTEUR
S. Bullock
J. Patrick
W. Dafoe
C. Tetard
MF Pisier
M. Poirier

R9_1

TITRE
Marion

METTEUR EN SCENE
M. Poirier

ACTEUR
MF Pisier

PROGRAMME NOM-CINE
Franais
Franais
Franais
Franais
Trianon

TITRE
Speed 2
Speed 2
Speed 2
Marion
Marion

R9_2 R9_1.TITRE R9_1.METTEUR

HORAIRE
18h00
20h00
22h00
16h00
18h00

ACTEUR NOM-CINE TITRE HORAIRE

Marion
Marion

EN SCENE
M. Poirier
M. Poirier

MF Pisier
MF Pisier

Franais
Trianon

Marion
Marion

16h00
18h00

Donner les films avec leur Metteur en scne et leurs acteurs dans lesquels joue MF Pisier :

Donner les titres des films dans lesquels joue MF Pisier et qui sont laffiche :

4 Structured Query Language (SQL)


Langage de Dfinition de Donnes (LDD)
cration et modification de la structure des Bases de Donnes
Langage de Manipulation de Donnes (LMD)
insertion et modification des donnes des Bases de Donnes
Langage de Contrle des Donnes (LCD)
gestion de la scurit, confidentialit et Contraintes d'Intgrit
Petit lexique entre le modle relationnel et SQL :
Modle relationnel
Relation
Attribut
Tuple

SQL
Table
Colonne
Ligne

4.1 SQL LDD


4.1.1 Types syntaxiques (presque les domaines)
La notion de domaine n'est pas trs prsente dans les SGBD. Il nous faut donc nous limiter
la dfinition des types syntaxiques suivants dans la majorit des cas :
VARCHAR2(n)
CHAR(n)
NUMBER
NUMBER(n, m)
DATE

Chane de caractres de longueur variable (maximum n)


Chane de caractres de longueur fixe (n caractres)
Nombre entier (40 chiffres maximum)
Nombre de longueur totale n avec m dcimales
Date (DD-MON-YY est le format par dfaut)

LONG

Flot de caractres

ATTENTION : plusieurs SQL donc plusieurs syntaxes (ici ORACLE)


4.1.2 Cration de table
CREATE TABLE <nom de la table> ( <nom de colonne> <type> [NOT NULL]
[, <nom de colonne> <type>], [<contrainte>] );
o <contrainte> reprsente la liste des contraintes d'intgrit structurelles concernant les
colonnes de la table cre. Elle s'exprime sous la forme suivante :
CONSTRAINT <nom de contrainte> <sorte de contrainte>
o <sorte de contrainte> est :
- PRIMARY KEY (attribut1, [attribut2] )
- FOREIGN KEY (attribut1, [attribut2]) REFERENCES <nom de table
associe>(attribut1, [attribut2])
- CHECK (attribut <condition> ) avec <condition> qui peut tre une expression
boolenne "simple" ou de la forme IN (liste de valeurs) ou BETWEEN
<borne infrieure> AND <borne suprieure>

4.1.3 Modification de la structure d'une table


Ajout :
ALTER TABLE <nom de la table> ADD (<nom de colonne> <type>
[, <contrainte>] );
ALTER TABLE <nom de la table> ADD (<contrainte> [, <contrainte>]);
Modification :
ALTER TABLE <nom de la table> MODIFY
([<nom de colonne> <nouveau type>] [,<nom de colonne>
<nouveau type>]);

4.1.4 Consultation de la structure d'une base


DESCRIBE <nom de la table>;

4.1.5 Destruction de table


DROP TABLE <nom de la table>;

4.2 SQL LMD


4.2.1 Interrogation
SELECT [DISTINCT] <nom de colonne>[, <nom de colonne>]
FROM <nom de table>[, <nom de table>]
[WHERE <condition>]
[GROUP BY <nom de colonne>[, <nom de colonne>]
[HAVING <condition avec calcul verticaux>]]
[ORDER BY <nom de colonne>[, <nom de colonne>]]

4.2.2 Insertion de donnes


INSERT INTO <nom de table> [(colonne, )] VALUES (valeur, )
INSERT INTO <nom de table> [(colonne, )] SELECT

4.2.3 Modification de donnes


UPDATE <nom de table> SET colonne = valeur, [WHERE condition]
UPDATE <nom de table> SET colonne = SELECT

4.2.4 Suppression de donnes


DELETE FROM <nom de table> [WHERE condition]

5 Les clauses de SELECT


Base utilise :
PILOTE(NUMPIL, NOMPIL, PRENOMPIL, ADRESSE, SALAIRE, PRIME)
AVION(NUMAV, NOMAV, CAPACITE, LOCALISATION)
VOL(NUMVOL, NUMPIL, NUMAV, DATE_VOL, HEURE_DEP, HEURE_ARR,
VILLE_DEP, VILLE_ARR).
On suppose qu'un vol, rfrenc par son numro NUMVOL, est effectu par un unique
pilote, de numro NUMPIL, sur un avion identifi par son numro NUMAV.

Rappel de la syntaxe :
SELECT [DISTINCT] <nom de colonne>[, <nom de colonne>]
FROM <nom de table>[, <nom de table>]
[WHERE <condition>]
[GROUP BY <nom de colonne>[, <nom de colonne>]
[HAVING <condition avec calcul verticaux>]]
[ORDER BY <nom de colonne>[, <nom de colonne>]]

5.1 Expression des projections


SELECT
*
FROM
table
o table est le nom de la relation consulter. Le caractre * signifie qu'aucune
projection n'est ralise, i.e. que tous les attributs de la relation font partie du rsultat.
Exemple : donner toutes les informations sur les pilotes.
SELECT
*
FROM
PILOTE
La liste dattributs sur laquelle la projection est effectue doit tre prcise aprs la clause
SELECT.
Exemple : donner le nom et l'adresse des pilotes.
SELECT NOMPIL, ADRESSE
FROM
PILOTE
Alias :
SELECT
colonne [alias],
Si alias est compos de plusieurs mots (spars par des blancs), il faut utiliser des
guillemets.
Exemple : slectionner l'identificateur et le nom de chaque pilote.
SELECT NUMPIL "Num pilote", NOMPIL Nom_du_pilote
FROM
PILOTE
Suppression des duplicats : mot clef SQL DISTINCT
Exemple : quelles sont toutes les villes de dpart des vols ?
SELECT DISTINCT VILLE_DEP
FROM
VOL

5.2 Expression des slections


Clause WHERE

Exemple : donner le nom des pilotes qui habitent Bordeaux.


SELECT
NOMPIL
FROM
PILOTE
WHERE
ADRESSE = 'BORDEAUX'
Exemple : donner le nom et ladresse des pilotes qui gagnent plus de 3.000 .
SELECT
NOMPIL
FROM
PILOTE
WHERE
SALAIRE > 3000
Autres oprateurs spcifiques :
IS NULL : teste si la valeur d'une colonne est une valeur nulle (inconnue).
Exemple : rechercher le nom des pilotes dont l'adresse est inconnue.

SELECT
FROM
WHERE

NOMPIL
PILOTE
ADRESSE

IS

NULL

IN (liste) : teste si la valeur d'une colonne concide avec l'une des valeurs de la

liste.
Exemple : rechercher les avions de nom A310, A320, A330 et A340.
SELECT *
FROM
AVION
WHERE
NOMAV IN ('A310', 'A320', 'A330', 'A340')
BETWEEN v1 AND v2 : teste si la valeur d'une colonne est comprise entre les valeurs

v1 et v2 (v1 <= valeur <= v2).


Exemple : quel est le nom des pilotes qui gagnent entre 3.000 et 5.000 ?
SELECT NOMPIL
FROM
PILOTE
WHERE
SALAIRE BETWEEN 3000 AND 5000
LIKE 'chane_gnrique' . Le symbole

% remplace une chane de caractre


quelconque, y compris le vide. Le symbole _ remplace un caractre.
Exemple : quelle est la capacit des avions de type Airbus ?
SELECT CAPACITE
FROM
AVION
WHERE
NOMAV LIKE 'A%'
Ngation des oprateurs spcifiques : NOT.
Nous obtenons alors IS NOT NULL, NOT IN, NOT LIKE et NOT BETWEEN.
Exemple : quels sont les noms des avions diffrents de A310, A320, A330 et A340 ?
SELECT NOMAV
FROM
AVION
WHERE
NOMAV NOT IN ('A310','A320','A330','A340')
Oprateurs logiques : AND et OR. Le AND est prioritaire et le parenthsage doit tre utilis

pour modifier lordre dvaluation.


Exemple : quels sont les vols au dpart de Bordeaux desservant Paris ?
SELECT *
FROM
VOL
WHERE
VILLE_DEP = 'BORDEAUX' AND VILLE_ARR = 'PARIS'
Requte paramtres : les paramtres de la requtes seront quantifis au moment de
lexcution de la requte. Pour cela, il suffit dans le texte de la requte de substituer aux
diffrentes constantes de slection des symboles de variables qui doivent systmatiquement
commencer par le caractre &.
Remarque : si la constante de slection est alphanumrique, on peut spcifier &var
dans la requte, lutilisateur naura plus qu saisir la valeur, sinon il devra taper valeur.
Exemple : quels sont les vols au dpart d'une ville et dont l'heure d'arrive est infrieure
une certaine heure ?
SELECT *
FROM
VOL
WHERE
VILLE_DEP = '&1' AND HEURE_ARR < &2
Lors de l'excution de cette requte, le systme demande l'utilisateur de lui indiquer une
ville de dpart et une heure d'arrive.

5.3 Calculs horizontaux


Des expressions arithmtiques peuvent tre utilises dans les clauses WHERE et SELECT.
Ces expressions de calcul horizontal sont values puis affiches et/ou testes pour chaque
tuple appartenant au rsultat.
Exemple : donner le revenu mensuel des pilotes Toulousain.
SELECT NUMPIL, NOMPIL, SALAIRE + PRIME
FROM
PILOTE
WHERE
ADRESSE = 'TOULOUSE'
Exemple : quels sont les pilotes qui avec une augmentation de 10% de leur prime gagnent
moins de 5.000 ? Donner leur numro, leurs revenus actuel et simul.
SELECT NUMPIL, SALAIRE+PRIME, SALAIRE + (PRIME*1.1)
FROM
PILOTE
WHERE
SALAIRE + (PRIME*1.1) < 5000
Expression dun calcul :
Les oprateurs arithmtiques +, -, *, et / sont disponibles en SQL. De plus, loprateurs ||
(concatnation de chanes de caractres -ex : C1 || C2 correspond concatnation de C1 et
C2). Enfin, les oprateurs + et - peuvent tre utiliss pour ajouter ou soustraire un nombre
de jour une date. L'oprateur - peut tre utilis entre deux dates et rend le nombre de jours
entre les deux dates arguments.

Les fonctions disponibles en SQL dpendent du SGBD. Sous ORACLE, les fonctions
suivantes sont disponibles :
ABS(n)
FLOOR(n)
POWER(m, n)
TRUNC(n[, m])

la valeur absolue de n ;
la partie entire de n ;
m la puissance n ;
n tronqu m dcimales aprs le point dcimal. Si
m est ngatif, la troncature se fait avant le point
dcimal ;
ROUND(n [, d])
arrondit n dix puissance -d ;
CEIL(n)
entier directement suprieur ou gal n ;
MOD(n, m)
n modulo m ;
SIGN(n)
1 si n > 0, 0 si n = 0, -1 si n < 0 ;
SQRT(n)
racine carre de n (NULL si n < 0) ;
GREATEST(n1, n2,)
la plus grande valeur de la suite ;
LEAST(n1, n2,)
la plus petite valeur de la liste ;
NVL(n1, n2)
permet de substituer la valeur n2 n1, au cas o
cette dernire est une valeur nulle ;
LENGTH(ch)
longueur de la chane ;
SUBSTR(ch, pos [, long])
extraction d'une sous-chane de ch partir de la
position pos en donnant le nombre de caractres
extraire long ;
INSTR(ch, ssch [, pos [, n]])
position de la sous-chane dans la chane ;
UPPER(ch)
mise en majuscules ;
LOWER(ch)
mise en minuscules ;
INITCAP(ch)
initiale en majuscules ;
SOUNDEX(ch)
comparaison phontique ;
LPAD(ch, long [, car])
complte ch gauche la longueur long par car ;
RPAD(ch, long [, car])
complte ch droite la longueur long par car ;
LTRIM(ch, car)
lague gauche ch des caractres car ;
RTRIM(ch, car)
lague droite ch des caractres car ;
TRANSLATE(ch, car_source, car_cible)
change car_source par car_cible ;
TO_CHAR(nombre)
convertit un nombre ou une date en chane de
caractres ;
TO_NUMBER(ch)
convertit la chane en numrique ;
ASCII(ch)
code ASCII du premier caractre de la chane ;
CHR(n)
conversion en caractre d'un code ASCII ;
TO_DATE(ch[, fmt])
conversion d'une chane de caractres en date ;
ADD_MONTHS(date, nombre)
ajout d'un nombre de mois une date ;
MONTHS_BETWEEN(date1, date2) nombre de mois entre date1 et date2 ;
LAST_DAY(date)
date du dernier jour du mois ;
NEXT_DAY(date, nom du jour)
date du prochain jour de la semaine ;
SYSDATE
date du jour.
Exemple : donner la partie entire des salaires des pilotes.
SELECT NOMPIL,FLOOR(SALAIRE) "Salaire:partie entire"

ATTENTION : Tous les SGBD n'valuent pas correctement les expressions arithmtiques
que si les valeurs de ses arguments ne sont pas NULL. Pour viter tout problme, il
convient d'utiliser la fonction NVL (dcrite ci avant) qui permet de substituer une valeur
par dfaut aux valeurs nulles ventuelles.
Exemple : lattribut Prime pouvant avoir des valeurs nulles, la requte donnant le revenu
mensuel des pilotes toulousains doit se formuler de la faon suivante.
SELECT NUMPIL, NOMPIL, SALAIRE + NVL(PRIME,0)
FROM
PILOTE
WHERE
ADRESSE = 'TOULOUSE'
Pour plus dinformation, vous pouvez consulter cette Illustration de la gestion des valeurs nulles par
diffrents SGBD (http://dbforums.com/showthread.php?threadid=421723).

5.4 Calculs verticaux (fonctions agrgatives)


Les fonctions agrgatives s'appliquent un ensemble de valeurs d'un attribut de type
numrique sauf pour la fonction de comptage COUNT pour laquelle le type de l'attribut
argument est indiffrent.
Contrairement aux calculs horizontaux, le rsultat dune fonction agrgative est valu
une seule fois pour tous les tuples du rsultat[1].
Les fonctions agrgatives disponibles sont gnralement les suivantes :
SUM
somme,
AVG
moyenne arithmtique,
COUNT
nombre ou cardinalit,
MAX
valeur maximale,
MIN
valeur minimale,
STDDEV
cart type,
VARIANCE
variance.
Chacune de ces fonctions a comme argument un nom d'attribut ou une expression
arithmtique. Les valeurs nulles ne posent pas de problme d'valuation.
La fonction COUNT peut prendre comme argument le caractre *, dans ce cas, elle rend
comme rsultat le nombre de lignes slectionnes par le bloc.
Exemple : quel est le salaire moyen des pilotes Bordelais.
SELECT AVG(SALAIRE)
FROM
PILOTE
WHERE
ADRESSE = 'BORDEAUX'
Exemple : trouver le nombre de vols au dpart de Bordeaux.
SELECT COUNT(VOLNUM)
FROM
VOL
WHERE
VILLE_DEP = 'BORDEAUX'

Dans cette requte, COUNT(*) peut tre utiliser la place de COUNT(VOLNUM)


La colonne ou l'expression laquelle est applique une fonction agrgative peut avoir des
valeurs redondantes. Pour indiquer qu'il faut considrer seulement les valeurs distinctes, il
faut faire prcder la colonne ou l'expression de DISTINCT.
Exemple : combien de destinations sont desservies au dpart de Toulouse ?
SELECT COUNT(DISTINCT VILLE_ARR)
FROM
VOL
WHERE
VILLE_DEP = 'TOULOUSE'

5.5 Expression des jointures sous forme prdicative


La clause FROM contient tous les noms de tables fusionner. La clause WHERE exprime le
critre de jointure sous forme de condition.
ATTENTION : si deux tables sont mentionnes dans la clause FROM et quaucune jointure
nest spcifie, le systme effectue le produit cartsien des deux relations (chaque tuple de
la premire est mis en correspondance avec tous les tuples de la seconde), le rsultat est
donc faux car les liens smantiques entre relations ne sont pas utiliss. Donc respectez et
vrifiez la rgle suivante.
Si n tables apparaissent dans la clause FROM, il faut au moins (n 1) oprations de
jointure.
La forme gnrale d'une requte de jointure est :
SELECT colonne,
FROM
table1, table2
WHERE
<condition>
o <condition> est de la forme attribut1 q attribut2 et q est un
oprateur de comparaison.
Exemple : quel est le numro et le nom des pilotes rsidant dans la ville de localisation de
lavion n 33 ?
SELECT NUMPIL, NOMPIL
FROM
PILOTE, AVION
WHERE
ADRESSE = LOCALISATION AND NUMAV = 33
Les noms des colonnes dans la clause SELECT et WHERE doivent tre uniques. Ne pas
oublier de lever lambigut laide dalias (cf. auto-jointure) ou en prfixant les noms de
colonnes.
Exemple : donner le nom des pilotes faisant des vols au dpart de Bordeaux sur des
Airbus ?
SELECT DISTINCT NOMPIL
FROM
PILOTE, VOL, AVION
WHERE
VILLE_DEP = 'BORDEAUX'
AND NOMAV LIKE 'A%'

AND PILOTE.NUMPIL = VOL.NUMPIL


AND VOL.NUMAV = AVION. NUMAV
Alias de nom de table : se place dans la clause FROM aprs le nom de la table.
Exemple : quels sont les avions localiss dans la mme ville que l'avion numro 103 ?
SELECT AUTRES.NUMAV, AUTRES.NOMAV
FROM
AVION AUTRES, AVION AV103
WHERE
AV103.NUMAV = 103
AND AUTRES.NUMAV <> 103
AND AV103.LOCALISATION = AUTRES.LOCALISATION
Dans cette requte lalias AV103 est utilise pour retrouver l'avion de numro 103 et
lalias AUTRES permet de balayer tous les tuples de AVION pour faire la comparaison des
localisations.
Exemple : quelles sont les correspondances (villes darrive) accessibles partir de la ville
darrive du vol IT100 ?
SELECT DISTINCT AUTRES.VILLE_ARR
FROM
VOL AUTRES, VOL VOLIT100
WHERE
VOLIT100.NUMVOL = IT100 AND
VOLIT100.VILLE_ARR = AUTRES.VILLE_DEP
La requte recherche les vols dont la ville de dpart correspond la ville darrive du vol
IT100 puis ne conserve que les villes darrive de ces vols.

5.6 Autre expression de jointures : forme imbrique


1. Premier cas :

Le rsultat de la sous-requte est form d'une seule valeur. C'est surtout le cas de
sous-requtes utilisant une fonction agrgat dans la clause SELECT. Lattribut spcifi
dans le WHERE est simplement compar au rsultat du SELECT imbriqu laide de
loprateur de comparaison voulu.
Exemple : quel est le nom des pilotes gagnant plus que le salaire moyen des pilotes ?
SELECT NOMPIL
FROM
PILOTE
WHERE
SALAIRE > (SELECT AVG(SALAIRE) FROM PILOTE)
2. Deuxime cas :

Le rsultat de la sous-requte est form d'une liste de valeurs. Dans ce cas, le rsultat
de la comparaison, dans la clause WHERE, peut tre considr comme vrai :
soit si la condition doit tre vrifie avec au moins une des valeurs rsultats de la
sous-requte. Dans ce cas, la sous-requte doit tre prcde du comparateur suivi de
ANY (remarque : = ANY est quivalent IN) ;
soit si la condition doit tre vrifie pour toutes les valeurs rsultats de la sousrequte, alors la sous-requte doit tre prcde du comparateur suivi de
.

Exemple : quels sont les noms des pilotes en service au dpart de Bordeaux ?
SELECT NOMPIL
FROM
PILOTE
WHERE
NUMPIL IN
(SELECT DISTINCT NUMPIL
FROM
VOL
WHERE
VILLE_DEP = 'BORDEAUX')
Exemple : quels sont les numros des avions localiss Bordeaux dont la capacit est
suprieure celle de lun des appareils effectuant un Paris-Bordeaux ?
SELECT NUMAV
FROM
AVION
WHERE
LOCALISATION = BORDEAUX AND CAP > ANY
(SELECT DISTINCT CAP FROM AVION
WHERE
NUMAV = ANY
(SELECT
DISTINCT NUMAV
FROM
VOL
WHERE
VILLE-DEP = PARIS
AND VILLE_ARR = BORDEAUX ) )
Exemple : quels sont les noms des pilotes bordelais qui gagnent plus que tous les
pilotes parisiens ?
SELECT NOMPIL
FROM
PILOTE
WHERE
ADRESSE = 'BORDEAUX' AND SALAIRE > ALL
(SELECT DISTINCT SALAIRE
FROM
PILOTE
WHERE
ADRESSE = 'PARIS')
Exemple :
SELECT
FROM
WHERE

donner le nom des pilotes bordelais qui gagnent plus qu'un pilote parisien.
NOMPIL
PILOTE
ADRESSE = 'BORDEAUX' AND SALAIRE > ANY
(SELECT SALAIRE
FROM
PILOTE
WHERE
ADRESSE = 'PARIS')

3. Troisime cas :

Le rsultat de la sous-requte est un ensemble de colonnes.


le nombre de colonnes de la clause WHERE doit tre identique celui de la clause
SELECT de la sous-requte. Ces colonnes doivent tre mises entre parenthses,
la comparaison se fait entre les valeurs des colonnes de la requte et celle de la sousrequte deux deux,
il faut que loprateur de comparaison soit le mme pour tous les attributs concerns.

Exemple : rechercher le nom des pilotes ayant mme adresse et mme salaire que
Dupont.
SELECT NOMPIL

FROM
PILOTE
WHERE
NOMPIL <> 'DUPONT'
AND (ADRESSE, SALAIRE) IN
(SELECT
ADRESSE, SALAIRE
FROM
PILOTE
WHERE
NOMPIL = 'DUPONT')

5.7 Tri des rsultats


Il est possible avec SQL d'ordonner les rsultats. Cet ordre peut tre croissant (ASC) ou
dcroissant (DESC) sur une ou plusieurs colonnes ou expressions.
ORDER BY expression [ASC | DESC],
L'argument de ORDER BY peut tre un nom de colonne ou une expression base sur une
ou plusieurs colonnes mentionnes dans la clause SELECT.
Exemple : donner la liste des pilotes Bordelais par ordre de salaire dcroissant, puis par
ordre alphabtique des noms.
SELECT NOMPIL, SALAIRE
FROM
PILOTE
WHERE
ADRESSE = 'BORDEAUX'
ORDER BY SALAIRE DESC, NOMPIL

5.8 Test dabsence de donnes


Pour vrifier quune donne est absente dans la base, le cas le plus simple est celui o
lexistence de tuples est connue et on cherche si un attribut a des valeurs manquantes. Il
suffit alors dutiliser le prdicat IS NULL. Mais cette solution nest correcte que si les
tuples existent. Elle ne peut en aucun cas sappliquer si on cherche vrifier labsence de
tuples ou labsence de valeur quand on ne sait pas si des tuples existent.
Exemple : Les requtes suivantes ne peuvent pas tre formules avec IS NULL. Quels
sont les pilotes neffectuant aucun vol ? Quelles sont les villes de dpart dans lesquelles
aucun avion nest localis ?
Pour formuler des requtes de type un lment nappartient pas un ensemble donn ,
trois techniques peuvent tre utilises. La premire consiste utiliser une jointure
imbrique avec NOT IN. La sous-requte est utilise pour calculer lensemble de
recherche et le bloc de niveau suprieur extrait les lments nappartenant pas cet
ensemble.
Exemple : quels sont les pilotes neffectuant aucun vol ?
SELECT NUMPIL, NOMPIL
FROM
PILOTE
WHERE
NUMPIL
NOT IN
(SELECT NUMPIL
FROM
VOL)

Une deuxime approche fait appel au prdicat NOT EXISTS qui sapplique un bloc
imbriqu et rend la valeur vrai si le rsultat de la sous-requte est vide (et faux sinon). Il
faut faire trs attention ce type de requte car NOT EXISTS ne dispense pas dexprimer
des jointures. Ce danger est dtaill travers lexemple suivant.
Exemple : reprenons la requte prcdente. La formulation suivante est fausse.
SELECT NUMPIL, NOMPIL
FROM
PILOTE
WHERE
NOT EXISTS
(SELECT NUMPIL
FROM
VOL)
Il suffit quun vol soit cr dans la relation VOL pour que la requte prcdente retourne
systmatiquement un rsultat vide. En effet le bloc imbriqu rendra une valeur pour
NUMPIL et le NOT EXISTS sera toujours valu faux, donc aucun pilote ne sera
retourn par le premier bloc.
Le problme de cette requte est que le lien entre les lments cherchs dans les deux blocs
nest pas spcifi. Or, il faut indiquer au systme que le 2me bloc doit tre valu pour
chacun des pilotes examins par le 1er bloc. Pour cela, on introduit un alias pour la relation
PILOTE et une jointure est exprime dans le 2me bloc en utilisant cet alias. La formulation
correcte est la suivante :
SELECT NUMPIL, NOMPIL
FROM
PILOTE PIL
WHERE
NOT EXISTS
(SELECT
NUMPIL
FROM
VOL
WHERE
VOL.NUMPIL = PIL.NUMPIL)
Enfin, il est possible davoir recours loprateur de diffrence (MINUS).

5.9 Classification ou partitionnement


La classification permet de regrouper les lignes d'une table dans des classes dquivalence
ou sous-tables ayant chacune la mme valeur pour la colonne de la classification. Ces
classes forment une partition de l'extension de la relation considre (i.e. lintersection des
classes est vide et leur union est gale la relation initiale).
Exemple : considrons la relation VOL illustre par la figure 1. Partitionner cette relation
sur lattribut NUMPIL consiste regrouper au sein dune mme classe tous les vols assurs
par le mme pilote. NUMPIL prenant 4 valeurs distinctes, 4 classes sont introduites. Elles
sont mises en vidence dans la figure 2 et regroupent respectivement les vols des pilotes n
100, 102, 105 et 124.
NUMPIL
IT100
AF101
IT101
BA003

NUMPIL
100
100
102
105

NUMVOL
IT100
AF101
IT101
IT305

NUMPIL
100
100
102
102

BA045
105
IT305
102
AF421
124
BA047
105
BA087
105
Figure 1 : relation exemple VOL

BA003
105
BA045
105
BA047
105
BA087
105
AF421
124
Figure 2 : regroupement selon
NUMPIL

En SQL, loprateur de partitionnement sexprime par la clause GROUP BY qui doit suivre
la clause WHERE (ou FROM si WHERE est absente). Sa syntaxe est :
GROUP BY colonne1, [colonne2,]
Les colonnes indiques dans SELECT, sauf les attributs arguments des fonctions
agrgatives, doivent tre mentionnes dans GROUP BY.
Il est possible de faire un regroupement multi-colonnes en mentionnant plusieurs colonnes
dans la clause GROUP BY. Une classe est alors cre pour chaque combinaison distincte
de valeurs de la combinaison dattributs.
En prsence de la clause GROUP BY, les fonctions agrgatives s'appliquent l'ensemble
des valeurs de chaque classe dquivalence.
Exemple : quel est le nombre de vols effectus par chaque pilote ?
SELECT NUMPIL, COUNT(NUMVOL)
FROM
VOL
GROUP BY NUMPIL
Dans ce cas, le rsultat de la requte comporte une ligne par numro de pilote prsent
dans la relation VOL.
Exemple : combien de fois chaque pilote conduit-il chaque avion ?
SELECT NUMPIL, NUMAV, COUNT(NUMVOL)
FROM
VOL
GROUP BY NUMPIL, NUMAV
Nous obtenons ici autant de lignes par pilote qu'il y a d'avions distincts conduits le pilote
considr. Chaque classe dquivalence cre par le GROUP BY regroupe tous les vols
ayant mme pilote et mme avion.
Partitionner une relation sur un attribut clef primaire ou clef candidate est videmment
compltement inutile : chaque classe dquivalence est rduite un seul tuple !
De mme, mentionner un DISTINCT devant les attributs de la clause SELECT ne sert
rien si le bloc comporte un GROUP BY : ces attributs tant aussi les attributs de
partitionnement, il ny aura pas de duplicats parmi les valeurs ou combinaisons de valeurs
retournes. Il faut par contre faire trs attention largument des fonctions agrgatives.
Loubli dun DISTINCT peut rendre la requte fausse.
Exemple : donner le nombre de destinations desservies par chaque avion.
SELECT NUMAV, COUNT(DISTINCT VILLE_ARR)
FROM
VOL

Si le DISTINCT est oubli, cest le nombre de vols qui sera compt et la requte sera
fausse.

5.10 Recherche dans les sous-tables


Des conditions de slection peuvent tre appliques aux sous-tables engendres par la
clause GROUP BY, comme c'est le cas avec la clause WHERE pour les tables. Cette
slection s'effectue avec la clause HAVING qui doit suivre la clause GROUP BY. Sa
syntaxe est :
HAVING condition
La condition permet de comparer une valeur obtenue partir de la sous-table une
constante ou une autre valeur rsultant d'une sous-requte.
Exemple : donner le nombre de vols, s'il est suprieur 5, par pilote.
SELECT NUMPIL, NOMPIL, COUNT(NUMVOL)
FROM
PILOTE, VOL
WHERE
PILOTE.NUMPIL = VOL.NUMPIL
GROUP BY NUMPIL, NOMPIL
HAVING COUNT(NUMVOL) > 5
Exemple : quelles sont les villes partir desquelles le nombre de villes desservies est le
plus grand ?
SELECT
VILLE_DEP
FROM
VOL
GROUP BY
VILLE_DEP
HAVING
COUNT(DISTINCT VILLE_ARR) >= ALL
(SELECT COUNT(DISTINCT VILLE_ARR)
FROM
VOL
GROUP BY
VILLE_DEP)
Mme si les clauses WHERE et HAVING introduisent des conditions de slection mais
elles sont diffrentes. Si la condition doit tre vrifie par chaque tuple dune classe
dquivalence, il faut la spcifier dans le WHERE. Si la condition doit tre vrifie
globalement pour la classe, elle doit tre exprime dans la clause HAVING.

5.11 Recherche dans une arborescence


La consultation des donnes de structure arborescente est une spcificit du SGBD
ORACLE. Une telle structure de donnes est trs frquente dans le monde rel. Elle
correspond des compositions ou des liens hirarchiques.
Exemple : supposons que lon souhaite intgrer dans la base des informations sur la
rpartition gographique des villes desservies. La figure 3 illustre lorganisation
hirarchique des valeurs des diffrentes localisations rpertorier.
Europe

France
AQUITAINE
Bordeaux

Bayonne

Espagne
Ile-de-France

Pau

Paris

Figure 3 : hirarchie des localisation


La relation LIEU est ajoute au schma initial de la base pour reprsenter de manire
plate la structure arborescente donne ci-dessus. Cette relation a le schma suivant :
LIEU ( LIEUSPEC, LIEUGEN ).
Lattribut LIEUGEN est dfini sur le mme domaine que LIEUSPEC. Cest donc une clef
trangre rfrenant la clef primaire de sa propre relation.
L'extension de cette relation, correspondant la hirarchie prcdente, est la suivante :
LIEUSPEC
LIEUGEN
EUROPE
NULL
FRANCE
EUROPE
ESPAGNE
EUROPE
AQUITAINE
FRANCE
ILE-DE-FRANCE
FRANCE
BORDEAUX
AQUITAINE
BAYONNE
AQUITAINE
PAU
AQUITAINE
PARIS
ILE-DE-FRANCE
Figure 4 : reprsentation relationnelle de la hirarchie des localisations
La syntaxe gnrale d'une requte de recherche dans une arborescence est :
SELECT
colonne,
FROM
table [alias],
[WHERE
condition]
CONNECT BY [PRIOR]
colonne1 = [PRIOR] colonne 2
[AND
condition]
[START WITH
condition]
[ORDER BY LEVEL]
La clause START WITH fixe le point de dpart de la recherche dans l'arborescence.
La clause CONNECT BY PRIOR fixe le sens de parcours de l'arborescence. Ce parcours
peut se faire :
de haut en bas, i.e. qu'il correspond la recherche de sous-arbres ;
de bas en haut, i.e. qu'il correspond la recherche du ou des anctres .
Le parcours de haut en bas est spcifi en faisant prcder la colonne reprsentant un
fils dans l'arborescence par le mot-clef PRIOR comme suit :
CONNECT BY PRIOR <fils> = <pre>

Le parcours de bas en haut est spcifi en faisant prcder la colonne reprsentant un


pre par le mot-clef PRIOR. Il peut s'exprimer aussi de deux faons :
CONNECT BY <fils> = PRIOR <pre>
ou
CONNECT BY PRIOR <pre> = <fils>
Remarque : avec la reprsentation relationnelle plate, le <fils> dans une structure
hirarchique correspond la clef primaire de la relation, le <pre> la clef trangre.
Lorsque la valeur de lattribut <fils> est la racine de la hirarchie, la valeur de
lattribut <pre> est une valeur nulle : il sagit dun cas exceptionnel o lon admettra
une valeur nulle pour une clef trangre.
Exemple : donner la liste des villes desservies en France.
SELECT
LIEUSPEC
FROM
LIEU
CONNECT BY PRIOR
LIEUSPEC = LIEUGEN
START WITH
LIEUGEN = FRANCE
Exemple : o se situe (continent, pays, rgion) la ville de Valladolid ?
SELECT
LIEUSPEC
FROM
LIEU
CONNECT BY
LIEUSPEC = PRIOR LIEUGEN
START WITH
LIEUSPEC = VALLADOLID
La clause facultative[AND condition] permet de spcifier une condition value lors
de la recherche dans un sous-arbre. Plus prcisment, si la condition nest pas satisfaite
pour un nud de la hirarchie alors quaucun de ses descendants ne sera plus examin.
Exemple : donner la liste des villes desservies en France en dehors de la rgion
AQUITAINE.
SELECT
LIEUSPEC
FROM
LIEU
CONNECT BY PRIOR
LIEUSPEC = LIEUGEN
AND
LIEUGEN <> AQUITAINE
START WITH
LIEUGEN = FRANCE
ORDER BY LEVEL
Ds quun nud ne vrifiant pas la condition donne est trouv, le sous-arbre dont ce nud
est racine est limin de la recherche, donc la rgion AQUITAINE et toutes les villes de
cette rgion nappartiendront pas au rsultat.
ORACLE associe une numrotation aux nuds d'une arborescence : c'est la notion de
niveau (LEVEL). En fait le premier nud rpondant la requte est considr de niveau 1,
ses fils (dans le cas d'une recherche de haut en bas) ou son pre (dans le cas d'une
recherche de bas en haut) sont considrs de niveau 2, et ainsi de suite.
Cette numrotation peut tre utilise pour classer les rsultats (clause ORDER
BY
LEVEL) et surtout pour en donner une meilleure prsentation. Celle-ci s'obtient en utilisant
la fonction LPAD qui permet une indentation.

Exemple : pour obtenir la liste des villes desservies en France mais avec prsentation plus
claire, nous pouvons formuler la requte comme suit :
SELECT
LPAD('-', 2*LEVEL,' ')|| LIEUSPEC
FROM
LIEU
CONNECT BY PRIOR LIEUSPEC = LIEUGEN
START WITH
LIEUGEN = FRANCE
ORDER BY LEVEL
|| est le symbole de concatnation de deux chanes de caractres.
La fonction LPAD permet d'ajouter la chane '-', un nombre d'espaces gal au double du
niveau, devant chaque valeur de LIEUSPEC pour mieux visualiser la division
gographique.

5.12 Expression des divisions


La division consiste rechercher les tuples qui se trouvent associs tous les tuples dun
ensemble particulier (le diviseur). SQL ne propose pas doprateur de division
(quantificateur universel "tous les"). Il est nanmoins possible dexprimer cette opration
mais de manire peu naturelle. Les deux techniques utilises consistent reformuler la
requte diffremment, on parle de paraphrasage. Elles ne sont pas systmatiquement
applicables (suivant linterrogation pose).
La premire technique a recours aux partitionnements et fonctions agrgatives. Pour savoir
si un tuple t est associ tous les tuples du diviseur, lide est de compter dune part le
nombre de tuples associs t et dautre part le nombre de tuples du diviseur puis de
comparer les valeurs obtenues.
Exemple : quels sont les numros des pilotes qui conduisent tous les avions de la
compagnie ?
Pour l'exprimer en SQL avec la premire technique expose, cette requte est traduite de la
manire suivante : Quels sont les pilotes qui conduisent autant d'avions que la compagnie
en possde ? .
SELECT
NUMPIL
FROM
VOL
GROUP BY
NUMPIL
HAVING
COUNT(DISTINCT NUMAV) =
(SELECT COUNT(NUMAV)
FROM
AVION)
Le comptage dans la clause HAVING permet pour chaque pilote de dnombrer les appareils
conduits. Loubli du DISTINCT rend la requte fausse (on compterait alors le nombre de
vols assurs).
Cette technique de paraphrasage ne peut tre utilise que si les deux ensembles
dnombrs sont parfaitement comparables.

La deuxime forme d'expression des divisions est plus dlicate formuler. Elle se base sur
une double ngation de la requte et utilise la clause NOT EXISTS. Au lieu dexprimer
quun tuple t doit tre associ tous les tuples du diviseur pour appartenir au rsultat, on
recherche t tel quil nexiste aucun tuple du diviseur qui ne lui soit pas associ. Rechercher
des tuples associs ou non, signifie concrtement effectuer des oprations de jointure.
Exemple : quels sont les numros des pilotes qui conduisent tous les avions de la
compagnie ?
Pour l'exprimer en SQL, cette requte est traduite par : "Existe-t-il un pilote tel qu'il
n'existe aucun avion de la compagnie qui ne soit pas conduit par ce pilote ?".
SELECT
FROM
WHERE

NUMPIL
PILOTE P
NOT EXISTS
(SELECT *
FROM
AVION A
WHERE
NOT EXISTS
(SELECT *
FROM
VOL
WHERE
VOL.NUMAV = A.NUMAV AND
VOL.NUMPIL = P.NUMPIL ))

Dtaillons lexcution de cette requte. Pour chaque pilote examin par le 1er bloc, les
diffrents tuples de AVION sont balays au niveau du 2me bloc et pour chaque avion, les
conditions de jointure du 3me bloc sont values. Supposons que les trois relations de la
base sont rduites aux tuples prsents dans la figure suivante.
PILOTE
NUMPIL
100
101
102

AVION
NUMAV
10
21

VOL
NUMVOL NUMPIL NUMAV
IT100
100
10
IT200
100
10
AF214
101
21
AF321
102
10
AF036
101
10

Figure 5 : une instance de la base


Considrons le pilote n 100. Parcourons les tuples de la relation AVION. Pour lavion n
10, le 3me bloc retourne un rsultat (le vol IT100), NOT EXISTS est donc faux et lavion
n 10 nappartient pas au rsultat du 2me bloc. Lavion n 21 ntant jamais pilot par le
pilote 100, le 3me bloc ne rend aucun tuple, le NOT EXISTS associ est donc valu
vrai. Le 2me bloc rend donc un rsultat non vide (lavion n 21) et donc le NOT EXISTS
du 1er bloc est faux. Le pilote n 100 nest donc pas retenu dans le rsultat de la requte.
Pour le pilote 101 et lavion 10, il existe un vol (AF214). Le 3me bloc retourne un rsultat,
NOT EXISTS est donc faux. Pour le mme pilote et lavion n 21, le 3me bloc restitue un
tuple et nouveau NOT EXISTS est faux. Le 2me bloc rend donc un rsultat vide ce qui
fait que le NOT EXISTS du 1er bloc est valu vrai. Le pilote 101 fait donc partie du

rsultat de la requte. Le processus dcrit est nouveau excut pour le pilote 102 et
comme il ne pilote pas lavion 21, le 2me bloc retourne une valeur et la condition du 1er
bloc limine ce pilote du rsultat.

5.13 Gestion des transactions


Comme tout SGBD, ORACLE est un systme transactionnel, i.e. il gre les accs
concurrents de multiples utilisateurs des donnes frquemment mises jour et soumises
diverses contraintes. Une transaction est une squence doprations manipulant les donnes.
Excute sur une base cohrente, elle laisse la base dans un tat cohrent : toutes les
oprations sont ralises ou aucune.
Les commandes COMMIT et ROLLBACK de SQL permettent de contrler la validation et
l'annulation des transactions :
- COMMIT : valide la transaction en cours. Les modifications de la base deviennent
dfinitives ;
- ROLLBACK : annule la transaction en cours. La base est restaure dans son tat au
dbut de la transaction.
Une modification directe de la base (INSERT, UPDATE ou DELETE) ne sera valide que
par la commande COMMIT, ou lors de la sortie normale de sqlplus par la commande EXIT.
Il est possible de se mettre en mode "validation automatique", dans ce cas, la validation est
effectue automatiquement aprs chaque commande SQL de mise jour de donnes. Pour
se mettre dans ce mode, il faut utiliser l'une des commandes suivantes :
SET AUTOCOMMIT IMMEDIATE ou SET AUTOCOMMIT ON
L'annulation de ce mode se fait avec la commande : SET AUTOCOMMIT OFF

6 SQL comme langage de contrle des donnes


6.1 Gestion des utilisateurs et de leurs privilges
6.1.1 Cration et suppression dutilisateurs
Pour pouvoir accder ORACLE, un utilisateur doit tre identifi en tant que tel par le
systme. Pour ce faire, il doit avoir un nom, un mot de passe et un ensemble de privilges
(ou droits).
Seul un administrateur (DBA - Data Base Administrator) peut crer des utilisateurs. La
commande de cration est la suivante :
GRANT [CONNECT, ][RESOURCE,] [DBA]
TO utilisateur,
[IDENTIFIED BY mot_de_passe,]
Les options CONNECT, RESOURCE et DBA dterminent la classe de l'utilisateur crer,
i.e. les droits qui lui sont attribus. Les droits associs ces options sont :
- La connexion (CONNECT) :

Connexion tous les outils ORACLE ;


Manipulation des donnes sur lesquelles une autorisation a t attribue au
pralable ;
- Cration des vues et synonymes.
-

La cration de ressources (RESOURCE)


Cette option n'est applicable que pour les utilisateurs ayant le privilge CONNECT.
Elle offre en plus les droits suivants :
- Cration des tables et index ;
- Attribution et rsiliation de privilges sur des tables et index d'autres utilisateurs ;

L'administration (DBA)
Cette option englobe les droits des deux options prcdentes. Elle offre en plus les
droits suivants :
- Accs toutes les donnes de tous les utilisateurs ;
- Cration et suppression d'utilisateurs et de droits.

La clause IDENTIFIED BY n'est obligatoire que lors de la cration d'un nouvel


utilisateur ou pour modifier le mot de passe d'un utilisateur existant. Il est aussi possible de
crer ou d'attribuer les mmes privilges un ensemble d'utilisateurs dans une mme
commande.
Exemple : crer un nouvel utilisateur ut1 avec le mot de passe ut1p avec juste le droit de
connexion.
GRANT CONNECT TO ut1
IDENTIFIED BY ut1p
Cette commande ne peut tre excute que par les utilisateurs ayant le privilge DBA
Exemple : changer le mot de passe de ut1. Le nouveau mot de passe est utp.
GRANT CONNECT TO ut1 IDENTIFIED BY utp
Un utilisateur dORACLE peut tre supprim tout moment ou se voir dmuni de certains
privilges. La commande correspondante est :
REVOKE [CONNECT,] [RESOURCE,] [DBA]
FROM
utilisateur,
L'option CONNECT interdit donc l'utilisateur de se connecter de nouveau ORACLE.
6.1.2 Cration et suppression de droits
Toute table, vue ou synonyme n'est initialement accessible que par l'utilisateur qui l'a cr.
Le partage de ces objets est souvent ncessaire. Pour rendre ce partage possible, le SGBD
permet au propritaire d'un objet d'accorder des droits sur cet objet d'autres utilisateurs.
La commande d'attribution des droits a la syntaxe suivante :
GRANT
droit,
ON
objet
TO
utilisateur,
[WITH GRANT OPTION]

Les droits possibles sont :


SELECT
interrogation des donnes ;
INSERT
ajout des donnes ;
UPDATE
modification des donnes ;
DELETE
suppression des donnes ;
ALTER
modification de la structure d'une relation ;
INDEX
cration d'index ;
ALL
toutes les oprations.
Le privilge sur l'opration UPDATE peut concerner seulement quelques colonnes d'une
table.
Tout utilisateur qui reoit un privilge sur une table avec l'option WITH GRANT OPTION
a en plus le droit de l'accorder un autre utilisateur.
ALL peut tre utiliser pour dsigner tous les droits et PUBLIC pour dsigner tous les
utilisateurs.
Un droit ne peut tre retir que par l'utilisateur qui l'a accord ou bien qui a le privilge
d'administration. La syntaxe de cette commande est la suivante :
REVOKE droit,
ON
objet
FROM
utilisateur,
Exemple : attribuer puis retirer l'utilisateur ut1 le droit d'interrogation et modification de
la relation VOL.
GRANT
SELECT, UPDATE
ON VOL
TO
ut1
REVOKE SELECT, UPDATE
ON VOL
FROM
ut1
Exemple : interdire toute opration tous les utilisateurs sur la table avion.
REVOKE ALL
ON AVION
FROM
PUBLIC

6.2 Cration d'index


Pour acclrer les accs aux tuples, la cration d'index peut tre ralise pour un ou
plusieurs attributs frquemment consults. La commande utiliser est la suivante :
CREATE [UNIQUE] [NOCOMPRESS] INDEX <nom_index>
ON <nom_table> (<nom_colonne>, [nom_colonne])
Lorsque le mot-clef UNIQUE est prcis, lattribut (ou la combinaison) index doit avoir
des valeurs uniques.

Une fois quils ont t crs, les index sont automatiquement utiliss par le systme et de
manire transparente pour lutilisateur.
Remarque : lors de la spcification de la contrainte PRIMARY KEY pour un ou plusieurs
attributs ORACLE gnre automatiquement un index primaire ( UNIQUE) pour le(s)
attribut(s) concern(s).
Exemple :
CREATE INDEX

ACCES_PILOTE

ON PILOTE (NOMPIL)

6.3 Cration et utilisation des vues


Une vue permet de consulter et manipuler des donnes d'une ou de plusieurs tables. On
considre quune vue est une table virtuelle car elle peut tre utilise de la mme faon
quune relation mais ses donnes (redondantes par rapport la base originale) ne sont pas
physiquement stockes. Plus prcisment, une vue est dfinie sous forme dune requte
d'interrogation et cest cette requte qui est conserve dans le dictionnaire de la base.
L'utilisation des vues permet de :
- restreindre l'accs certaines colonnes ou certaines lignes d'une table pour certains
utilisateurs (confidentialit) ;
- simplifier la tche de l'utilisateur en le dchargeant de la formulation de requtes
complexes ;
- contrler la mise jour des donnes.
La commande de cration d'une vue est la suivante :
CREATE VIEW nom_vue [(colonne,)]
AS
<requte>
[WITH CHECK OPTION]
Si une liste de noms dattributs est prcise aprs le nom de la vue, ces noms seront ceux
des attributs de la vue. Ils correspondent, deux deux, avec les attributs indiqus dans le
SELECT de la requte dfinissant la vue. Si la liste de noms napparat pas, les attributs
de la vue ont le mme nom que ceux attributs indiqus dans le SELECT de la requte.
Il est trs important de savoir comment la vue crer sera utilise : consultation
simplement et/ou mises jour.
Exemple : pour viter que certains utilisateurs aient accs aux salaire et prime des pilotes,
la vue suivante est dfinie leur intention et ils nont pas de droits sur la relation PILOTE.
CREATE VIEW RESTRICT_PIL
AS
SELECT
NUMPIL, NOMPIL, PRENOM_PIL, ADRESSE
FROM
PILOTE

Exemple : pour pargner aux utilisateurs la formulation dune requte complexe, une vue
est dfinie par les dveloppeurs pour consulter la charge horaire des pilotes. Sa dfinition
est la suivante :
CREATE VIEW CHARGE_HOR (NUMPIL, NOM, CHARGE)
AS
SELECT P.NUMPIL, NOMPIL, SUM(HEURE_ARR HEURE_DEP)
FROM
PILOTE P, VOL
WHERE
P.NUMPIL = VOL.NUMPIL
GROUP BY P.NUMPIL, NOMPIL
Lorsque cette vue est cre, les utilisateurs peuvent la consulter simplement par :
SELECT *
FROM
CHARGE_HOR
Un utilisateur ne sintressant quaux pilotes parisiens dont la charge excde un seuil de 40
heures formulera la requte suivante.
SELECT *
FROM
CHARGE_HOR C, PILOTE P
WHERE
C.NUMPIL = P.NUMPIL AND CHARGE > 40
AND ADRESSE = PARIS

Lorsque le systme value une requte formule sur une vue, il combine la requte de
lutilisateur et la requte de dfinition de la vue pour obtenir le rsultat.
Lorsqu'une vue est utilise pour effectuer des oprations de mise jour, elle est soumise
des contraintes fortes. En effet pour que les mises jour, travers une vue, soient
automatiquement rpercutes sur la relation de base associe, il faut imprativement que :
- la vue ne comprenne pas de clause GROUP BY.
- la vue n'ait qu'une seule relation dans la clause FROM. Ceci implique que dans une
vue multi-relation, les jointures soient exprimes de manire imbrique.
Lorsque la requte de dfinition dune vue comporte une projection sur un sous-ensemble
dattributs dune relation, les attributs non mentionns prendront des valeurs nulles en cas
dinsertion travers la vue.
Exemple : dfinir une vue permettant de consulter les vols des pilotes habitant Bayonne et
de les mettre jour.
CREATE VIEW VOLPIL_BAYONNE
AS
SELECT
*
FROM
VOL
WHERE
NUMPIL IN
(SELECT NUMPIL
FROM PILOTE
WHERE ADRESSE = BAYONNE)

La vue prcdente permet la consultation uniquement des vols vrifiant la condition donne
sur le pilote associ. Il est galement possible de mettre jour la relation VOL travers
cette vue mais lopration de mise jour peut concerner nimporte quel vol (sans aucune
condition).
Par exemple supposons que le pilote n 100 habite Paris, linsertion suivante sera ralise
dans la relation VOL travers la vue, mais le tuple ne pourra pas tre visible en consultant
la vue.
INSERT INTO VOLPIL_MRS(NUMVOL,NUMPIL,NUMAV,VILLE_DEP)
VALUES
(IT256, 100, 14, PARIS)
Si la clause WITH CHECK OPTION est prsente dans lordre de cration dune vue, la
table associe peut tre mise jour, avec vrification des conditions prsentes dans la
requte dfinissant la vue. La vue joue alors le rle d'un filtre entre l'utilisateur et la table de
base, ce qui permet la vrification de toute condition et notamment des contraintes
d'intgrit.
Exemple : dfinir une vue permettant de consulter et de les mettre jour uniquement les
vols des pilotes habitant Bayonne.
CREATE VIEW VOLPIL_BAYONNE
AS
SELECT
*
FROM
VOL
WHERE
NUMPIL IN
(SELECT NUMPIL
FROM PILOTE
WHERE ADRESSE = BAYONNE)
WITH CHECK OPTION
Lajout de la clause WITH CHECK OPTION la requte prcdente interdira toute
opration de mise jour sur les vols qui ne sont pas assurs par des pilotes habitant
Bayonne et linsertion dun vol assur par le pilote n 100 chouera.
Exemple : dfinir une vue sur PILOTE, permettant la vrification de la contrainte de
domaine suivante : le salaire d'un pilote est compris entre 3.000 et 5.000.
CREATE VIEW DPILOTE
AS
SELECT
*
FROM
PILOTE
WHERE
SALAIRE BETWEEN 3000 AND 5000
WITH CHECK OPTION
Linsertion suivante va alors chouer.
INSERT INTO DPILOTE (NUMPIL,SALAIRE) VALUES(175,7000)
Exemple : dfinir une vue sur vol permettant de vrifier les contraintes d'intgrit
rfrentielle en insertion et en modification.

CREATE VIEW IMVOL


AS
SELECT
*
FROM
VOL
WHERE
NUMPIL IN
AND
NUMAV IN
WITH CHECK OPTION

(SELECT NUMPIL FROM PILOTE)


(SELECT NUMAV FROM AVION)

De manire similaire une relation de la base, une vue peut tre


- consulte via une requte d'interrogation ;
- dcrite structurellement grce la commande DESCRIBE ou en interrogeant la table
systme ALL_VIEWS ;
- dtruite par l'ordre DROP VIEW <nom_vue>.
[1] En cas de partitionnement, cette valuation est faite pour chaque classe dquivalence de tuples.

También podría gustarte