Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 Le modle relationnel
Dfini par Codd (IBM) en 1970
- Bas sur la thorie ensembliste
- Structure et langage trs simple
D_NUMAV
D_NOMAV
D_CAP
D_LOC
VOL
NUMPIL
1
2
NOMPIL
Smith
Scott
ADRESSE
Bordeaux
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
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 )
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
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
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
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
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
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
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
*
*
+
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
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 )
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
TITRE
Marion
METTEUR EN SCENE
M. Poirier
ACTEUR
MF Pisier
TITRE
Marion
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
TITRE
Speed 2
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
TITRE
Marion
La patinoire
METTEUR EN SCENE
M. Poirier
JP Toussaint
ACTEUR
MF Pisier
MF Pisier
TITRE
Marion
La patinoire
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
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
TITRE
Marion
La patinoire
METTEUR EN SCENE
M. Poirier
JP Toussaint
ACTEUR
MF Pisier
MF Pisier
TITRE
Marion
La patinoire
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
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
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
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
TITRE
Marion
La patinoire
METTEUR EN SCENE
M. Poirier
JP Toussaint
ACTEUR
MF Pisier
MF Pisier
TITRE
Marion
La patinoire
TITRE
Speed 2
Marion
La patinoire
TITRE
Speed 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
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
HORAIRE
18h00
20h00
22h00
16h00
18h00
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 :
SQL
Table
Colonne
Ligne
LONG
Flot de caractres
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>]]
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
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).
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 :
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')
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).
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.
France
AQUITAINE
Bordeaux
Bayonne
Espagne
Ile-de-France
Pau
Paris
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.
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
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.
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.
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)
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.