Cours 3 Erreurs ecriture SQL.frm

Transcription

Cours 3 Erreurs ecriture SQL.frm
VUES
Une vue est une relation virtuelle définie à partir d’une requête.
C’est, en fait, une requête nommée.
Syntaxe :
CREATE VIEW <NomVue> [Attributs de la vue]
AS <Spécification de la requête>
VUE : EXEMPLE
Sur le schéma du TD2 exercice 2
Create View ‘VendeurLille’
as select V.* from Vendeur V, Succursale S
where V.Succursale = S.NumSucc
and S.Ville = ‘Lille’
with check option;
[WITH CHECK OPTION]
Propriétés :
• Une vue ne contient pas de données physiques.
• Le contenu est évalué dynamiquement lors de l’accés.
• Une vue peut être basée sur des vues.
Comment le système se comporte lorsque que l’on insere dans
cette vue un vendeur dont le code de la succursale est celui
d’une succursale de Paris ?
SIMPLIFICATION DES REQUÊTES.
Objectifs :
• Indépendance logique des applications par rapport au
schéma de la base.
• Simplification des requêtes.
L’option ‘With Check Option’ indique au système qu’il doit
vérifier si les nouvelles données insérées dans la vue peuvent
l’être. C’est à dire, si elles vérifient les critères ennoncés dans
la définition de la vue.
Page 1
Exprimer la requête suivante à l’aide de vues sur la relation
R(parent, enfant):
Donner les couples de parents (père, mère) ayant au moins
deux enfants.
Exprimer maintenant la requête sans vues .....
Page 2
ERREURS DANS L’ECRITURE D’UNE REQUÊTE
SCHÉMA ET REQUÊTE
Avant de se lancer dans l’ecriture d’une requête, il faut bien
comprendre le schéma des tables sur lequel on va s’appuyer.
• Mauvaise compréhension du schéma de la base
• Mauvaise compréhension de la requête
Si le schéma est complexe, il faut le dessiner, c.a.d. dessiner les
tables et les relations entre ces tables. (c.f. TD2, exo2)
• Instances de la même table
• Oubli de clauses dans les predicats
• Doublons
En lisant la requête, on repère sur le schéma dans quel(s)
relation(s) on va trouver chaque donnée. On a alors une idée
des tables mises en jeu.
• Utilisation d’instruction ou de structures SQL incorrectes
• Erreurs de syntaxe
Si la requête est complexe, il faut la reformuler et/ou la
décomposer.
Une fois ce travail effectué, on peut commencer a écrire la
requête en algèbre relationnel puis la traduire en SQL, ou
l’ecrire directement en SQL.
Page 3
Page 4
REFORMULATION D’UNE REQUETE (1)
Paraphrasage :
REFORMULATION (2) : NÉGATION
Souvent l’inverse de la requête est plus facile à exprimer. Cela
est particulièrement vrai lorsque la requête contient :
En exprimant de manière plus détaillée une requête, elle
devient plus claire... (ou plus facilement exprimable)
•
Quels parents n’ont que des garçons ?
que
• L’ensemble des parents moins ceux qui ont au moins une
fille
Qui n’aime aucun film ?
aucun
•
tous
• Que represente ‘qui’? ..... Les spectateurs de ‘voit’
• Aimer aucun film? ..... Ne pas être ‘amateur’ dans ‘aime’
Quels sont les spectateurs (de ‘voit’) qui ne sont pas
amateur (dans ‘aime’) ?
•
Page 5
Quels sont les parents dont aucun enfant ne va à
l’école ?
• L’ensemble des parents moins ceux qui ont au moins un
enfant à l’école
•
Quels sont les parents dont tous les enfants vont à
l’école ?
• L’ensemble des parents moins les parents dont au moins
un enfant ne va pas à l’école
Quel spectateur voit tous les films (division) ?
tous
• Les spectateurs pour lesquels ils n’existe pas de film
qu’ils n’aient pas vu (double négation)
Page 6
DÉCOMPOSITION D’UNE REQUETE
UTILISER L’ALGÈBRE RELATIONNELLE
En décomposant le travail, on simplifie la compréhension et on
diminue les risques d’erreurs :
En s’entrainant un peu, il semble plus facile d’écrire une
requête en algèbre puis de la traduire en SQL.
Ex1 : Quels sont les grands parents de jacques ?
Cette traduction s’effectue de manière systématique et peut
générer des expressions un peu ‘lourde’. Toutefois, elle permet
de bien comprendre la requête.
Paraphrasage :
• Quels sont les parents des parents de jacques ?
Certaine requêtes ne peuvent s’exprimer en algèbre. Ce sont
les requêtes comprennant des count, min max, group by etc...
Toutefois, on peut souvent en exprimer une partie en algèbre.
Décomposition :
• create view ParentsJacques
as select Parent from R where Enfant = ‘Jacques’;
La traduction des opérateurs d’algèbre est assez simple excepté
pour la division.
• select Parent from R, ParentsJacques PJ
where R.Enfant = PJ.Parent;
Ex 2, 3, 4 : Requêtes précédentes sur les parents
Page 7
Page 8
TRADUCTION DE L’ALGÈBRE (1)
TRADUCTION DE L’ALGÈBRE (2)
Selection
Union
σ<critère>(R)
R∪S
select * from R where <critère>;
select * from R union select * from S;
Projection
Intersection
Π<liste>(R)
R∩S
select <liste> from R;
select * from R intersect select * from S;
select * from R where A1....An in (select * from S);
Jointures naturelle et Théta-Jointure
Difference
R<critère>S = σ<critère>(R x S)
R−S
select * from R, S where <critere>;
select * from R except select * from S;
select * from R where A1....An not in (select * from S);
Page 9
Page 10
TRADUCTION DE L’ALGÈBRE (3)
INSTANCES DE LA MEME TABLE
Division :
Il faut parfois utiliser plusieurs instances de la même table.
R÷Q
Comment savoir s’il faut utiliser plusieurs instances d’une
même table ?
On veut diviser R(A1, A2, ...,Ap,...An) par Q (A1, ..., Ap). On
obtient S (Ap+1, ....., An)
Select Ap+1, ...., An from R R1
where not exists (
Exemple 1 : Les grands parents de Jacques
select * from Q
where not exists (
select * from R R2
where R2.A1 = Q.A1
Page 11
Lorsqu’une même table est utilisée pour obtenir deux
informations de ‘sémantiques différentes’, il faut prendre
plusieurs instances de cette table.
and
R2.A2 = Q.A2
and
....
and
R2.Ap = Q.Ap
and
R2.Ap+1 = R1.Ap+1
and
....
and
R2.An = R1.An ))
select R1.Parent from R R1, R R2 where R1.Enfant =
R2.Parent and R2.Enfant = Jacques.
Ici, R2 sert à retrouver les parents de jacques. R1 sert à trouver
les parents de ces parents.
Exemple 2 : Dans la question Q2 du TD, SV sert à retrouver la
succursale du vendeur alors que SP nous donne la succursale
du projet.
Exemple 3 : Dans la question 6 du TD, V1 sert à retrouver les
ventes faites par un vendeur, V2 donne les ventes d’un projet.
Parcontre, on utilise une seule instance de projet
car on veut que ce soit le même projet pour lequel un vendeur
intervient, et pour lequel des pièces grises on été vendues.
Page 12
OUBLI DE CLAUSES DANS LES PREDICATS
BASE DE TEST (1)
Il est assez facile d’oublier une clause dans les predicats de
selection, surtout lorsque l’on joint plusieurs tables.
Pour le verifier, une règle simple pour les requêtes plates
(nécessaire mais non suffisante) :
Quand une requête est vraiment complexe, on peut, malgré
tout, avoir un doute sur la solution trouvée. Dans ce cas, il faut
créer l’extension d’une base de test afin de verifier la validité
de la requête.
Une requête impliquant n tables doit posseder au moins
(n-1) prédicats de jointure (outre les prédicats de sélection).
Preuve par l’exemple :
• un résultat positif ne prouve rien (c’est probablement
juste...)
• un résultat négatif prouve que la requête est fausse.
DOUBLONS
Deux types de doublons peuvent apparaître.
• plusieurs réponses sont identiques
• plusieurs réponses sont ‘sémantiquement équivalents’
Les premiers s’éliminent en utilisant la clause distinct.
Attention toutefois à son utilisation...
Le deuxième cas se produit lorsque l’on demande des
combinaisons (couples de personnes, ensemble de 3 pièces
etc...). Le résultat (A,B) est ‘sémantiquement équivalent’ à
(B,A)
Comment trouver l’extension la plus ‘sensible’ possible ?
c’est à dire, l’extension de taille minimum comportant tous les
cas et garantissant la validité de la requête.
Le problème est presque aussi complexe que la résolution de la
requête elle même. Parcontre, le fait d’aborder la requête de
cette manière permet souvent de mieux la comprendre.
Dans ce cas, il suffit d’utiliser un prédicat > entre chaque
composantes afin de n’obtenir qu’une seule des combinaisons
equivalentes.
Page 13
Page 14
BASE DE TEST (2)
Exemple 1 : Quels couples de parents ont au moins deux
enfants ?
Dans la base de test il faut avoir :
• des couples de parents qui ont 1, 2 et 3 enfants
• des parents seuls ayant 1, 2 et 3 enfants
Exemple 2 : Quels producteurs ne voient que les films qu’ils
produisent ?
Dans la base de test il faut avoir :
• un producteur qui ne voit aucun film
• un producteur qui ne voit que des films qu’il produit
• un producteur qui voit des films qu’il produit et d’autres
Attention, cette base n’est pas suffisante....
ex: Producteur
Titre
Spectateur
Titre
P1
T1
P1
T1
P2
T2
P2
T3
P3
T3
Page 15