Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parDiodore Guilbert Modifié depuis plus de 10 années
1
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke1 SQL: Requêtes, Programmation et Triggers Chapitre 5, Sections 15.5
2
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke2 Survol des Composantes de SQL « Data manipulation language »: utilisé pour poser des requêtes et insérer, effacer ou modifier des lignes. « Data definition language »: utilisé pour créer, détruire ou modifier les tables et vues. Triggers et contraintes dintégrité avancées: utilisés pour spécifier des actions que le SGBD exécutera automatiquement. SQL incorporé: permet à SQL dêtre appelé dun langage hôte. SQL dynamique : permet de créer et dexécuter des requêtes pendant lexécution dun programme dapplication.
3
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke3 Survol des Composantes de SQL (Suite) Exécution client serveur et accès à distance aux BDs: commandes sur laccès à un serveur distant. Gestion des transactions: contrôle lexécution des transactions. Sécurité: contrôle laccès des utilisateurs au système. Divers composantes: orientation objet, récursivité, aide à la décision, XML, données spatiales, exploration des données (data mining), etc. DML, DDL, triggers et ICs seront vu dans ce module.
4
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke4 Exemples dinstances R1 S1 S2 Nous utiliseront ces instances des relations Sailors et Reserves. Si la clé pour la rélation Reserves contenait seulement les attributs sid et bid, comment la sémantique de cet exemple serait-elle différente?
5
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke5 Requête SQL de Base relation-list Une liste des noms de relation (possiblement avec une variable détendue («range-variable») après chaque nom). target-list Une liste dattributs des relations dans relation-list qualification Comparaisons (Attr op const ou Attr1 op Attr2, où op est une des opérations ) combinées en utilisant les particules logiques AND, OR et NOT. DISTINCT est un mot-clé optionnel indiquant que la réponse ne devrait pas contenir des duplicata. Par défaut les duplicata ne sont pas éliminés. SELECT [DISTINCT] target-list FROM relation-list WHERE qualification
6
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke6 Stratégie dÉvaluation Conceptuelle La sémantiques dune requête SQL est définie en termes de la stratégie dévaluation suivante: Calculer le produit Cartésien de relation-list. Effacer du résultat tous les tuples ne remplissant pas les qualifications. Effacer les attributs qui ne sont pas dans target-list. Si DISTINCT est spécifié, éliminer les ligne redondantes (duplicata). Cette stratégie est probablement la moins efficiente manière de calculer la réponse à une requête! Un optimisateur trouvera sûrement une stratégie plus efficiente de calculer les mêmes réponses.
7
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke7 Exemple dÉvaluation Conceptuelle SELECT S.sname FROM Sailors S, Reserves R WHERE S.sid=R.sid AND R.bid=103
8
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke8 Une Note sur les Variables dÉtendue Leur utilisation nest strictement nécessaire que si la même relation apparaît deux fois dans la clause FROM. Ainsi la requête précédente pourrai aussi être écrite comme suit: SELECT S.sname FROM Sailors S, Reserves R WHERE S.sid=R.sid AND bid=103 SELECT sname FROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND bid=103 Lutilisation des variables détendue est cependant considérée comme un bon style! OR
9
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke9 Trouver des navigateurs qui ont réservé au moins un bateau Lajout de DISTINCT ferait-il une différence dans cette requête? Quel serait leffet du remplacement de S.sid par S.sname dans la clause SELECT ? Lajout de DISTINCT à cette dernière variante de la requête ferait-il une différence? SELECT S.sid FROM Sailors S, Reserves R WHERE S.sid=R.sid
10
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke10 Expressions et Chaînes («Strings») Illustre lutilisation dexpressions arithmétiques et des filtrages des chaînes («string pattern matching»): Trouver des triplets (formés des âges des navigateurs et de deux autres attributs définis par des expressions) pour des navigateurs dont les noms commencent et se terminent par B et contiennent au moins 3 caractères. AS et = sont deux manières de nommer des attributs dans le résultat. LIKE est utilisé pour le filtrage des chaînes de caractères. `_ est utilisé pour un caractère (manquant) et `% tient lieu de 0 ou plus dun caractère arbitraire. SELECT S.age, age1=S.age-5, 2*S.age AS age2 FROM Sailors S WHERE S.sname LIKE B_%B
11
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke11 Trouver les sids des navigateurs qui ont réservé un bateau rouge ou vert UNION: peut être utilisée pour calculer lunion de deux ensembles de tuples qui sont compatibles vis-à-vis de lunion (Ces derniers étant eux- mêmes le résultat des requêtes SQL). Si nous remplaçons OR par AND dans la première version, quel serait le résultat? Si nous remplacons UNION par EXCEPT nous calculons la différence.) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=red OR B.color=green) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=red UNION SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=green
12
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke12 Trouver les sids des navigateurs qui ont réservé un bateau rouge et un bateau vert INTERSECT: Peut être utilisé pour calculer lintersection de deux ensembles de tuples qui compatibles vis-à-vis de lunion. Inclus dans le standard SQL/92, mais certains systèmes ne le supportent pas. Contrastez la symétrie des requêtes utilisant UNION et INTERSECT avec lasymétrie des autres requêtes exprimant la même chose. SELECT S.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color=red AND B2.color=green) SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=red INTERSECT SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=green Clé !
13
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke13 Requêtes Imbriquées («Nested Queries») Ceci est un mécanisme très puissant de SQL: une clause WHERE peut contenir une requête SQL! (En fait, les clauses FROM et HAVING le peuvent aussi.) Pour trouver les navigateurs qui nont pas réservé le bateau #103, on utilise NOT IN. La sémantique des requêtes imbriquées est comparable à lévaluation des boucles imbriquées : Pour chaque tuple de Sailors, vérifier la qualification en calculant la sousrequête. SELECT S.sname FROM Sailors S WHERE S.sid IN ( SELECT R.sid FROM Reserves R WHERE R.bid=103) Trouver les noms des navigateurs qui réservé le bateau #103:
14
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke14 Requêtes Imbriquées avec Corrélation EXISTS est un autre opérateur de comparaison densemble semblable à IN. Si UNIQUE est utilisé et * est remplacé par R.bid, la requête cherche les navigateurs avec au plus une reservation pour le bateau #103. (UNIQUE verifie sil y a des duplicata; * dénote tous les attributs. Pourquoi remplacer * par R.bid ?) Cette exemple montre pourquoi, en général, la sousrequête doit etre recalculée pour chaque tuple de Sailors. SELECT S.sname FROM Sailors S WHERE EXISTS ( SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid) Trouver les noms des navigateurs qui ont réservé le bateau #103:
15
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke15 Opérateurs de Comparaison dEnsemble On déjà vu IN, EXISTS et UNIQUE. Leur négation sont aussi utilisées NOT IN, NOT EXISTS et NOT UNIQUE. Il y a aussi: op ANY, op ALL, op IN Trouver les navigateurs dont le niveau est plus grand que celui dun navigateur appelé Horatio: SELECT * FROM Sailors S WHERE S.rating > ANY ( SELECT S2.rating FROM Sailors S2 WHERE S2.sname=Horatio)
16
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke16 Expression des Requêtes INTERSECT en Utilisant IN De même, les requêtes EXCEPT peuvent être re-écrites en utilisant NOT IN. Pour trouver les noms ( names) (pas les sid s) des navigateurs qui ont réservé des bateaux rouges et des bateaux vert, il suffit de remplacer S.sid par S.sname dans la clause SELECT. Trouver les sids des navigateurs qui ont réservé un bateau rouge et un bateau vert: SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=red AND S.sid IN ( SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=green)
17
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke17 Division en SQL Cette requête est difficile à exprimer sans utiliser EXCEPT : SELECT S.sname FROM Sailors S WHERE NOT EXISTS (( SELECT B.bid FROM Boats B) EXCEPT ( SELECT R.bid FROM Reserves R WHERE R.sid=S.sid)) SELECT S.sname FROM Sailors S WHERE NOT EXISTS ( SELECT B.bid FROM Boats B WHERE NOT EXISTS ( SELECT R.bid FROM Reserves R WHERE R.bid=B.bid AND R.sid=S.sid)) Navigateurs S tel que... il ny a aucun bateau B sans... un tuple de Reserves montrant que S a réservé B Trouver les navigateurs qui ont réservé tous les bateaux. (1) (2)
18
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke18 Opérateurs dAgrégat Ces opérateurs sont une extension très significative de lalgèbre relationnelle. COUNT (*) COUNT ( [ DISTINCT ] A) SUM ( [ DISTINCT ] A) AVG ( [ DISTINCT ] A) MAX (A) MIN (A) SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10 SELECT COUNT (*) FROM Sailors S SELECT AVG ( DISTINCT S.age) FROM Sailors S WHERE S.rating=10 SELECT S.sname FROM Sailors S WHERE S.rating= ( SELECT MAX (S2.rating) FROM Sailors S2) Une seule colonne SELECT COUNT ( DISTINCT S.rating) FROM Sailors S WHERE S.sname=Bob
19
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke19 Trouver le nom et lage du (des) navigateur(s) le(s) plus vieux La première requête est illégale! (La raison sera examinée lorsque nous discuterons GROUP BY.) La troisième requête est équivalente à la seconde et est permise dans SQL/92, mais nest pas supportée dans certains systèmes. SELECT S.sname, MAX (S.age) FROM Sailors S SELECT S.sname, S.age FROM Sailors S WHERE S.age = ( SELECT MAX (S2.age) FROM Sailors S2) SELECT S.sname, S.age FROM Sailors S WHERE ( SELECT MAX (S2.age) FROM Sailors S2) = S.age
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.