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