SQL query - 1 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SQL : interrogation de BD Requêtes d'interrogation simples Requêtes complexes SQL et le calcul relationnel Agrégats et groupement Couplage SQL et langage de programmation
SQL query - 2 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SQL : Rappel Structure de base d’une requête SQL simples : SELECTvar i.A ik, … attributs FROM R i1 var 1, R i2 var 2 … variables (n-uplet) WHEREP prédicat/condition où: La variable n-uplet var i « appartient » à la table R ij : R i1 (var 1 ) Les variables dans la projection (clause SELECT) et dans la condition (clause WHERE) doivent être liées dans la clause FROM. Simplifications : Si var j n’est pas spécifiée, alors la variable s’appelle par défaut R ij. Si une seule variable n-uplet possède l’attribut A, on peut écrire plus simplement A (non-ambiguïté).
SQL query - 3 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Trois opérations ensemblistes : union UNION différence − EXCEPT intersection INTERSECT Par défaut, les opérations ensemblistes éliminent les doublons (ensemble). Pour garder les doublons (multi-ensemble), il faut ajouter ALL après l’opérateur : UNION ALL, EXCEPT ALL, INTERSECT ALL Les types des deux tables doivent être “compatibles” : même nombre d'arguments du même type. Exceptions Oracle : EXCEPT est remplacé par MINUS; uniquement UNION ALL est implanté. SQL : Opérateurs ensemblistes
SQL query - 4
SQL query - 5
SQL query - 6 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Requête imbriquée dans la clause WHERE d'une requête externe: SELECT … FROM … WHERE [Opérande] Opérateur (SELECT … FROM … WHERE …) Opérateurs ensemblistes : (A 1,…A n ) IN : appartenance ensembliste EXISTS : test d’existence (réponse non-vide) (A 1,…A n ) [ALL|ANY] : comparaison avec quantificateur (ANY par défaut) SQL : Requêtes imbriquées
SQL query - 7 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SELECT … FROM … WHERE (A 1,…,A n )[NOT] IN (SELECT B 1,…,B n FROM … WHERE …) Sémantique : la condition est vraie si le n-uplet désigné par ( A 1,…, A n ) de la requête externe appartient (n’appartient pas) au résultat de la requête imbriquée. Expression « IN »
SQL query - 8 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) ALL/ANY SELECT … FROM … WHERE (A 1,…,A n ) ALL/ANY (SELECT B 1,…,B n FROM … WHERE …) On peut utiliser une comparaison {, >=, <>} et ALL ( ) ou ANY ( ) La condition est alors vraie si la comparaison est vraie pour tous les n-uplets (ALL) ou au moins un n-uplet (ANY) de la requête imbriquée. Comment peut-on exprimer « IN » avec ALL/ANY?
SQL query - 9
SQL query - 10 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SELECT … FROM … WHERE (NOT) EXISTS (SELECT * FROM … WHERE P) Sémantique procédurale : pour chaque n-uplet x de la requête externe Q, exécuter la requête interne Q’; s'il existe au moins un n-uplet y dans le résultat de la requête interne, alors sélectionner x. Sémantique logique : { x… | Q(x) (¬) y (Q’(y,x) } Les deux requêtes sont généralement corrélées (x est une variable dans Q') : P dans la requête interne Q’ exprime une jointure entre les tables de Q’ et les tables de la requête externe Q. Expression “EXISTS” Q Q’
SQL query - 11
SQL query - 12 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SQL : interrogation de BD Requêtes d'interrogation simples Requêtes complexes SQL et le calcul relationnel Agrégats et groupement Couplage SQL et langage de programmation
SQL query - 13 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Calcul relationnel et SQL Requête SQL de base: SELECTr i.A o, …, r j.A p FROM R 1 r 1, R i r i, …, R j r j, …, R k r k WHEREP(r 1, r 2, …, r k ) Calcul relationnel : { (r i.A o,…, r j.A p ) | r l,..., r k (R 1 r 1 R i (r i ) R k r k P(r 1,..., r k ) ) } Rappel: SQL (sans fonctions d’agrégation et de groupement) est équivalent au calcul relationnel sain (et à l’algèbre relationnel).
SQL query - 14
SQL query - 15 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Calcul relationnel et SQL Convertir en SQL Règle de base: un niveau d'imbrication pour chaque “¬ ” La requête SQL correspondante est: SELECT* FROMEmp e WHERE NOT EXISTS (SELECT* FROM Project p WHERE NOT EXISTS (SELECT* FROMWorks w WHEREp.Pno=w.Pno ANDe.Eno = w.Eno))
SQL query - 16 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SQL : interrogation de BD Requêtes d'interrogation simples Requêtes complexes SQL et le calcul relationnel Agrégats et groupement Couplage SQL et langage de programmation
SQL query - 17 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Fonction d'agrégation : calculer une seule valeur numérique à partir d'un ensemble de n-uplets : COUNT : nombre de valeurs / n-uplets SUM : somme des valeurs MAX : valeur maximale MIN : valeur minimale AVG : moyenne des valeurs SELECTAggFunc(A i ), …, AggFunc(A j ) FROMR 1,..., R m WHEREP SQL : Fonctions d'agrégation
SQL query - 18
SQL query - 19
SQL query - 20 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Requêtes de groupement : GROUP BY Pour partitionner les n-uplets résultats en fonction des valeurs de certains attributs : SELECTA i, …, A n, aggr1, aggr2, … FROMR 1, …, R m WHEREP GROUP BY A j …, A k Règle: tous les attributs projetés ( A i, …, A n ) dans la clause SELECT qui ne sont pas impliqués dans une opération d'agrégation doivent être inclus dans l'ensemble des attributs ( A j …, A k ) de la clause GROUP BY (qui peut avoir d’autres attributs en plus)
SQL query - 21 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) GROUP BY SELECTA1, B1, sum(A2) FROMR 1, R 2 WHEREA1 < 3 GROUP BY A1, B1 R1 A1 A2 R2 B1 A1 A2 B1 A1 A2 B1 group by from where A1 B1 sum(A2) select A1 B1 A2* a a a a a a a a a a a a a a a
SQL query - 22
SQL query - 23 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Predicats sur des groupes Pour garder les groupes (partitions) qui satisfont une certaine condition : SELECTA i, …, A n FROMR 1, …, R m WHEREP GROUP BY A j …, A k HAVINGQ Règle : La condition Q porte généralement sur des valeurs atomiques retournées par un opérateur d'agrégation sur les attributs qui n’apparaissent pas dans le GROUP BY
SQL query - 24
SQL query - 25 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) SQL : interrogation de BD Requêtes d'interrogation simples Requêtes complexes SQL et le calcul relationnel Agrégats et groupement Couplage SQL et langage de programmation
SQL query - 26 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Couplage SQL–langage de programmation (Embedded SQL) Permet d'accéder une BD depuis un programme d'application SQL n'est pas suffisant pour écrire des applications générales (SQL n’est pas Turing complet) SQL a des liaisons (bindings) pour différents langages de programmation C, C++, Java, PHP, etc. les liaisons décrivent la façon dont des applications écrites dans ces langages hôtes peuvent interagir avec un SGBD relationnel
SQL query - 27 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Développement d'application Programme source avec SQL « embedded » Préprocesseur Programme source Compilateur Fichiers objets Edition de liens Exécutable Bibliothèques (fcts. SQL,...) Autres fichiers objets et bibs
SQL query - 28 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Utilisation de Embedded SQL Interface = commandes « EXEC SQL » Notion de variable partagée entre SQL et le langage hôte (C, PHP, Java,..) pour : Passer des valeurs aux requêtes avant leur évaluation (par exemple nom d'une personne lu par le programme,...) Accéder les résultats des requêtes dans le programme (par exemple afficher le résultat)
SQL query - 29 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Requête produisant un seul n-uplet Si la requête retourne toujours un seul n-uplet, chaque attribut dans la clause SELECT nécessite une variable partagée. Exemple : retrouver le salaire pour un titre donné : … EXEC SQL BEGIN DECLARE SECTION; char title[15]; /* entré par l'utilisateur */ real sal; /* salary */ EXEC SQL END DECLARE SECTION; … /* Code non SQL (omis) pour obtenir title */ EXEC SQL SELECT Salary INTO :sal FROM Pay WHERE Title = :title; /* Code (omis) pour imprimer le résultat */ …
SQL query - 30 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Curseurs Si la requête retourne un ensemble de n-uplets, il faut utiliser un curseur qui permet d’accéder successivement aux n-uplets du résultat de la requête SQL: déclarer (declare) le curseur : associe un identificateur de curseur avec une requête SQL ouvrir (open) le curseur : exécution de la requête et génération du résultat (vue logique) positionner le curseur avant le premier n-uplet récupérer (fetch) un n-uplet : avancer le curseur (boucle) affecter des variables avec les valeurs du n-uplet pointé par le curseur fermer (close) le curseur.
SQL query - 31 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Exemple de curseur Pour chaque projet employant plus de 2 programmeurs, donner le numéro de projet et la durée moyenne d'affectation des programmeurs … EXEC SQL BEGIN DECLARE SECTION; char pno[3]; /* project number */ real avg-dur; /* average duration */ EXEC SQL END DECLARE SECTION; … EXEC SQL DECLARE duration CURSOR FOR SELECTPno, AVG(Dur) FROMWorks WHEREResp = ‘Programmer’ GROUP BY Pno HAVINGCOUNT(*) > 2; … EXEC SQL OPEN duration; … while(1) { EXEC SQL FETCH FROM duration INTO :pno, :avg-dur if(strcmp(SQLSTATE, “02000”) then break else } EXEC SQL CLOSE duration …
SQL query - 32 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) PL/SQL d’Oracle PL/SQL : langage de programmation procédural intégrant SQL. Bloc PL/SQL : regroupement logique de déclarations et d’ordres. declare sal number; begin SELECTSALARY INTO sal FROMPAY WHERETITLE = ‘Programmer’; if sal>10 then UPDATE PAY SET SALARY = SALARY * 1.1 WHERETITLE = ‘Programmer’; end if; COMMIT; exception when no_data_found then INSERT INTO ERROR values (‘TITLE inexistant’);
SQL query - 33 UPMC - UFR 919 Ingéniérie - Cours Bases de données (BD-L3) Traitement de PL/SQL Bloc PL/SQL Exécution Analyse Moteur PL/SQL Serveur Oracle